Created
August 17, 2016 08:25
-
-
Save xsobolx/e40b4cc8d8b9d36fb7a0a08b94268db3 to your computer and use it in GitHub Desktop.
Retrofit gzip interceptor with content length
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| class GzipRequestInterceptor implements Interceptor { | |
| @Override public Response intercept(Chain chain) throws IOException { | |
| Request originalRequest = chain.request(); | |
| if (originalRequest.body() == null || originalRequest.header("Content-Encoding") != null) { | |
| return chain.proceed(originalRequest); | |
| } | |
| Request compressedRequest = originalRequest.newBuilder() | |
| .header("Content-Encoding", "gzip") | |
| .method(originalRequest.method(), forceContentLength(gzip(originalRequest.body()))) | |
| .build(); | |
| return chain.proceed(compressedRequest); | |
| } | |
| /** https://github.com/square/okhttp/issues/350 */ | |
| private RequestBody forceContentLength(final RequestBody requestBody) throws IOException { | |
| final Buffer buffer = new Buffer(); | |
| requestBody.writeTo(buffer); | |
| return new RequestBody() { | |
| @Override | |
| public MediaType contentType() { | |
| return requestBody.contentType(); | |
| } | |
| @Override | |
| public long contentLength() { | |
| return buffer.size(); | |
| } | |
| @Override | |
| public void writeTo(BufferedSink sink) throws IOException { | |
| sink.write(buffer.snapshot()); | |
| } | |
| }; | |
| } | |
| private RequestBody gzip(final RequestBody body) { | |
| return new RequestBody() { | |
| @Override public MediaType contentType() { | |
| return body.contentType(); | |
| } | |
| @Override public long contentLength() { | |
| return -1; // We don't know the compressed length in advance! | |
| } | |
| @Override public void writeTo(BufferedSink sink) throws IOException { | |
| BufferedSink gzipSink = Okio.buffer(new GzipSink(sink)); | |
| body.writeTo(gzipSink); | |
| gzipSink.close(); | |
| } | |
| }; | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment