From bce908f67820ae5e0d78cd1447b26e8b5ebbbd9b Mon Sep 17 00:00:00 2001 From: Abhishek Pandey <64667840+1abhishekpandey@users.noreply.github.com> Date: Mon, 19 Dec 2022 13:16:45 +0530 Subject: [PATCH] feat!: bundle the `gzip` support inside the core SDK (#42) * feat!: bundle the `gzip` support inside the core SDK Now, GZIP will be enabled by default and have also introduced an API to toggle the GZIP default value, called `enableGZIP`. If user continues to use the `client` API to pass the OkHttpClient then `enableGZIP` API value will not be taken into consideration. BREAKING CHANGE: Now user who are using the Java SDK, with self-hosted dataPlane and without their own custom `OkHttpClient` (passed using `client` API)` needs to make sure that their server supports GZIP i.e., their server version is above 1.4, else they could either use `enableGZIP` API or pass a custom OkHttpClient instance without the GZIP interceptor. * refactor: change API name from `enableGZIP` to `setGZIP` --- .../analytics/GzipRequestInterceptor.java | 51 +++++++++++++++++++ .../sdk/java/analytics/Platform.java | 12 +++-- .../sdk/java/analytics/RudderAnalytics.java | 9 +++- 3 files changed, 67 insertions(+), 5 deletions(-) create mode 100644 analytics/src/main/java/com/rudderstack/sdk/java/analytics/GzipRequestInterceptor.java diff --git a/analytics/src/main/java/com/rudderstack/sdk/java/analytics/GzipRequestInterceptor.java b/analytics/src/main/java/com/rudderstack/sdk/java/analytics/GzipRequestInterceptor.java new file mode 100644 index 00000000..9fc24b6f --- /dev/null +++ b/analytics/src/main/java/com/rudderstack/sdk/java/analytics/GzipRequestInterceptor.java @@ -0,0 +1,51 @@ +package com.rudderstack.sdk.java.analytics; + +import okhttp3.*; +import okio.BufferedSink; +import okio.GzipSink; +import okio.Okio; + +import java.io.IOException; + +/** + * This interceptor compresses the HTTP request body. Copied from + * https://github.com/square/okhttp/wiki/Interceptors#rewriting-requests + */ +final 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(), gzip(originalRequest.body())) + .build(); + return chain.proceed(compressedRequest); + } + + 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(); + } + }; + } +} diff --git a/analytics/src/main/java/com/rudderstack/sdk/java/analytics/Platform.java b/analytics/src/main/java/com/rudderstack/sdk/java/analytics/Platform.java index 8861fc39..c3ec0d91 100644 --- a/analytics/src/main/java/com/rudderstack/sdk/java/analytics/Platform.java +++ b/analytics/src/main/java/com/rudderstack/sdk/java/analytics/Platform.java @@ -21,13 +21,17 @@ private static Platform findPlatform() { return new Platform(); } - OkHttpClient defaultClient() { - OkHttpClient client = + OkHttpClient defaultClient(boolean enableGZIP) { + OkHttpClient.Builder builder = new OkHttpClient.Builder() .connectTimeout(15, TimeUnit.SECONDS) .readTimeout(15, TimeUnit.SECONDS) - .writeTimeout(15, TimeUnit.SECONDS) - .build(); + .writeTimeout(15, TimeUnit.SECONDS); + + if (enableGZIP) { + builder.addInterceptor(new GzipRequestInterceptor()); + } + OkHttpClient client = builder.build(); return client; } diff --git a/analytics/src/main/java/com/rudderstack/sdk/java/analytics/RudderAnalytics.java b/analytics/src/main/java/com/rudderstack/sdk/java/analytics/RudderAnalytics.java index db79e51d..7b39b4f5 100644 --- a/analytics/src/main/java/com/rudderstack/sdk/java/analytics/RudderAnalytics.java +++ b/analytics/src/main/java/com/rudderstack/sdk/java/analytics/RudderAnalytics.java @@ -148,6 +148,7 @@ public static class Builder { private List callbacks; private int queueCapacity; private boolean forceTlsV1 = false; + private boolean gzip = true; Builder(String writeKey) { if (writeKey == null || writeKey.trim().length() == 0) { @@ -165,6 +166,12 @@ public Builder client(OkHttpClient client) { return this; } + /** Disable the GZIP client. */ + public Builder setGZIP(boolean gzip) { + this.gzip = gzip; + return this; + } + /** Configure debug logging mechanism. By default, nothing is logged. */ public Builder log(Log log) { if (log == null) { @@ -358,7 +365,7 @@ public RudderAnalytics build() { } if (client == null) { - client = Platform.get().defaultClient(); + client = Platform.get().defaultClient(this.gzip); } if (log == null) {