mirror of
https://github.com/owncloud/android-library.git
synced 2025-06-07 16:06:08 +00:00
Fix follow redirections
This commit is contained in:
parent
f3eb0c4431
commit
8a04392bfc
@ -178,7 +178,7 @@ public class OwnCloudClient extends HttpClient {
|
||||
public RedirectionPath followRedirection(HttpBaseMethod method) throws Exception {
|
||||
int redirectionsCount = 0;
|
||||
int status = method.getStatusCode();
|
||||
RedirectionPath result = new RedirectionPath(status, MAX_REDIRECTIONS_COUNT);
|
||||
RedirectionPath redirectionPath = new RedirectionPath(status, MAX_REDIRECTIONS_COUNT);
|
||||
|
||||
while (redirectionsCount < MAX_REDIRECTIONS_COUNT &&
|
||||
(status == HttpConstants.HTTP_MOVED_PERMANENTLY ||
|
||||
@ -189,12 +189,12 @@ public class OwnCloudClient extends HttpClient {
|
||||
final String location = method.getResponseHeader(HttpConstants.LOCATION_HEADER) != null
|
||||
? method.getResponseHeader(HttpConstants.LOCATION_HEADER)
|
||||
: method.getResponseHeader(HttpConstants.LOCATION_HEADER_LOWER);
|
||||
if (location != null) {
|
||||
|
||||
if (location != null) {
|
||||
Log_OC.d(TAG + " #" + mInstanceNumber,
|
||||
"Location to redirect: " + location);
|
||||
|
||||
result.addLocation(location);
|
||||
redirectionPath.addLocation(location);
|
||||
|
||||
// Release the connection to avoid reach the max number of connections per host
|
||||
// due to it will be set a different url
|
||||
@ -221,7 +221,7 @@ public class OwnCloudClient extends HttpClient {
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
result.addStatus(status);
|
||||
redirectionPath.addStatus(status);
|
||||
redirectionsCount++;
|
||||
|
||||
} else {
|
||||
@ -229,7 +229,7 @@ public class OwnCloudClient extends HttpClient {
|
||||
status = HttpConstants.HTTP_NOT_FOUND;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
return redirectionPath;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -52,11 +52,9 @@ public abstract class HttpBaseMethod {
|
||||
protected RequestBody mRequestBody;
|
||||
protected Response mResponse;
|
||||
protected Call mCall;
|
||||
protected URL mUrl;
|
||||
|
||||
protected HttpBaseMethod(URL url) {
|
||||
mOkHttpClient = HttpClient.getOkHttpClient();
|
||||
mUrl = url;
|
||||
mRequest = new Request.Builder()
|
||||
.url(HttpUrl.parse(url.toString()))
|
||||
.build();
|
||||
@ -94,10 +92,6 @@ public abstract class HttpBaseMethod {
|
||||
return mRequest.header(name);
|
||||
}
|
||||
|
||||
public HttpUrl getUrl() {
|
||||
return mRequest.url();
|
||||
}
|
||||
|
||||
// Response
|
||||
|
||||
public int getStatusCode() {
|
||||
@ -109,11 +103,17 @@ public abstract class HttpBaseMethod {
|
||||
}
|
||||
|
||||
public String getResponseBodyAsString() throws IOException {
|
||||
return mResponse.body().string();
|
||||
if (mResponse.body() != null) {
|
||||
return mResponse.body().string();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public InputStream getResponseBodyAsStream() {
|
||||
return mResponse.body().byteStream();
|
||||
if (mResponse.body() != null) {
|
||||
return mResponse.body().byteStream();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public Headers getResponseHeaders() {
|
||||
|
@ -51,7 +51,7 @@ public abstract class DavMethod extends HttpBaseMethod {
|
||||
super(url);
|
||||
mDavResource = new DavOCResource(
|
||||
mOkHttpClient,
|
||||
HttpUrl.parse(mUrl.toString()),
|
||||
HttpUrl.parse(url.toString()),
|
||||
Constants.INSTANCE.getLog());
|
||||
}
|
||||
|
||||
@ -102,7 +102,7 @@ public abstract class DavMethod extends HttpBaseMethod {
|
||||
super.setReadTimeout(readTimeout, timeUnit);
|
||||
mDavResource = new DavOCResource(
|
||||
mOkHttpClient,
|
||||
HttpUrl.parse(mUrl.toString()),
|
||||
HttpUrl.parse(mRequest.url().toString()),
|
||||
Constants.INSTANCE.getLog());
|
||||
}
|
||||
|
||||
@ -111,7 +111,7 @@ public abstract class DavMethod extends HttpBaseMethod {
|
||||
super.setConnectionTimeout(connectionTimeout, timeUnit);
|
||||
mDavResource = new DavOCResource(
|
||||
mOkHttpClient,
|
||||
HttpUrl.parse(mUrl.toString()),
|
||||
HttpUrl.parse(mRequest.url().toString()),
|
||||
Constants.INSTANCE.getLog());
|
||||
}
|
||||
|
||||
@ -120,7 +120,7 @@ public abstract class DavMethod extends HttpBaseMethod {
|
||||
super.setFollowRedirects(followRedirects);
|
||||
mDavResource = new DavOCResource(
|
||||
mOkHttpClient,
|
||||
HttpUrl.parse(mUrl.toString()),
|
||||
HttpUrl.parse(mRequest.url().toString()),
|
||||
Constants.INSTANCE.getLog());
|
||||
}
|
||||
|
||||
@ -129,7 +129,16 @@ public abstract class DavMethod extends HttpBaseMethod {
|
||||
super.setRetryOnConnectionFailure(retryOnConnectionFailure);
|
||||
mDavResource = new DavOCResource(
|
||||
mOkHttpClient,
|
||||
HttpUrl.parse(mUrl.toString()),
|
||||
HttpUrl.parse(mRequest.url().toString()),
|
||||
Constants.INSTANCE.getLog());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setUrl(HttpUrl url){
|
||||
super.setUrl(url);
|
||||
mDavResource = new DavOCResource(
|
||||
mOkHttpClient,
|
||||
HttpUrl.parse(mRequest.url().toString()),
|
||||
Constants.INSTANCE.getLog());
|
||||
}
|
||||
|
||||
@ -146,12 +155,4 @@ public abstract class DavMethod extends HttpBaseMethod {
|
||||
public boolean isAborted() {
|
||||
return mDavResource.isCallAborted();
|
||||
}
|
||||
|
||||
public void setUrl(URL url) {
|
||||
mUrl = url;
|
||||
mDavResource = new DavOCResource(
|
||||
mOkHttpClient,
|
||||
HttpUrl.parse(mUrl.toString()),
|
||||
Constants.INSTANCE.getLog());
|
||||
}
|
||||
}
|
@ -77,8 +77,9 @@ public class ExistenceCheckRemoteOperation extends RemoteOperation {
|
||||
@Override
|
||||
protected RemoteOperationResult run(OwnCloudClient client) {
|
||||
|
||||
boolean previousFollowRedirects = client.followRedirects();
|
||||
|
||||
try {
|
||||
client.setFollowRedirects(true);
|
||||
PropfindMethod propfindMethod = new PropfindMethod(
|
||||
new URL(client.getNewFilesWebDavUri() + WebdavUtils.encodePath(mPath)),
|
||||
0,
|
||||
@ -87,7 +88,13 @@ public class ExistenceCheckRemoteOperation extends RemoteOperation {
|
||||
propfindMethod.setReadTimeout(TIMEOUT, TimeUnit.SECONDS);
|
||||
propfindMethod.setConnectionTimeout(TIMEOUT, TimeUnit.SECONDS);
|
||||
|
||||
final int status = client.executeHttpMethod(propfindMethod);
|
||||
client.setFollowRedirects(false);
|
||||
int status = client.executeHttpMethod(propfindMethod);
|
||||
|
||||
if (previousFollowRedirects) {
|
||||
mRedirectionPath = client.followRedirection(propfindMethod);
|
||||
status = mRedirectionPath.getLastStatus();
|
||||
}
|
||||
|
||||
/**
|
||||
* PROPFIND method
|
||||
@ -111,6 +118,8 @@ public class ExistenceCheckRemoteOperation extends RemoteOperation {
|
||||
(mSuccessIfAbsent ? " absence " : " existence ") + ": " +
|
||||
result.getLogMessage(), result.getException());
|
||||
return result;
|
||||
} finally {
|
||||
client.setFollowRedirects(previousFollowRedirects);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -83,17 +83,19 @@ public class GetRemoteStatusOperation extends RemoteOperation<OwnCloudVersion> {
|
||||
getMethod.setReadTimeout(TRY_CONNECTION_TIMEOUT, TimeUnit.SECONDS);
|
||||
getMethod.setConnectionTimeout(TRY_CONNECTION_TIMEOUT, TimeUnit.SECONDS);
|
||||
|
||||
client.setFollowRedirects(false);
|
||||
boolean isRedirectToNonSecureConnection = false;
|
||||
int status;
|
||||
try {
|
||||
status = client.executeHttpMethod(getMethod);
|
||||
mLatestResult = new RemoteOperationResult(OK);
|
||||
mLatestResult = isSuccess(status)
|
||||
? new RemoteOperationResult<>(OK)
|
||||
: new RemoteOperationResult<>(getMethod);
|
||||
} catch (SSLException sslE) {
|
||||
mLatestResult = new RemoteOperationResult(sslE);
|
||||
return false;
|
||||
}
|
||||
|
||||
client.setFollowRedirects(false);
|
||||
boolean isRedirectToNonSecureConnection = false;
|
||||
String redirectedLocation = mLatestResult.getRedirectedLocation();
|
||||
while (redirectedLocation != null && redirectedLocation.length() > 0
|
||||
&& !mLatestResult.isSuccess()) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user