Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Updated OkHttp3Stack for latest Volley 1.1.0 with Migrating from Apache HTTP #7

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
updated Volley 1.1.0 and OkHttp3Stack to Migrating-from-Apache-HTTP h…
…ttps://github.com/google/volley/wiki/Migrating-from-Apache-HTTP (Apache HTTP Client Removal from Android 6.0 Changes) (Optional interceptors support also commented in OkHttp3Stack)
  • Loading branch information
semicolon committed Mar 3, 2018
commit 096b648a9d141c6517cce897d96a73b67cc6b94f
112 changes: 46 additions & 66 deletions app/src/main/java/com/sotti/okhttpvolleygson/data/OkHttp3Stack.java
Original file line number Diff line number Diff line change
@@ -1,69 +1,56 @@
package com.sotti.okhttpvolleygson.data;


import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.toolbox.HttpStack;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

import okhttp3.Call;
import okhttp3.Headers;
//import okhttp3.Interceptor;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Protocol;
import okhttp3.RequestBody;
import okhttp3.Response;
import okhttp3.ResponseBody;
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;

/**
* OkHttp backed {@link com.android.volley.toolbox.HttpStack HttpStack} that does not
* use okhttp-urlconnection
*/
public class OkHttp3Stack implements HttpStack {

public OkHttp3Stack() {
}

private static HttpEntity entityFromOkHttpResponse(Response r) {
BasicHttpEntity entity = new BasicHttpEntity();
ResponseBody body = r.body();

entity.setContent(body.byteStream());
entity.setContentLength(body.contentLength());
entity.setContentEncoding(r.header("Content-Encoding"));
import com.android.volley.Header;
import com.android.volley.toolbox.BaseHttpStack;
import com.android.volley.toolbox.HttpResponse;

public class OkHttp3Stack extends BaseHttpStack {
// private final List<Interceptor> mInterceptors;

// public okHttp3Stack(List<Interceptor> interceptors) {
// this.mInterceptors = interceptors;
// }

public OkHttp3Stack() {

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 AuthFailureError {
private static void setConnectionParametersForRequest(okhttp3.Request.Builder builder, Request<?> request)
throws 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();
byte[] postBody = request.getBody();
if (postBody != null) {
builder.post(RequestBody
.create(MediaType.parse(request.getPostBodyContentType()), postBody));
builder.post(RequestBody.create(MediaType.parse(request.getBodyContentType()), postBody));
}
break;
case Request.Method.GET:
builder.get();
break;
case Request.Method.DELETE:
builder.delete();
builder.delete(createRequestBody(request));
break;
case Request.Method.POST:
builder.post(createRequestBody(request));
@@ -88,35 +75,16 @@ private static void setConnectionParametersForRequest(okhttp3.Request.Builder bu
}
}

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);
}

@Override
public HttpResponse performRequest(com.android.volley.Request<?> request,
Map<String, String> additionalHeaders)
throws IOException, AuthFailureError {

public HttpResponse executeRequest(Request<?> request, Map<String, String> additionalHeaders) throws IOException, AuthFailureError {
OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder();
int timeoutMs = request.getTimeoutMs();

@@ -137,24 +105,36 @@ public HttpResponse performRequest(com.android.volley.Request<?> request,

setConnectionParametersForRequest(okHttpRequestBuilder, request);


// for (Interceptor interceptor : mInterceptors) {
// clientBuilder.addNetworkInterceptor(interceptor);
// }

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();
int code = okHttpResponse.code();
ResponseBody body = okHttpResponse.body();
InputStream content = body == null ? null : body.byteStream();
int contentLength = body == null ? 0 : (int) body.contentLength();
List<Header> responseHeaders = mapHeaders(okHttpResponse.headers());
return new HttpResponse(code, responseHeaders, contentLength, content);
}

private List<Header> mapHeaders(Headers responseHeaders) {
List<Header> headers = new ArrayList<>();
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));
headers.add(new Header(name, value));
}
}

return response;
return headers;
}
}
}



2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
@@ -29,7 +29,7 @@ ext {
targetSdkVersion = 27
compileSdkVersion = 27
gsonVersion = "2.8.2"
volleyVersion = "1.0.0"
volleyVersion = "1.1.0"
okHttpVersion = "3.9.1"
supportLibraryVersion = "27.0.2"
circleImageViewVersion = "2.2.0"