aboutsummaryrefslogtreecommitdiff
path: root/core/src/main/java/com/android/volley/toolbox/HttpClientStack.java
diff options
context:
space:
mode:
authorAnonymous <no-reply@google.com>2021-07-07 14:01:06 -0700
committerJeff Davidson <jpd@google.com>2021-07-07 23:09:19 +0000
commit212e7004acfdce76c900fd97070e2e5e8476be20 (patch)
treecf5d56ccdb862fd9676c855f919408ef940bc019 /core/src/main/java/com/android/volley/toolbox/HttpClientStack.java
parentb47af415ba74754b442c1f9f3960b29537d07e6e (diff)
downloadvolley-212e7004acfdce76c900fd97070e2e5e8476be20.tar.gz
Android.bp has been updated to account for the new source directory structure. - 0dc50bcfd021c204a9e6c9e7e6befbdfa1027247 Refactor Volley into a multi-module project. (#418) by Jeff Davidson <jpd@google.com> - 763c86b0bc9f66a8bb499f6a8b7fd3bdc87621a8 Remove new constructors from JsonRequests which are break... by Jeff Davidson <jpd@google.com> - 8d1b1a59e7cd1b1d3c6d8686f8831cea08f80d1f Add @NonNull annotations to Volley (#413) by Kamal Faraj <kfaraj.dev@gmail.com> - 5ba41f8670413973f587e435598f9f1724fa26e9 Allow sending any JSON with JsonArrayRequest & JsonObject... by Paul Smith <paulsmithkc@gmail.com> - 784cdd755392a6080e5eb0bf94bd7bf4ea31cf17 Update SNAPSHOT version after 1.2.0 release by Jeff Davidson <jpd@google.com> - 0d6497bab417a5f78b3c8e03ea157ada0fbfbc5d Add developers stanza to Volley POM. (#400) by Jeff Davidson <jpd@google.com> - 36274bf515a699ae5a7fe3d321206d1b803226d8 API cleanup for Async Volley stack ahead of 1.2.0 release... by Jeff Davidson <jpd@google.com> - 03f0144843fcf9ebafe512647c1c588975429452 Update environment variable name for snapshot pushes. (#3... by Jeff Davidson <jpd@google.com> - 3bd1975652687d2baa1b11a7f02b135edede8523 Publish SNAPSHOT builds to OSSRH instead of OJO. (#397) by Jeff Davidson <jpd@google.com> - 0e0c3d9cfa694f8f1400a9e9abc4bc11761fdb52 Invoke RetryPolicy#retry in the blocking executor. (#393) by Jeff Davidson <jpd@google.com> - b51831a48f06ad28f627c3624e5edb41598a2bf8 Use a consistent timebase when evaluating soft/hard TTLs.... by Jeff Davidson <jpd@google.com> - cd0839113b100f163df1ebd04ce6d5b9e36e9863 Migrate from Travis CI to GitHub Actions. (#381) by Jeff Davidson <jpd@google.com> - bdc0e393199ebf9e67c4e29e665252818eed4639 Clean up cache initialization in AsyncRequestQueue. (#380) by Jeff Davidson <jpd@google.com> - 1c0ade36edde15d02844b40351ab6f80c63b71b3 Actually allow applications to provide custom executors. by Jeff Davidson <jpd@google.com> GitOrigin-RevId: 0dc50bcfd021c204a9e6c9e7e6befbdfa1027247 Change-Id: I4b8e4098ad5c349cb83efc867273fac1d3582a34
Diffstat (limited to 'core/src/main/java/com/android/volley/toolbox/HttpClientStack.java')
-rw-r--r--core/src/main/java/com/android/volley/toolbox/HttpClientStack.java201
1 files changed, 201 insertions, 0 deletions
diff --git a/core/src/main/java/com/android/volley/toolbox/HttpClientStack.java b/core/src/main/java/com/android/volley/toolbox/HttpClientStack.java
new file mode 100644
index 0000000..1e9e4b0
--- /dev/null
+++ b/core/src/main/java/com/android/volley/toolbox/HttpClientStack.java
@@ -0,0 +1,201 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.volley.toolbox;
+
+import com.android.volley.AuthFailureError;
+import com.android.volley.Request;
+import com.android.volley.Request.Method;
+import java.io.IOException;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.NameValuePair;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpDelete;
+import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpHead;
+import org.apache.http.client.methods.HttpOptions;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.client.methods.HttpPut;
+import org.apache.http.client.methods.HttpTrace;
+import org.apache.http.client.methods.HttpUriRequest;
+import org.apache.http.entity.ByteArrayEntity;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.params.HttpConnectionParams;
+import org.apache.http.params.HttpParams;
+
+/**
+ * An HttpStack that performs request over an {@link HttpClient}.
+ *
+ * @deprecated The Apache HTTP library on Android is deprecated. Use {@link HurlStack} or another
+ * {@link BaseHttpStack} implementation.
+ */
+@Deprecated
+public class HttpClientStack implements HttpStack {
+ protected final HttpClient mClient;
+
+ private static final String HEADER_CONTENT_TYPE = "Content-Type";
+
+ public HttpClientStack(HttpClient client) {
+ mClient = client;
+ }
+
+ private static void setHeaders(HttpUriRequest httpRequest, Map<String, String> headers) {
+ for (String key : headers.keySet()) {
+ httpRequest.setHeader(key, headers.get(key));
+ }
+ }
+
+ @SuppressWarnings("unused")
+ private static List<NameValuePair> getPostParameterPairs(Map<String, String> postParams) {
+ List<NameValuePair> result = new ArrayList<>(postParams.size());
+ for (String key : postParams.keySet()) {
+ result.add(new BasicNameValuePair(key, postParams.get(key)));
+ }
+ return result;
+ }
+
+ @Override
+ public HttpResponse performRequest(Request<?> request, Map<String, String> additionalHeaders)
+ throws IOException, AuthFailureError {
+ HttpUriRequest httpRequest = createHttpRequest(request, additionalHeaders);
+ setHeaders(httpRequest, additionalHeaders);
+ // Request.getHeaders() takes precedence over the given additional (cache) headers) and any
+ // headers set by createHttpRequest (like the Content-Type header).
+ setHeaders(httpRequest, request.getHeaders());
+ onPrepareRequest(httpRequest);
+ HttpParams httpParams = httpRequest.getParams();
+ int timeoutMs = request.getTimeoutMs();
+ // TODO: Reevaluate this connection timeout based on more wide-scale
+ // data collection and possibly different for wifi vs. 3G.
+ HttpConnectionParams.setConnectionTimeout(httpParams, 5000);
+ HttpConnectionParams.setSoTimeout(httpParams, timeoutMs);
+ return mClient.execute(httpRequest);
+ }
+
+ /** Creates the appropriate subclass of HttpUriRequest for passed in request. */
+ @SuppressWarnings("deprecation")
+ /* protected */ static HttpUriRequest createHttpRequest(
+ Request<?> request, Map<String, String> additionalHeaders) throws AuthFailureError {
+ switch (request.getMethod()) {
+ case Method.DEPRECATED_GET_OR_POST:
+ {
+ // This is the deprecated way that needs to be handled for backwards
+ // compatibility.
+ // If the request's post body is null, then the assumption is that the request
+ // is
+ // GET. Otherwise, it is assumed that the request is a POST.
+ byte[] postBody = request.getPostBody();
+ if (postBody != null) {
+ HttpPost postRequest = new HttpPost(request.getUrl());
+ postRequest.addHeader(
+ HEADER_CONTENT_TYPE, request.getPostBodyContentType());
+ HttpEntity entity;
+ entity = new ByteArrayEntity(postBody);
+ postRequest.setEntity(entity);
+ return postRequest;
+ } else {
+ return new HttpGet(request.getUrl());
+ }
+ }
+ case Method.GET:
+ return new HttpGet(request.getUrl());
+ case Method.DELETE:
+ return new HttpDelete(request.getUrl());
+ case Method.POST:
+ {
+ HttpPost postRequest = new HttpPost(request.getUrl());
+ postRequest.addHeader(HEADER_CONTENT_TYPE, request.getBodyContentType());
+ setEntityIfNonEmptyBody(postRequest, request);
+ return postRequest;
+ }
+ case Method.PUT:
+ {
+ HttpPut putRequest = new HttpPut(request.getUrl());
+ putRequest.addHeader(HEADER_CONTENT_TYPE, request.getBodyContentType());
+ setEntityIfNonEmptyBody(putRequest, request);
+ return putRequest;
+ }
+ case Method.HEAD:
+ return new HttpHead(request.getUrl());
+ case Method.OPTIONS:
+ return new HttpOptions(request.getUrl());
+ case Method.TRACE:
+ return new HttpTrace(request.getUrl());
+ case Method.PATCH:
+ {
+ HttpPatch patchRequest = new HttpPatch(request.getUrl());
+ patchRequest.addHeader(HEADER_CONTENT_TYPE, request.getBodyContentType());
+ setEntityIfNonEmptyBody(patchRequest, request);
+ return patchRequest;
+ }
+ default:
+ throw new IllegalStateException("Unknown request method.");
+ }
+ }
+
+ private static void setEntityIfNonEmptyBody(
+ HttpEntityEnclosingRequestBase httpRequest, Request<?> request)
+ throws AuthFailureError {
+ byte[] body = request.getBody();
+ if (body != null) {
+ HttpEntity entity = new ByteArrayEntity(body);
+ httpRequest.setEntity(entity);
+ }
+ }
+
+ /**
+ * Called before the request is executed using the underlying HttpClient.
+ *
+ * <p>Overwrite in subclasses to augment the request.
+ */
+ protected void onPrepareRequest(HttpUriRequest request) throws IOException {
+ // Nothing.
+ }
+
+ /**
+ * The HttpPatch class does not exist in the Android framework, so this has been defined here.
+ */
+ public static final class HttpPatch extends HttpEntityEnclosingRequestBase {
+
+ public static final String METHOD_NAME = "PATCH";
+
+ public HttpPatch() {
+ super();
+ }
+
+ public HttpPatch(final URI uri) {
+ super();
+ setURI(uri);
+ }
+
+ /** @throws IllegalArgumentException if the uri is invalid. */
+ public HttpPatch(final String uri) {
+ super();
+ setURI(URI.create(uri));
+ }
+
+ @Override
+ public String getMethod() {
+ return METHOD_NAME;
+ }
+ }
+}