From 5ca99a0e69ffeca698b172ba5bd9253ea164ae10 Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Thu, 16 Sep 2021 14:20:57 +0200 Subject: [PATCH] update base url in active client after 301 redirect reduce validation retry count --- .../android/lib/common/ConnectionValidator.kt | 6 +++++- .../android/lib/common/OwnCloudClient.java | 15 +++++++++++++-- .../lib/common/http/methods/HttpBaseMethod.kt | 15 +++++++++++++++ .../status/GetRemoteStatusOperation.kt | 18 +++++++----------- .../lib/resources/status/StatusRequester.kt | 4 +++- 5 files changed, 43 insertions(+), 15 deletions(-) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/ConnectionValidator.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/ConnectionValidator.kt index 492a0096..3341531e 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/ConnectionValidator.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/ConnectionValidator.kt @@ -32,7 +32,7 @@ class ConnectionValidator ( client.account = baseClient.account client.credentials = baseClient.credentials - while (validationRetryCount < 5) { + while (validationRetryCount < VALIDATION_RETRY_COUNT) { Timber.d("+++++++++++++++++++++++++++++++++++++ validationRetryCout %d", validationRetryCount) var successCounter = 0 var failCounter = 0 @@ -180,4 +180,8 @@ class ConnectionValidator ( } return credentialsWereRefreshed } + + companion object { + val VALIDATION_RETRY_COUNT = 3 + } } \ No newline at end of file diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/OwnCloudClient.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/OwnCloudClient.java index 65e2dada..54dddbae 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/OwnCloudClient.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/OwnCloudClient.java @@ -48,6 +48,7 @@ import java.io.InputStream; import java.util.List; import static com.owncloud.android.lib.common.http.HttpConstants.AUTHORIZATION_HEADER; +import static com.owncloud.android.lib.common.http.HttpConstants.HTTP_MOVED_PERMANENTLY; import static com.owncloud.android.lib.common.http.HttpConstants.OC_X_REQUEST_ID; public class OwnCloudClient extends HttpClient { @@ -77,7 +78,10 @@ public class OwnCloudClient extends HttpClient { private boolean mFollowRedirects = false; - public OwnCloudClient(Uri baseUri, ConnectionValidator connectionValidator, boolean synchronizeRequests, SingleSessionManager singleSessionManager) { + public OwnCloudClient(Uri baseUri, + ConnectionValidator connectionValidator, + boolean synchronizeRequests, + SingleSessionManager singleSessionManager) { if (baseUri == null) { throw new IllegalArgumentException("Parameter 'baseUri' cannot be NULL"); } @@ -113,6 +117,10 @@ public class OwnCloudClient extends HttpClient { int repeatCounter = 0; int status; + if(mFollowRedirects) { + method.setFollowRedirects(true); + } + boolean retry; do { repeatCounter++; @@ -128,16 +136,19 @@ public class OwnCloudClient extends HttpClient { method.setRequestHeader(AUTHORIZATION_HEADER, mCredentials.getHeaderAuth()); } - method.setFollowRedirects(mFollowRedirects); status = method.execute(); stacklog(status, method); if (!mFollowRedirects && + !method.getFollowRedirects() && mConnectionValidator != null && (status == HttpConstants.HTTP_MOVED_TEMPORARILY || (!(mCredentials instanceof OwnCloudAnonymousCredentials) && status == HttpConstants.HTTP_UNAUTHORIZED))) { retry = mConnectionValidator.validate(this, mSingleSessionManager); // retry on success fail on no success + } else if(method.getFollowPermanentRedirects() && status == HTTP_MOVED_PERMANENTLY) { + retry = true; + method.setFollowRedirects(true); } } while (retry && repeatCounter < MAX_RETRY_COUNT); diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/methods/HttpBaseMethod.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/methods/HttpBaseMethod.kt index 5b1f1ab5..bc8fe1ce 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/methods/HttpBaseMethod.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/methods/HttpBaseMethod.kt @@ -41,6 +41,7 @@ abstract class HttpBaseMethod constructor(url: URL) { var okHttpClient: OkHttpClient var httpUrl: HttpUrl = url.toHttpUrlOrNull() ?: throw MalformedURLException() var request: Request + private var _followPermanentRedirects = false abstract var response: Response var call: Call? = null @@ -123,6 +124,11 @@ abstract class HttpBaseMethod constructor(url: URL) { return response.body?.byteStream() } + /** + * returns the final url after following the last redirect. + */ + open fun getFinalUrl() = response.request.url + /************************* *** Connection Params *** *************************/ @@ -158,6 +164,15 @@ abstract class HttpBaseMethod constructor(url: URL) { .build() } + open fun getFollowRedirects() = okHttpClient.followRedirects + + open fun setFollPermanentRedirects(followRedirects: Boolean) { + _followPermanentRedirects = followRedirects + } + + open fun getFollowPermanentRedirects() = _followPermanentRedirects + + /************ *** Call *** ************/ diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/GetRemoteStatusOperation.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/GetRemoteStatusOperation.kt index 21f02da0..38f8af82 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/GetRemoteStatusOperation.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/GetRemoteStatusOperation.kt @@ -48,17 +48,11 @@ class GetRemoteStatusOperation : RemoteOperation() { if(!usesHttpOrHttps(client.baseUri)) { client.baseUri = buildFullHttpsUrl(client.baseUri) } + return tryToConnect(client) + } - var result = tryToConnect(client) - /* - if (!(result.code == ResultCode.OK || result.code == ResultCode.OK_SSL) && !result.isSslRecoverableException) { - Timber.d("Establishing secure connection failed, trying non secure connection") - client.baseUri = client.baseUri.buildUpon().scheme(HTTP_SCHEME).build() - result = tryToConnect(client) - } - */ - - return result + private fun updateClientBaseUrl(client:OwnCloudClient, newBaseUrl:String) { + client.baseUri = Uri.parse(newBaseUrl) } private fun tryToConnect(client: OwnCloudClient): RemoteOperationResult { @@ -66,7 +60,9 @@ class GetRemoteStatusOperation : RemoteOperation() { return try { val requester = StatusRequester() val requestResult = requester.request(baseUrl, client) - requester.handleRequestResult(requestResult, baseUrl) + val result = requester.handleRequestResult(requestResult, baseUrl) + updateClientBaseUrl(client, result.data.baseUrl) + return result } catch (e: JSONException) { RemoteOperationResult(ResultCode.INSTANCE_NOT_CONFIGURED) } catch (e: Exception) { diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/StatusRequester.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/StatusRequester.kt index e1fdb441..b201a937 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/StatusRequester.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/StatusRequester.kt @@ -83,8 +83,10 @@ internal class StatusRequester { var status: Int val getMethod = getGetMethod(currentLocation) + getMethod.setFollPermanentRedirects(true) status = client.executeHttpMethod(getMethod) - return RequestResult(getMethod, status, redirectedToUnsecureLocation, currentLocation) + + return RequestResult(getMethod, status, redirectedToUnsecureLocation, getMethod.getFinalUrl().toString()) } private fun Int.isSuccess() = this == HttpConstants.HTTP_OK