Skip to content

Instantly share code, notes, and snippets.

@NikolaDespotoski
Last active May 8, 2018 12:17
Show Gist options
  • Star 6 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save NikolaDespotoski/246812ae6fa15d089b0a to your computer and use it in GitHub Desktop.
Save NikolaDespotoski/246812ae6fa15d089b0a to your computer and use it in GitHub Desktop.
OkHttpClient that does not execute Retrofit requests on HttpURLConnection but directly on OkHttpClient
import com.squareup.okhttp.Headers;
import com.squareup.okhttp.MediaType;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.RequestBody;
import com.squareup.okhttp.Response;
import com.squareup.okhttp.ResponseBody;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import okio.BufferedSink;
import retrofit.client.Client;
import retrofit.client.Header;
import retrofit.mime.TypedInput;
import retrofit.mime.TypedOutput;
/**
* Created by nikola on 12/25/14.
*/
public class OkHttpClient22 implements Client {
private static OkHttpClient sClient = new OkHttpClient();
public OkHttpClient22(){};
public OkHttpClient22(OkHttpClient okClient){
sClient = okClient;
}
@Override
public retrofit.client.Response execute(retrofit.client.Request request) throws IOException {
com.squareup.okhttp.Request okRequest = buildRequest(request);
Response okResponse = sClient.newCall(okRequest).execute();
retrofit.client.Response response = buildResponse(okResponse);
return response;
}
private retrofit.client.Response buildResponse(Response okResponse) {
TypedInput inputBody = new ResponseBodyWrapper(okResponse.body());
retrofit.client.Response response =
new retrofit.client.Response(okResponse.request().urlString(), okResponse.code(), okResponse.message(), getHeaders(okResponse.headers()), inputBody);
return response;
}
private List<Header> getHeaders(Headers headers) {
List<Header> retrofitHeaders = new ArrayList<Header>();
int headerCount = headers.names().size();
for(int i = 0; i < headerCount; i++){
retrofitHeaders.add(new Header(headers.name(i),headers.value(i)));
}
return retrofitHeaders;
}
private com.squareup.okhttp.Request buildRequest(retrofit.client.Request request) {
com.squareup.okhttp.Request.Builder requestBuilder = new com.squareup.okhttp.Request.Builder();
//---copy headers---
List<retrofit.client.Header> headers = request.getHeaders();
Headers.Builder okHeadersBulder = new Headers.Builder();
if(headers != null && headers.size() > 0) {
for (Header h : headers) {
okHeadersBulder.add(h.getName(), h.getValue());
}
requestBuilder.headers(okHeadersBulder.build());
}
//--- copy url ----
requestBuilder.url(request.getUrl());
//--- copy method and create request body---
if(!request.getMethod().equalsIgnoreCase("GET"))
requestBuilder.method(request.getMethod(), new RequestBodyWrapper(request.getBody()));
else
requestBuilder.get();
return requestBuilder.build();
}
}
public class RequestBodyWrapper extends RequestBody{
private final TypedOutput mWrapped;
public RequestBodyWrapper(TypedOutput output){
mWrapped = output;
}
@Override
public long contentLength() {
return mWrapped.length();
}
@Override
public MediaType contentType() {
return MediaType.parse(mWrapped.mimeType());
}
@Override
public void writeTo(BufferedSink sink) throws IOException {
mWrapped.writeTo(sink.outputStream());
}
}
public class ResponseBodyWrapper implements TypedInput {
private ResponseBody mWrapped;
public ResponseBodyWrapper(ResponseBody body){
mWrapped = body;
}
@Override
public String mimeType() {
return mWrapped.contentType().type();
}
@Override
public long length() {
return mWrapped.contentLength();
}
@Override
public InputStream in() throws IOException {
return mWrapped.byteStream();
}
}
@swankjesse
Copy link

Nice.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment