-
-
Save alashow/c96c09320899e4caa06b to your computer and use it in GitHub Desktop.
| /** | |
| * The MIT License (MIT) | |
| * | |
| * Copyright (c) 2015 Circle Internet Financial | |
| * | |
| * Permission is hereby granted, free of charge, to any person obtaining a copy | |
| * of this software and associated documentation files (the "Software"), to deal | |
| * in the Software without restriction, including without limitation the rights | |
| * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
| * copies of the Software, and to permit persons to whom the Software is | |
| * furnished to do so, subject to the following conditions: | |
| * | |
| * The above copyright notice and this permission notice shall be included in | |
| * all copies or substantial portions of the Software. | |
| * | |
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
| * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
| * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
| * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
| * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
| * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |
| * THE SOFTWARE. | |
| */ | |
| package com.circle.android.api; | |
| import com.android.volley.AuthFailureError; | |
| import com.android.volley.Request; | |
| import com.android.volley.toolbox.HttpStack; | |
| import org.apache.http.HttpEntity; | |
| import org.apache.http.HttpResponse; | |
| import org.apache.http.ProtocolVersion; | |
| import org.apache.http.StatusLine; | |
| import org.apache.http.entity.BasicHttpEntity; | |
| import org.apache.http.message.BasicHeader; | |
| import org.apache.http.message.BasicHttpResponse; | |
| import org.apache.http.message.BasicStatusLine; | |
| import java.io.IOException; | |
| import java.util.Map; | |
| import java.util.concurrent.TimeUnit; | |
| import okhttp3.Call; | |
| import okhttp3.Headers; | |
| import okhttp3.MediaType; | |
| import okhttp3.OkHttpClient; | |
| import okhttp3.Protocol; | |
| import okhttp3.RequestBody; | |
| import okhttp3.Response; | |
| import okhttp3.ResponseBody; | |
| /** | |
| * OkHttp backed {@link com.android.volley.toolbox.HttpStack HttpStack} that does not | |
| * use okhttp-urlconnection | |
| */ | |
| public class OkHttp3Stack implements HttpStack { | |
| public OkHttp3Stack() { | |
| } | |
| @Override | |
| public HttpResponse performRequest(com.android.volley.Request<?> request, Map<String, String> additionalHeaders) | |
| throws IOException, AuthFailureError { | |
| OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder(); | |
| int timeoutMs = request.getTimeoutMs(); | |
| clientBuilder.connectTimeout(timeoutMs, TimeUnit.MILLISECONDS); | |
| clientBuilder.readTimeout(timeoutMs, TimeUnit.MILLISECONDS); | |
| clientBuilder.writeTimeout(timeoutMs, TimeUnit.MILLISECONDS); | |
| okhttp3.Request.Builder okHttpRequestBuilder = new okhttp3.Request.Builder(); | |
| okHttpRequestBuilder.url(request.getUrl()); | |
| Map<String, String> headers = request.getHeaders(); | |
| for(final String name : headers.keySet()) { | |
| okHttpRequestBuilder.addHeader(name, headers.get(name)); | |
| } | |
| for(final String name : additionalHeaders.keySet()) { | |
| okHttpRequestBuilder.addHeader(name, additionalHeaders.get(name)); | |
| } | |
| setConnectionParametersForRequest(okHttpRequestBuilder, request); | |
| OkHttpClient client = clientBuilder.build(); | |
| okhttp3.Request okHttpRequest = okHttpRequestBuilder.build(); | |
| Call okHttpCall = client.newCall(okHttpRequest); | |
| Response okHttpResponse = okHttpCall.execute(); | |
| StatusLine responseStatus = new BasicStatusLine(parseProtocol(okHttpResponse.protocol()), okHttpResponse.code(), okHttpResponse.message()); | |
| BasicHttpResponse response = new BasicHttpResponse(responseStatus); | |
| response.setEntity(entityFromOkHttpResponse(okHttpResponse)); | |
| Headers responseHeaders = okHttpResponse.headers(); | |
| for(int i = 0, len = responseHeaders.size(); i < len; i++) { | |
| final String name = responseHeaders.name(i), value = responseHeaders.value(i); | |
| if (name != null) { | |
| response.addHeader(new BasicHeader(name, value)); | |
| } | |
| } | |
| return response; | |
| } | |
| private static HttpEntity entityFromOkHttpResponse(Response r) throws IOException { | |
| BasicHttpEntity entity = new BasicHttpEntity(); | |
| ResponseBody body = r.body(); | |
| entity.setContent(body.byteStream()); | |
| entity.setContentLength(body.contentLength()); | |
| entity.setContentEncoding(r.header("Content-Encoding")); | |
| if (body.contentType() != null) { | |
| entity.setContentType(body.contentType().type()); | |
| } | |
| return entity; | |
| } | |
| @SuppressWarnings("deprecation") | |
| private static void setConnectionParametersForRequest(okhttp3.Request.Builder builder, com.android.volley.Request<?> request) | |
| throws IOException, AuthFailureError { | |
| switch (request.getMethod()) { | |
| case Request.Method.DEPRECATED_GET_OR_POST: | |
| // Ensure backwards compatibility. Volley assumes a request with a null body is a GET. | |
| byte[] postBody = request.getPostBody(); | |
| if (postBody != null) { | |
| builder.post(RequestBody.create(MediaType.parse(request.getPostBodyContentType()), postBody)); | |
| } | |
| break; | |
| case Request.Method.GET: | |
| builder.get(); | |
| break; | |
| case Request.Method.DELETE: | |
| builder.delete(); | |
| break; | |
| case Request.Method.POST: | |
| builder.post(createRequestBody(request)); | |
| break; | |
| case Request.Method.PUT: | |
| builder.put(createRequestBody(request)); | |
| break; | |
| case Request.Method.HEAD: | |
| builder.head(); | |
| break; | |
| case Request.Method.OPTIONS: | |
| builder.method("OPTIONS", null); | |
| break; | |
| case Request.Method.TRACE: | |
| builder.method("TRACE", null); | |
| break; | |
| case Request.Method.PATCH: | |
| builder.patch(createRequestBody(request)); | |
| break; | |
| default: | |
| throw new IllegalStateException("Unknown method type."); | |
| } | |
| } | |
| private static ProtocolVersion parseProtocol(final Protocol p) { | |
| switch (p) { | |
| case HTTP_1_0: | |
| return new ProtocolVersion("HTTP", 1, 0); | |
| case HTTP_1_1: | |
| return new ProtocolVersion("HTTP", 1, 1); | |
| case SPDY_3: | |
| return new ProtocolVersion("SPDY", 3, 1); | |
| case HTTP_2: | |
| return new ProtocolVersion("HTTP", 2, 0); | |
| } | |
| throw new IllegalAccessError("Unkwown protocol"); | |
| } | |
| private static RequestBody createRequestBody(Request r) throws AuthFailureError { | |
| final byte[] body = r.getBody(); | |
| if (body == null) { | |
| return null; | |
| } | |
| return RequestBody.create(MediaType.parse(r.getBodyContentType()), body); | |
| } | |
| } |
it use org.apache.http as protocol ,eg:org.apache.http.HttpResponse.if i want to use volley based on okhttp, i must import httpcore.jar. it has methods to avoid?
@amadib
I use slightly modified version of this class from https://gist.github.com/intari/e57a945eed9c2ee0f9eb9082469698f3 for Stetho
Do I have to include any library in gradle for org.apache.http.* classes?
The org.apache.http is available if we are targeting from version 17. How about if we are targeting v 21 and above?
how can we use this when we have
compile('com.google.api-client:google-api-client-gson:1.19.1') { exclude(group: 'com.google.android', module: 'android') exclude(group: 'org.apache.httpcomponents', module: 'httpclient') }
in the app dependency? !! no replacement for this ?
import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.ProtocolVersion; import org.apache.http.StatusLine; import org.apache.http.entity.BasicHttpEntity; import org.apache.http.message.BasicHeader; import org.apache.http.message.BasicHttpResponse; import org.apache.http.message.BasicStatusLine
?
how to covert this using following rules?
https://github.com/google/volley/wiki/Migrating-from-Apache-HTTP we have to https://github.com/google/volley/blob/master/src/main/java/com/android/volley/toolbox/AdaptedHttpStack.java ?
@intari @alashow thanks here is the updated version of latest volley 1.1.0 https://gist.github.com/LOG-TAG/3ad1c191b3ca7eab3ea6834386e30eb9 by removing all deprecated org.apache dependencies!
@intari @alashow thank you guys for the insight, here the updated version using volley 1.2.1 (latest) https://gist.github.com/4sskick/d1318379500747564d8f1c8d6af1f796 in case still you guys still has deprecated project which need to maintain but don't want to refactor to OkHttp or another request library
thanks for sharing