github.com/phrase/openapi@v0.0.0-20240514140800-49e8a106740e/openapi-generator/templates/java/libraries/okhttp-gson/GzipRequestInterceptor.mustache (about)

     1  {{>licenseInfo}}
     2  
     3  package {{invokerPackage}};
     4  
     5  import okhttp3.*;
     6  import okio.Buffer;
     7  import okio.BufferedSink;
     8  import okio.GzipSink;
     9  import okio.Okio;
    10  
    11  import java.io.IOException;
    12  
    13  /**
    14   * Encodes request bodies using gzip.
    15   *
    16   * Taken from https://github.com/square/okhttp/issues/350
    17   */
    18  class GzipRequestInterceptor implements Interceptor {
    19      @Override
    20      public Response intercept(Chain chain) throws IOException {
    21          Request originalRequest = chain.request();
    22          if (originalRequest.body() == null || originalRequest.header("Content-Encoding") != null) {
    23              return chain.proceed(originalRequest);
    24          }
    25  
    26          Request compressedRequest = originalRequest.newBuilder()
    27                                                     .header("Content-Encoding", "gzip")
    28                                                     .method(originalRequest.method(), forceContentLength(gzip(originalRequest.body())))
    29                                                     .build();
    30          return chain.proceed(compressedRequest);
    31      }
    32  
    33      private RequestBody forceContentLength(final RequestBody requestBody) throws IOException {
    34          final Buffer buffer = new Buffer();
    35          requestBody.writeTo(buffer);
    36          return new RequestBody() {
    37              @Override
    38              public MediaType contentType() {
    39                  return requestBody.contentType();
    40              }
    41  
    42              @Override
    43              public long contentLength() {
    44                  return buffer.size();
    45              }
    46  
    47              @Override
    48              public void writeTo(BufferedSink sink) throws IOException {
    49                  sink.write(buffer.snapshot());
    50              }
    51          };
    52      }
    53  
    54      private RequestBody gzip(final RequestBody body) {
    55          return new RequestBody() {
    56              @Override
    57              public MediaType contentType() {
    58                  return body.contentType();
    59              }
    60  
    61              @Override
    62              public long contentLength() {
    63                  return -1; // We don't know the compressed length in advance!
    64              }
    65  
    66              @Override
    67              public void writeTo(BufferedSink sink) throws IOException {
    68                  BufferedSink gzipSink = Okio.buffer(new GzipSink(sink));
    69                  body.writeTo(gzipSink);
    70                  gzipSink.close();
    71              }
    72          };
    73      }
    74  }