Skip to content

Commit 20951bb

Browse files
author
Gerald Unterrainer
committed
Merge branch 'develop'
2 parents 62fc305 + f9d5cfb commit 20951bb

File tree

5 files changed

+119
-1
lines changed

5 files changed

+119
-1
lines changed

pom.xml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
<modelVersion>4.0.0</modelVersion>
1212
<artifactId>rest-client</artifactId>
13-
<version>0.0.9</version>
13+
<version>0.0.10</version>
1414
<name>RestClient</name>
1515
<packaging>jar</packaging>
1616

@@ -33,5 +33,10 @@
3333
<artifactId>okhttp</artifactId>
3434
<version>3.14.9</version>
3535
</dependency>
36+
<dependency>
37+
<groupId>com.squareup.okio</groupId>
38+
<artifactId>okio</artifactId>
39+
<version>1.17.2</version>
40+
</dependency>
3641
</dependencies>
3742
</project>

src/main/java/info/unterrainer/commons/restclient/BaseBuilder.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,19 @@ protected enum Retry {
4141
protected Map<String, String> headers = new HashMap<>();
4242
protected Map<String, String> parameters = new HashMap<>();
4343
protected Retry retry = Retry.ONCE;
44+
protected boolean isGZipped;
45+
46+
/**
47+
* Adds the header {@code "Content-Encoding": "gzip"} which triggers
48+
* GZIP-compression within our RestClient.
49+
*
50+
* @return a {@link BaseBuilder} to provide a fluent interface.
51+
*/
52+
@SuppressWarnings("unchecked")
53+
public R gzip() {
54+
addHeader("Content-Encoding", "gzip");
55+
return (R) this;
56+
}
4457

4558
/**
4659
* Add a string to an URL.
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
package info.unterrainer.commons.restclient;
2+
3+
import java.io.IOException;
4+
5+
import okhttp3.Headers;
6+
import okhttp3.Interceptor;
7+
import okhttp3.MediaType;
8+
import okhttp3.Request;
9+
import okhttp3.Request.Builder;
10+
import okhttp3.RequestBody;
11+
import okhttp3.Response;
12+
import okhttp3.ResponseBody;
13+
import okio.BufferedSink;
14+
import okio.GzipSink;
15+
import okio.GzipSource;
16+
import okio.Okio;
17+
18+
public class GzipInterceptor implements Interceptor {
19+
@Override
20+
public Response intercept(final Interceptor.Chain chain) throws IOException {
21+
22+
Request originalRequest = chain.request();
23+
24+
if (acceptGzipAlreadySetAndNoContentToZip(originalRequest))
25+
return chain.proceed(originalRequest);
26+
27+
Builder newRequestBuilder = originalRequest.newBuilder().addHeader("Accept-Encoding", "gzip");
28+
if (contentToZip(originalRequest))
29+
newRequestBuilder.method(originalRequest.method(), gzip(originalRequest.body()));
30+
31+
// Make the call.
32+
Response response = chain.proceed(newRequestBuilder.build());
33+
34+
if (isGzipped(response))
35+
return unzip(response);
36+
else
37+
return response;
38+
}
39+
40+
private boolean acceptGzipAlreadySetAndNoContentToZip(final Request originalRequest) {
41+
return originalRequest.header("Accept-Encoding") == "gzip"
42+
&& (originalRequest.body() == null || originalRequest.header("Content-Encoding") != "gzip");
43+
}
44+
45+
private RequestBody gzip(final RequestBody body) {
46+
return new RequestBody() {
47+
@Override
48+
public MediaType contentType() {
49+
return body.contentType();
50+
}
51+
52+
@Override
53+
public long contentLength() {
54+
return -1; // We don't know the compressed length in advance!
55+
}
56+
57+
@Override
58+
public void writeTo(final BufferedSink sink) throws IOException {
59+
BufferedSink gzipSink = Okio.buffer(new GzipSink(sink));
60+
body.writeTo(gzipSink);
61+
gzipSink.close();
62+
}
63+
};
64+
}
65+
66+
private Response unzip(final Response response) throws IOException {
67+
68+
if (response.body() == null)
69+
return response;
70+
71+
GzipSource gzipSource = new GzipSource(response.body().source());
72+
String bodyString = Okio.buffer(gzipSource).readUtf8();
73+
74+
ResponseBody responseBody = ResponseBody.create(response.body().contentType(), bodyString);
75+
76+
Headers strippedHeaders = response.headers()
77+
.newBuilder()
78+
.removeAll("Content-Encoding")
79+
.removeAll("Content-Length")
80+
.build();
81+
return response.newBuilder().headers(strippedHeaders).body(responseBody).message(response.message()).build();
82+
83+
}
84+
85+
private Boolean isGzipped(final Response response) {
86+
return response.header("Content-Encoding") != null && response.header("Content-Encoding").equals("gzip");
87+
}
88+
89+
private boolean contentToZip(final Request originalRequest) {
90+
return originalRequest.body() != null && originalRequest.header("Content-Encoding") == "gzip";
91+
}
92+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package info.unterrainer.commons.restclient;
2+
3+
public class Information {
4+
public static final String name = "REST-Client";
5+
public static final String buildTime = "2021-06-28T07:57:53Z";
6+
public static final String pomVersion = "0.0.10";
7+
}

src/main/java/info/unterrainer/commons/restclient/RestClient.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ public RestClient(final JsonMapper jsonMapper, final String userName, final Stri
4848
.connectTimeout(connectTimeoutInMillis, TimeUnit.MILLISECONDS)
4949
.readTimeout(readTimeoutInMillis, TimeUnit.MILLISECONDS)
5050
.writeTimeout(writeTimeoutInMillis, TimeUnit.MILLISECONDS)
51+
.addInterceptor(new GzipInterceptor())
5152
.followRedirects(true);
5253
if (userName != null || password != null)
5354
c.authenticator((route, response) -> {

0 commit comments

Comments
 (0)