code: /*
   * lakeFS API
   * lakeFS HTTP API
   *
   * The version of the OpenAPI document: 0.1.0
   * 
   *
   * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
   * https://openapi-generator.tech
   * Do not edit the class manually.
   */
  
  
  package io.lakefs.clients.api;
  
  import okhttp3.*;
  import okio.Buffer;
  import okio.BufferedSink;
  import okio.GzipSink;
  import okio.Okio;
  
  import java.io.IOException;
  
  /**
   * Encodes request bodies using gzip.
   *
   * Taken from https://github.com/square/okhttp/issues/350
   */
  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);
      }
  
      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();
              }
          };
      }
  }
  