From 04160d933a21792348eadf1df60ce06d950fa8f3 Mon Sep 17 00:00:00 2001 From: Saeed Rezaei Date: Fri, 25 Oct 2019 14:15:37 +0330 Subject: [PATCH 1/8] Add redirect strategy (#1326) * add RedirectStrategy variable * add setRedirectStrategy method --- .../com/loopj/android/http/AsyncHttpClient.java | 13 +++++++++++++ .../android/http/DefaultHttpClientProvider.java | 11 ++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/library/src/main/java/com/loopj/android/http/AsyncHttpClient.java b/library/src/main/java/com/loopj/android/http/AsyncHttpClient.java index fdd6af02d..0fceae8ef 100755 --- a/library/src/main/java/com/loopj/android/http/AsyncHttpClient.java +++ b/library/src/main/java/com/loopj/android/http/AsyncHttpClient.java @@ -47,6 +47,7 @@ import cz.msebera.android.httpclient.auth.AuthScope; import cz.msebera.android.httpclient.auth.Credentials; import cz.msebera.android.httpclient.client.CookieStore; +import cz.msebera.android.httpclient.client.RedirectStrategy; import cz.msebera.android.httpclient.client.methods.HttpUriRequest; import cz.msebera.android.httpclient.config.Registry; import cz.msebera.android.httpclient.conn.HttpClientConnectionManager; @@ -348,6 +349,18 @@ public void setCookieStore(CookieStore cookieStore) { } } + /** + * Sets an optional RedirectStrategy to use when making requests + * + * @param redirectStrategy The RedirectStrategy implementation to use, usually an instance of {@link + * RedirectStrategy} + */ + public void setRedirectStrategy(RedirectStrategy redirectStrategy){ + if (getHttpClientProvider() instanceof DefaultHttpClientProvider) { + ((DefaultHttpClientProvider) getHttpClientProvider()).setRedirectStrategy(redirectStrategy); + } + } + /** * @deprecated */ diff --git a/library/src/main/java/com/loopj/android/http/DefaultHttpClientProvider.java b/library/src/main/java/com/loopj/android/http/DefaultHttpClientProvider.java index e33769511..5807c2764 100644 --- a/library/src/main/java/com/loopj/android/http/DefaultHttpClientProvider.java +++ b/library/src/main/java/com/loopj/android/http/DefaultHttpClientProvider.java @@ -25,6 +25,7 @@ import cz.msebera.android.httpclient.client.CookieStore; import cz.msebera.android.httpclient.client.CredentialsProvider; import cz.msebera.android.httpclient.client.HttpRequestRetryHandler; +import cz.msebera.android.httpclient.client.RedirectStrategy; import cz.msebera.android.httpclient.client.config.RequestConfig; import cz.msebera.android.httpclient.conn.HttpClientConnectionManager; import cz.msebera.android.httpclient.impl.client.BasicCredentialsProvider; @@ -41,6 +42,7 @@ public class DefaultHttpClientProvider implements HttpClientProviderInterface { protected final Collection commonHeaders = new ArrayList
(); protected HttpRequestRetryHandler retryHandler; protected boolean enableRedirects = false, enableRelativeRedirects = false, enableCircularRedirects = false; + protected RedirectStrategy redirectStrategy; public DefaultHttpClientProvider() { } @@ -71,7 +73,8 @@ public final CloseableHttpClient provide() { .setDefaultHeaders(getHeaders()) .setDefaultCredentialsProvider(getCredentialsProvider()) .setRetryHandler(getRetryHandler()) - .setDefaultCookieStore(getCookieStore()); + .setDefaultCookieStore(getCookieStore()) + .setRedirectStrategy(getRedirectStrategy()); RequestConfig requestConfig = RequestConfig.custom().setCircularRedirectsAllowed(enableCircularRedirects).setRelativeRedirectsAllowed(enableRelativeRedirects).setRedirectsEnabled(enableRedirects).build(); builder.setDefaultRequestConfig(requestConfig); @@ -111,5 +114,11 @@ public CredentialsProvider getCredentialsProvider() { return credentialsProvider; } + public RedirectStrategy getRedirectStrategy() { + return redirectStrategy; + } + public void setRedirectStrategy(RedirectStrategy redirectStrategy) { + this.redirectStrategy = redirectStrategy; + } } From 6a59eee482479422d6a6917a55b379b8153c683d Mon Sep 17 00:00:00 2001 From: Saeed Rezaei Date: Mon, 20 Apr 2020 08:46:55 -0700 Subject: [PATCH 2/8] add HttpEntityFactory (#1333) --- .../loopj/android/http/HttpEntityFactory.java | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 library/src/main/java/com/loopj/android/http/HttpEntityFactory.java diff --git a/library/src/main/java/com/loopj/android/http/HttpEntityFactory.java b/library/src/main/java/com/loopj/android/http/HttpEntityFactory.java new file mode 100644 index 000000000..51790b1cc --- /dev/null +++ b/library/src/main/java/com/loopj/android/http/HttpEntityFactory.java @@ -0,0 +1,66 @@ +package com.loopj.android.http; + +import com.loopj.android.http.interfaces.RequestParamInterface; +import com.loopj.android.http.interfaces.RequestParamsInterface; + +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import cz.msebera.android.httpclient.HttpEntity; +import cz.msebera.android.httpclient.NameValuePair; +import cz.msebera.android.httpclient.client.entity.EntityBuilder; +import cz.msebera.android.httpclient.client.entity.UrlEncodedFormEntity; +import cz.msebera.android.httpclient.message.BasicNameValuePair; +import cz.msebera.android.httpclient.util.EntityUtils; + +public class HttpEntityFactory { + + /** + * convert and mix @RequestParams and @HttpEntity into one @HttpEntity + * @param requestParams + * @param httpEntity + * @return + */ + public static HttpEntity getHttpEntity(RequestParams requestParams, HttpEntity httpEntity) { + List pairs = new ArrayList<>(); + for (Map.Entry param : requestParams.getParams()) { + pairs.add(new BasicNameValuePair(param.getKey(), param.getValue().getValue())); + } + + String sEntity = ""; + try { + sEntity = EntityUtils.toString(httpEntity); + sEntity = sEntity.concat(EntityUtils.toString(new UrlEncodedFormEntity(pairs))); + } catch (IOException e) { + e.printStackTrace(); + } + + try { + return EntityBuilder.create().setText(sEntity).build(); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * get @UrlEncodedFormEntity from @RequestParams object + * @param params + * @return + */ + public static HttpEntity getFormEntity(RequestParamsInterface params) { + List pairs = new ArrayList(); + for (Map.Entry param : params.getParams()) { + pairs.add(new BasicNameValuePair(param.getKey(), param.getValue().getValue())); + } + try { + return new UrlEncodedFormEntity(pairs); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + return null; + } +} From 78c8b5dada1ce1a5f43dd3a474b871cbc17b6be9 Mon Sep 17 00:00:00 2001 From: Saeedrz Date: Tue, 28 Apr 2020 08:06:16 -0700 Subject: [PATCH 3/8] deprecate FormEntityFactory --- .../src/main/java/com/loopj/android/http/RequestParams.java | 3 +-- .../com/loopj/android/http/entities/FormEntityFactory.java | 3 +++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/library/src/main/java/com/loopj/android/http/RequestParams.java b/library/src/main/java/com/loopj/android/http/RequestParams.java index 537828d8c..d09e6ce2d 100755 --- a/library/src/main/java/com/loopj/android/http/RequestParams.java +++ b/library/src/main/java/com/loopj/android/http/RequestParams.java @@ -18,7 +18,6 @@ package com.loopj.android.http; -import com.loopj.android.http.entities.FormEntityFactory; import com.loopj.android.http.interfaces.RequestParamInterface; import com.loopj.android.http.interfaces.RequestParamsInterface; import com.loopj.android.http.interfaces.ResponseHandlerInterface; @@ -169,7 +168,7 @@ public HttpEntity getEntity(ResponseHandlerInterface handlerInterface) { if (useJsonStreamer) { } else if (!hasFiles() && !hasStreams()) { - return FormEntityFactory.getFormEntity(this); + return HttpEntityFactory.getFormEntity(this); } return null; } diff --git a/library/src/main/java/com/loopj/android/http/entities/FormEntityFactory.java b/library/src/main/java/com/loopj/android/http/entities/FormEntityFactory.java index 6965276b7..2e10a53c4 100644 --- a/library/src/main/java/com/loopj/android/http/entities/FormEntityFactory.java +++ b/library/src/main/java/com/loopj/android/http/entities/FormEntityFactory.java @@ -13,6 +13,9 @@ import cz.msebera.android.httpclient.client.entity.UrlEncodedFormEntity; import cz.msebera.android.httpclient.message.BasicNameValuePair; +/** + * @deprecated + */ public class FormEntityFactory { public static HttpEntity getFormEntity(RequestParamsInterface params) { From e5de9e58a39c9a92c5edd9935c00ae0308898d8c Mon Sep 17 00:00:00 2001 From: Saeed Rezaei Date: Sun, 24 May 2020 02:17:36 -0700 Subject: [PATCH 4/8] replace old redirect method with new RedirectStrategy (#1335) --- .../loopj/android/http/AsyncHttpClient.java | 21 +++++++++++++------ .../http/DefaultHttpClientProvider.java | 18 +++++++++++++--- 2 files changed, 30 insertions(+), 9 deletions(-) diff --git a/library/src/main/java/com/loopj/android/http/AsyncHttpClient.java b/library/src/main/java/com/loopj/android/http/AsyncHttpClient.java index 0fceae8ef..4c803adc6 100755 --- a/library/src/main/java/com/loopj/android/http/AsyncHttpClient.java +++ b/library/src/main/java/com/loopj/android/http/AsyncHttpClient.java @@ -310,10 +310,7 @@ public RequestHandle delete(Context context, String url, Header[] headers, Reque * @deprecated */ public void setEnableRedirects(final boolean enableRedirects, final boolean enableRelativeRedirects, final boolean enableCircularRedirects) throws IllegalAccessException { - if (getHttpClientProvider() instanceof DefaultHttpClientProvider) { - ((DefaultHttpClientProvider) getHttpClientProvider()).setEnableRedirects(enableRedirects, enableRelativeRedirects, enableCircularRedirects); - } - throw new IllegalAccessException("This method shall not be used with non-default credentials provider set"); + setEnableRedirectStrategy(enableRedirects); } /** @@ -325,7 +322,7 @@ public void setEnableRedirects(final boolean enableRedirects, final boolean enab * @deprecated */ public void setEnableRedirects(final boolean enableRedirects, final boolean enableRelativeRedirects) throws IllegalAccessException { - setEnableRedirects(enableRedirects, enableRelativeRedirects, true); + setEnableRedirectStrategy(enableRedirects); } /** @@ -334,7 +331,7 @@ public void setEnableRedirects(final boolean enableRedirects, final boolean enab * @deprecated */ public void setEnableRedirects(final boolean enableRedirects) throws IllegalAccessException { - setEnableRedirects(enableRedirects, enableRedirects, enableRedirects); + setEnableRedirectStrategy(enableRedirects); } /** @@ -358,6 +355,18 @@ public void setCookieStore(CookieStore cookieStore) { public void setRedirectStrategy(RedirectStrategy redirectStrategy){ if (getHttpClientProvider() instanceof DefaultHttpClientProvider) { ((DefaultHttpClientProvider) getHttpClientProvider()).setRedirectStrategy(redirectStrategy); + setEnableRedirectStrategy(true); + } + } + + /** + * Sets enable to use {@link RedirectStrategy} when making requests + * + * @param isEnable + */ + public void setEnableRedirectStrategy(boolean isEnable){ + if (getHttpClientProvider() instanceof DefaultHttpClientProvider) { + ((DefaultHttpClientProvider) getHttpClientProvider()).setEnableRedirectStrategy(isEnable); } } diff --git a/library/src/main/java/com/loopj/android/http/DefaultHttpClientProvider.java b/library/src/main/java/com/loopj/android/http/DefaultHttpClientProvider.java index 5807c2764..9450eaa91 100644 --- a/library/src/main/java/com/loopj/android/http/DefaultHttpClientProvider.java +++ b/library/src/main/java/com/loopj/android/http/DefaultHttpClientProvider.java @@ -43,6 +43,7 @@ public class DefaultHttpClientProvider implements HttpClientProviderInterface { protected HttpRequestRetryHandler retryHandler; protected boolean enableRedirects = false, enableRelativeRedirects = false, enableCircularRedirects = false; protected RedirectStrategy redirectStrategy; + protected boolean enableRedirectStrategy = false; public DefaultHttpClientProvider() { } @@ -76,8 +77,8 @@ public final CloseableHttpClient provide() { .setDefaultCookieStore(getCookieStore()) .setRedirectStrategy(getRedirectStrategy()); - RequestConfig requestConfig = RequestConfig.custom().setCircularRedirectsAllowed(enableCircularRedirects).setRelativeRedirectsAllowed(enableRelativeRedirects).setRedirectsEnabled(enableRedirects).build(); - builder.setDefaultRequestConfig(requestConfig); + if(!enableRedirectStrategy) + builder.disableRedirectHandling(); return builder.build(); } @@ -115,10 +116,21 @@ public CredentialsProvider getCredentialsProvider() { } public RedirectStrategy getRedirectStrategy() { - return redirectStrategy; + if(enableRedirectStrategy) + return redirectStrategy; + + return null; } public void setRedirectStrategy(RedirectStrategy redirectStrategy) { this.redirectStrategy = redirectStrategy; } + + public boolean isEnableRedirectStrategy() { + return enableRedirectStrategy; + } + + public void setEnableRedirectStrategy(boolean enableRedirectStrategy) { + this.enableRedirectStrategy = enableRedirectStrategy; + } } From 341215ed8c82826152b57b7535dc40f0b3165621 Mon Sep 17 00:00:00 2001 From: Saeed Rezaei Date: Tue, 16 Jun 2020 05:16:58 -0700 Subject: [PATCH 5/8] add redirect sample (#1336) --- sample/src/main/AndroidManifest.xml | 1 + .../android/http/sample/RedirectSample.java | 48 +++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 sample/src/main/java/com/loopj/android/http/sample/RedirectSample.java diff --git a/sample/src/main/AndroidManifest.xml b/sample/src/main/AndroidManifest.xml index 45adbf9de..046678404 100755 --- a/sample/src/main/AndroidManifest.xml +++ b/sample/src/main/AndroidManifest.xml @@ -30,6 +30,7 @@ + diff --git a/sample/src/main/java/com/loopj/android/http/sample/RedirectSample.java b/sample/src/main/java/com/loopj/android/http/sample/RedirectSample.java new file mode 100644 index 000000000..8229f7c11 --- /dev/null +++ b/sample/src/main/java/com/loopj/android/http/sample/RedirectSample.java @@ -0,0 +1,48 @@ +package com.loopj.android.http.sample; + +import com.loopj.android.http.AsyncHttpClient; +import com.loopj.android.http.RequestFactory; +import com.loopj.android.http.interfaces.ResponseHandlerInterface; +import com.loopj.android.http.utils.RequestHandle; + +import cz.msebera.android.httpclient.Header; +import cz.msebera.android.httpclient.HttpEntity; + +public class RedirectSample extends SampleParentActivity { + + @Override + public String getLogTag() { + return "RedirectSample"; + } + + @Override + public RequestHandle executeSample(AsyncHttpClient client, String URL, Header[] headers, HttpEntity entity, ResponseHandlerInterface responseHandler) { + client.setEnableRedirectStrategy(true); + return client.sendRequest(RequestFactory.get(URL, headers), responseHandler); + } + + @Override + public int getSampleTitle() { + return R.string.title_get_sample; + } + + @Override + public boolean isRequestBodyAllowed() { + return false; + } + + @Override + public boolean isRequestHeadersAllowed() { + return true; + } + + @Override + public String getDefaultURL() { + return PROTOCOL+"httpbin.org/status/301"; + } + + @Override + public ResponseHandlerInterface getResponseHandler() { + return defaultResponseHandler; + } +} From f38756488e337f62cba0c5832255685fcd44d039 Mon Sep 17 00:00:00 2001 From: Saeed Rezaei Date: Tue, 16 Jun 2020 06:12:30 -0700 Subject: [PATCH 6/8] Redirect sample (#1337) * add redirect sample * add redirect sample to WaypointsActivity * update java version to 1.8 --- library/build.gradle | 4 ++-- .../java/com/loopj/android/http/sample/WaypointsActivity.java | 3 ++- sample/src/main/res/values/strings.xml | 1 + 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/library/build.gradle b/library/build.gradle index f6b173a7b..a4b3d73c3 100755 --- a/library/build.gradle +++ b/library/build.gradle @@ -20,8 +20,8 @@ android { } compileOptions { - sourceCompatibility JavaVersion.VERSION_1_7 - targetCompatibility JavaVersion.VERSION_1_7 + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 } } diff --git a/sample/src/main/java/com/loopj/android/http/sample/WaypointsActivity.java b/sample/src/main/java/com/loopj/android/http/sample/WaypointsActivity.java index 02f8f3681..1004154d5 100755 --- a/sample/src/main/java/com/loopj/android/http/sample/WaypointsActivity.java +++ b/sample/src/main/java/com/loopj/android/http/sample/WaypointsActivity.java @@ -38,7 +38,8 @@ public class WaypointsActivity extends ListActivity { new SampleConfig(R.string.title_put_sample, PutSample.class), new SampleConfig(R.string.title_head_sample, HeadSample.class), new SampleConfig(R.string.title_options_sample, OptionsSample.class), - new SampleConfig(R.string.title_json_sample, JsonSample.class) + new SampleConfig(R.string.title_json_sample, JsonSample.class), + new SampleConfig(R.string.title_redirect_sample, RedirectSample.class) }; @Override diff --git a/sample/src/main/res/values/strings.xml b/sample/src/main/res/values/strings.xml index d44b388fb..4b2f7660e 100755 --- a/sample/src/main/res/values/strings.xml +++ b/sample/src/main/res/values/strings.xml @@ -52,4 +52,5 @@ Digest Authentication Use Pool Thread in Response Request Params debug + Redirect From ccd1f2594e7e99000d5b06d295c4983f47d1a22f Mon Sep 17 00:00:00 2001 From: Saeed Rezaei Date: Thu, 18 Jun 2020 05:08:52 -0700 Subject: [PATCH 7/8] add Conscrypt to support sni on older android version (#1338) --- library/build.gradle | 1 + .../loopj/android/http/AsyncHttpClient.java | 8 ++++++++ .../com/loopj/android/http/ConscryptSSL.java | 19 +++++++++++++++++++ 3 files changed, 28 insertions(+) create mode 100644 library/src/main/java/com/loopj/android/http/ConscryptSSL.java diff --git a/library/build.gradle b/library/build.gradle index a4b3d73c3..1ca0832e6 100755 --- a/library/build.gradle +++ b/library/build.gradle @@ -27,6 +27,7 @@ android { dependencies { api 'cz.msebera.android:httpclient:4.5.8' + compileOnly 'org.conscrypt:conscrypt-android:2.4.0' } project.afterEvaluate { project -> diff --git a/library/src/main/java/com/loopj/android/http/AsyncHttpClient.java b/library/src/main/java/com/loopj/android/http/AsyncHttpClient.java index 4c803adc6..4cd07cefc 100755 --- a/library/src/main/java/com/loopj/android/http/AsyncHttpClient.java +++ b/library/src/main/java/com/loopj/android/http/AsyncHttpClient.java @@ -531,4 +531,12 @@ public void cancelRequestsByTAG(Object TAG, boolean mayInterruptIfRunning) { } } } + + /** + * Call this method if your app target android below 4.4 + * This method enable sni in android below 4.4 + */ + public void useConscrypt(){ + new ConscryptSSL().install(); + } } diff --git a/library/src/main/java/com/loopj/android/http/ConscryptSSL.java b/library/src/main/java/com/loopj/android/http/ConscryptSSL.java new file mode 100644 index 000000000..7161f2435 --- /dev/null +++ b/library/src/main/java/com/loopj/android/http/ConscryptSSL.java @@ -0,0 +1,19 @@ +package com.loopj.android.http; + +import android.util.Log; + +import org.conscrypt.Conscrypt; + +import java.security.Security; + +public class ConscryptSSL { + + public void install(){ + try { + Security.insertProviderAt(Conscrypt.newProvider(),1); + }catch (NoClassDefFoundError ex){ + Log.e(AsyncHttpClient.LOG_TAG, "java.lang.NoClassDefFoundError: org.conscrypt.Conscrypt, Please add org.conscrypt.Conscrypt to your dependency"); + } + + } +} From 1bb6079338e6d5c2cb0b17a0bb269bca1ae34a3d Mon Sep 17 00:00:00 2001 From: Saeed Rezaei Date: Sat, 4 Jul 2020 02:21:48 -0700 Subject: [PATCH 8/8] set custom header method (#1342) --- .../main/java/com/loopj/android/http/AsyncHttpClient.java | 7 +++++++ .../com/loopj/android/http/DefaultHttpClientProvider.java | 8 ++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/library/src/main/java/com/loopj/android/http/AsyncHttpClient.java b/library/src/main/java/com/loopj/android/http/AsyncHttpClient.java index 4cd07cefc..c22ea12a1 100755 --- a/library/src/main/java/com/loopj/android/http/AsyncHttpClient.java +++ b/library/src/main/java/com/loopj/android/http/AsyncHttpClient.java @@ -36,6 +36,7 @@ import java.net.URI; import java.net.URL; import java.net.URLDecoder; +import java.util.Collection; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -370,6 +371,12 @@ public void setEnableRedirectStrategy(boolean isEnable){ } } + public void setCustomHeaders(Collection headers){ + if (getHttpClientProvider() instanceof DefaultHttpClientProvider) { + ((DefaultHttpClientProvider) getHttpClientProvider()).setHeaders(headers); + } + } + /** * @deprecated */ diff --git a/library/src/main/java/com/loopj/android/http/DefaultHttpClientProvider.java b/library/src/main/java/com/loopj/android/http/DefaultHttpClientProvider.java index 9450eaa91..b083534de 100644 --- a/library/src/main/java/com/loopj/android/http/DefaultHttpClientProvider.java +++ b/library/src/main/java/com/loopj/android/http/DefaultHttpClientProvider.java @@ -39,7 +39,7 @@ public class DefaultHttpClientProvider implements HttpClientProviderInterface { protected HttpHost proxy; protected CookieStore cookieStore; protected CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); - protected final Collection commonHeaders = new ArrayList
(); + protected final Collection
commonHeaders = new ArrayList
(); protected HttpRequestRetryHandler retryHandler; protected boolean enableRedirects = false, enableRelativeRedirects = false, enableCircularRedirects = false; protected RedirectStrategy redirectStrategy; @@ -107,7 +107,7 @@ public void setCookieStore(CookieStore store) { cookieStore = store; } - public Collection getHeaders() { + public Collection
getHeaders() { return commonHeaders; } @@ -133,4 +133,8 @@ public boolean isEnableRedirectStrategy() { public void setEnableRedirectStrategy(boolean enableRedirectStrategy) { this.enableRedirectStrategy = enableRedirectStrategy; } + + public void setHeaders(Collection headers){ + commonHeaders.addAll(headers); + } }