• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

box / box-java-sdk / #4429

19 Feb 2025 11:54AM UTC coverage: 71.954% (+0.02%) from 71.932%
#4429

Pull #1287

github

web-flow
Merge 687b23944 into 29b651987
Pull Request #1287: feat: Support `zstd` encoding

34 of 44 new or added lines in 3 files covered. (77.27%)

3 existing lines in 3 files now uncovered.

8192 of 11385 relevant lines covered (71.95%)

0.72 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

87.88
/src/main/java/com/box/sdk/ZstdInterceptor.java
1
package com.box.sdk;
2

3
import com.github.luben.zstd.ZstdInputStream;
4
import java.io.IOException;
5
import java.io.InputStream;
6
import okhttp3.Interceptor;
7
import okhttp3.MediaType;
8
import okhttp3.Request;
9
import okhttp3.Response;
10
import okhttp3.ResponseBody;
11
import okio.BufferedSource;
12
import okio.Okio;
13
import okio.Source;
14
import org.jetbrains.annotations.NotNull;
15

16
/**
17
 * Interceptor that adds zstd compression support to API requests.
18
 * This interceptor adds zstd to the Accept-Encoding header and handles decompression of zstd responses.
19
 */
20
public class ZstdInterceptor implements Interceptor {
1✔
21
    @NotNull
22
    @Override
23
    public Response intercept(Chain chain) throws IOException {
24
        Request request = chain.request();
1✔
25

26
        // Add zstd to the Accept-Encoding header
27
        String acceptEncoding;
28
        String acceptEncodingHeader = request.header("Accept-Encoding");
1✔
29
        if (acceptEncodingHeader == null || acceptEncodingHeader.isEmpty()) {
1✔
NEW
30
            acceptEncoding = "zstd";
×
31
        } else {
32
            acceptEncoding = acceptEncodingHeader + ", zstd";
1✔
33
        }
34

35
        Request compressedRequest = request.newBuilder()
1✔
36
            .removeHeader("Accept-Encoding")
1✔
37
            .addHeader("Accept-Encoding", acceptEncoding)
1✔
38
            .build();
1✔
39

40
        Response response = chain.proceed(compressedRequest);
1✔
41
        String contentEncoding = response.header("Content-Encoding");
1✔
42

43
        // Only handle zstd encoded responses, let OkHttp handle gzip and others
44
        if (contentEncoding == null || !contentEncoding.equalsIgnoreCase("zstd")) {
1✔
45
            return response;
1✔
46
        }
47

48
        ResponseBody originalBody = response.body();
1✔
49
        if (originalBody == null) {
1✔
NEW
50
            return response;
×
51
        }
52

53
        // Create a streaming response body
54
        ResponseBody decompressedBody = createStreamingResponseBody(originalBody);
1✔
55

56
        return response.newBuilder()
1✔
57
                .body(decompressedBody)
1✔
58
                .addHeader("X-Content-Encoding", "zstd")
1✔
59
                .removeHeader("Content-Encoding")
1✔
60
                .removeHeader("Content-Length")
1✔
61
                .build();
1✔
62
    }
63

64
    /**
65
     * Wraps the original response body in a streaming Zstd decompressor.
66
     */
67
    private ResponseBody createStreamingResponseBody(ResponseBody originalBody) {
68
        return new ResponseBody() {
1✔
69
            @Override
70
            public MediaType contentType() {
71
                return originalBody.contentType();
1✔
72
            }
73

74
            @Override
75
            public long contentLength() {
76
                return -1;
1✔
77
            }
78

79
            @Override
80
            public BufferedSource source() {
81
                InputStream decompressedStream;
82
                try {
83
                    decompressedStream = new ZstdInputStream(originalBody.byteStream());
1✔
NEW
84
                } catch (IOException e) {
×
NEW
85
                    throw new RuntimeException("Failed to create ZstdInputStream", e);
×
86
                }
1✔
87

88
                Source source = Okio.source(decompressedStream);
1✔
89
                return Okio.buffer(source);
1✔
90
            }
91
        };
92
    }
93
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc