From 8a04392bfc39ae107f800ec9addfa8834c4ea5d4 Mon Sep 17 00:00:00 2001 From: davigonz Date: Thu, 30 Aug 2018 13:31:53 +0200 Subject: [PATCH] Fix follow redirections --- .../android/lib/common/OwnCloudClient.java | 10 +++---- .../common/http/methods/HttpBaseMethod.java | 16 +++++------ .../common/http/methods/webdav/DavMethod.java | 27 ++++++++++--------- .../files/ExistenceCheckRemoteOperation.java | 13 +++++++-- .../status/GetRemoteStatusOperation.java | 8 +++--- 5 files changed, 43 insertions(+), 31 deletions(-) diff --git a/src/com/owncloud/android/lib/common/OwnCloudClient.java b/src/com/owncloud/android/lib/common/OwnCloudClient.java index 2d4c79ba..79d5f4d7 100644 --- a/src/com/owncloud/android/lib/common/OwnCloudClient.java +++ b/src/com/owncloud/android/lib/common/OwnCloudClient.java @@ -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; } /** diff --git a/src/com/owncloud/android/lib/common/http/methods/HttpBaseMethod.java b/src/com/owncloud/android/lib/common/http/methods/HttpBaseMethod.java index 08ee472b..cbb44a64 100644 --- a/src/com/owncloud/android/lib/common/http/methods/HttpBaseMethod.java +++ b/src/com/owncloud/android/lib/common/http/methods/HttpBaseMethod.java @@ -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() { diff --git a/src/com/owncloud/android/lib/common/http/methods/webdav/DavMethod.java b/src/com/owncloud/android/lib/common/http/methods/webdav/DavMethod.java index d9797bf6..d37c2337 100644 --- a/src/com/owncloud/android/lib/common/http/methods/webdav/DavMethod.java +++ b/src/com/owncloud/android/lib/common/http/methods/webdav/DavMethod.java @@ -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()); - } } \ No newline at end of file diff --git a/src/com/owncloud/android/lib/resources/files/ExistenceCheckRemoteOperation.java b/src/com/owncloud/android/lib/resources/files/ExistenceCheckRemoteOperation.java index b62eb47b..3de48b46 100644 --- a/src/com/owncloud/android/lib/resources/files/ExistenceCheckRemoteOperation.java +++ b/src/com/owncloud/android/lib/resources/files/ExistenceCheckRemoteOperation.java @@ -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); } } diff --git a/src/com/owncloud/android/lib/resources/status/GetRemoteStatusOperation.java b/src/com/owncloud/android/lib/resources/status/GetRemoteStatusOperation.java index 68728c3e..9896eb44 100644 --- a/src/com/owncloud/android/lib/resources/status/GetRemoteStatusOperation.java +++ b/src/com/owncloud/android/lib/resources/status/GetRemoteStatusOperation.java @@ -83,17 +83,19 @@ public class GetRemoteStatusOperation extends RemoteOperation { 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()) {