Skip to content

Commit 72a7ada

Browse files
authored
support gzip responses from fetch (#14026)
1 parent 9584382 commit 72a7ada

File tree

4 files changed

+84
-3
lines changed

4 files changed

+84
-3
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,10 @@
2424

2525
- [Implement `Text_Column` for in-memory backend.][13769]
2626
- [Implement `Text_Column.to_case` for in-memory backend.][13769]
27+
- [Add support for gzip encoded return from web APIs][14026]
2728

2829
[13769]: https://github.com/enso-org/enso/pull/13769
30+
[14026]: https://github.com/enso-org/enso/pull/14026
2931

3032
#### Enso Language & Runtime
3133

std-bits/base/src/main/java/org/enso/base/enso_cloud/EnsoSecretHelper.java

Lines changed: 46 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import java.net.URI;
66
import java.net.URISyntaxException;
77
import java.net.http.HttpClient;
8+
import java.net.http.HttpHeaders;
89
import java.net.http.HttpRequest.Builder;
910
import java.net.http.HttpResponse;
1011
import java.security.PrivateKey;
@@ -16,6 +17,8 @@
1617
import java.util.Comparator;
1718
import java.util.List;
1819
import java.util.Properties;
20+
import java.util.zip.GZIPInputStream;
21+
1922
import org.enso.base.cache.ReloadDetector;
2023
import org.enso.base.cache.ResponseTooLargeException;
2124
import org.enso.base.net.URISchematic;
@@ -148,7 +151,8 @@ public EnsoHttpResponse makeRequest() throws IOException, InterruptedException {
148151

149152
builder.uri(resolvedURI);
150153

151-
for (Pair<String, String> resolvedHeader : resolvedHeaders) {
154+
var resolvedHeadersWithDefaults = withDefaultHeaders(resolvedHeaders);
155+
for (Pair<String, String> resolvedHeader : resolvedHeadersWithDefaults) {
152156
builder.header(resolvedHeader.getLeft(), resolvedHeader.getRight());
153157
}
154158

@@ -159,14 +163,17 @@ public EnsoHttpResponse makeRequest() throws IOException, InterruptedException {
159163

160164
URI renderedURI = uri.render();
161165

166+
var decodedBody = decodeContentEncoding(javaResponse.body(), javaResponse.headers());
167+
162168
return new EnsoHttpResponse(
163-
renderedURI, javaResponse.headers(), javaResponse.body(), javaResponse.statusCode());
169+
renderedURI, javaResponse.headers(), decodedBody, javaResponse.statusCode());
164170
}
165171

166172
/** Sorts the header by header name and value. */
167173
@Override
168174
public String hashKey() {
169-
var sortedHeaders = resolvedHeaders.stream().sorted(headerNameComparator).toList();
175+
// Include default headers in cache key to reflect actual request.
176+
var sortedHeaders = withDefaultHeaders(resolvedHeaders).stream().sorted(headerNameComparator).toList();
170177
List<String> keyStrings = new ArrayList<>(sortedHeaders.size() + 1);
171178
keyStrings.add(resolvedURI.toString());
172179

@@ -208,4 +215,40 @@ public static void simulateEnsoSecretReaderReload() {
208215
private static final Comparator<Pair<String, String>> headerNameComparator =
209216
Comparator.comparing((Pair<String, String> pair) -> pair.getLeft())
210217
.thenComparing(Comparator.comparing(pair -> pair.getRight()));
218+
219+
private static InputStream decodeContentEncoding(
220+
InputStream stream, HttpHeaders headers) throws IOException {
221+
String encoding = headers.firstValue("content-encoding").map(String::toLowerCase).orElse("");
222+
if ("gzip".equals(encoding)) {
223+
return new GZIPInputStream(stream);
224+
}
225+
return stream;
226+
}
227+
228+
private static List<Pair<String, String>> withDefaultHeaders(
229+
List<Pair<String, String>> headers) {
230+
boolean hasAccept = false;
231+
boolean hasAcceptEncoding = false;
232+
233+
for (Pair<String, String> h : headers) {
234+
String name = h.getLeft();
235+
if ("accept".equalsIgnoreCase(name)) {
236+
hasAccept = true;
237+
} else if ("accept-encoding".equalsIgnoreCase(name)) {
238+
hasAcceptEncoding = true;
239+
}
240+
if (hasAccept && hasAcceptEncoding) {
241+
return headers;
242+
}
243+
}
244+
245+
var augmented = new ArrayList<Pair<String, String>>(headers);
246+
if (!hasAccept) {
247+
augmented.add(Pair.create("Accept", "*/*"));
248+
}
249+
if (!hasAcceptEncoding) {
250+
augmented.add(Pair.create("Accept-Encoding", "gzip"));
251+
}
252+
return augmented;
253+
}
211254
}

test/Base_Tests/src/Network/Http_Spec.enso

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,8 @@ add_specs suite_builder =
9797
expected_response = Json.parse <| '''
9898
{
9999
"headers": {
100+
"Accept-Encoding": "gzip",
101+
"Accept": "*/*",
100102
"Connection": "Upgrade, HTTP2-Settings",
101103
"Http2-Settings": "AAEAAEAAAAIAAAABAAMAAABkAAQBAAAAAAUAAEAA",
102104
"User-Agent": "Java-http-client/21.0.1",
@@ -144,6 +146,8 @@ add_specs suite_builder =
144146
expected_response = Json.parse <| '''
145147
{
146148
"headers": {
149+
"Accept-Encoding": "gzip",
150+
"Accept": "*/*",
147151
"Connection": "Upgrade, HTTP2-Settings",
148152
"Http2-Settings": "AAEAAEAAAAIAAAABAAMAAABkAAQBAAAAAAUAAEAA",
149153
"User-Agent": "Java-http-client/21.0.1",
@@ -346,6 +350,8 @@ add_specs suite_builder =
346350
expected_response = Json.parse <| '''
347351
{
348352
"headers": {
353+
"Accept-Encoding": "gzip",
354+
"Accept": "*/*",
349355
"Connection": "Upgrade, HTTP2-Settings",
350356
"Http2-Settings": "AAEAAEAAAAIAAAABAAMAAABkAAQBAAAAAAUAAEAA",
351357
"User-Agent": "Java-http-client/21.0.1",
@@ -372,6 +378,8 @@ add_specs suite_builder =
372378
expected_response = Json.parse <| '''
373379
{
374380
"headers": {
381+
"Accept-Encoding": "gzip",
382+
"Accept": "*/*",
375383
"Connection": "Upgrade, HTTP2-Settings",
376384
"Http2-Settings": "AAEAAEAAAAIAAAABAAMAAABkAAQBAAAAAAUAAEAA",
377385
"User-Agent": "Java-http-client/21.0.1",
@@ -454,6 +462,8 @@ add_specs suite_builder =
454462
expected_response = Json.parse <| '''
455463
{
456464
"headers": {
465+
"Accept-Encoding": "gzip",
466+
"Accept": "*/*",
457467
"Connection": "Upgrade, HTTP2-Settings",
458468
"Http2-Settings": "AAEAAEAAAAIAAAABAAMAAABkAAQBAAAAAAUAAEAA",
459469
"User-Agent": "Java-http-client/21.0.1",
@@ -476,6 +486,8 @@ add_specs suite_builder =
476486
expected_response = Json.parse <| '''
477487
{
478488
"headers": {
489+
"Accept-Encoding": "gzip",
490+
"Accept": "*/*",
479491
"Connection": "Upgrade, HTTP2-Settings",
480492
"Http2-Settings": "AAEAAEAAAAIAAAABAAMAAABkAAQBAAAAAAUAAEAA",
481493
"User-Agent": "Java-http-client/21.0.1",
@@ -500,6 +512,8 @@ add_specs suite_builder =
500512
expected_response = Json.parse <| '''
501513
{
502514
"headers": {
515+
"Accept-Encoding": "gzip",
516+
"Accept": "*/*",
503517
"Connection": "Upgrade, HTTP2-Settings",
504518
"Http2-Settings": "AAEAAEAAAAIAAAABAAMAAABkAAQBAAAAAAUAAEAA",
505519
"User-Agent": "Java-http-client/21.0.1",
@@ -522,6 +536,8 @@ add_specs suite_builder =
522536
expected_response = Json.parse <| '''
523537
{
524538
"headers": {
539+
"Accept-Encoding": "gzip",
540+
"Accept": "*/*",
525541
"Connection": "Upgrade, HTTP2-Settings",
526542
"Http2-Settings": "AAEAAEAAAAIAAAABAAMAAABkAAQBAAAAAAUAAEAA",
527543
"User-Agent": "Java-http-client/21.0.1",
@@ -688,6 +704,8 @@ echo_response_template method path data content_type content_length=data.length
688704
template = '''
689705
{
690706
"headers": {
707+
"Accept-Encoding": "gzip",
708+
"Accept": "*/*",
691709
"Connection": "Upgrade, HTTP2-Settings",
692710
"Http2-Settings": "AAEAAEAAAAIAAAABAAMAAABkAAQBAAAAAAUAAEAA",
693711
"User-Agent": "Java-http-client/21.0.1",

test/Cloud_Tests/src/Network/Http_Spec.enso

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,8 @@ add_specs suite_builder =
9797
expected_response = Json.parse <| '''
9898
{
9999
"headers": {
100+
"Accept-Encoding": "gzip",
101+
"Accept": "*/*",
100102
"Connection": "Upgrade, HTTP2-Settings",
101103
"Http2-Settings": "AAEAAEAAAAIAAAABAAMAAABkAAQBAAAAAAUAAEAA",
102104
"User-Agent": "Java-http-client/21.0.1",
@@ -144,6 +146,8 @@ add_specs suite_builder =
144146
expected_response = Json.parse <| '''
145147
{
146148
"headers": {
149+
"Accept-Encoding": "gzip",
150+
"Accept": "*/*",
147151
"Connection": "Upgrade, HTTP2-Settings",
148152
"Http2-Settings": "AAEAAEAAAAIAAAABAAMAAABkAAQBAAAAAAUAAEAA",
149153
"User-Agent": "Java-http-client/21.0.1",
@@ -346,6 +350,8 @@ add_specs suite_builder =
346350
expected_response = Json.parse <| '''
347351
{
348352
"headers": {
353+
"Accept-Encoding": "gzip",
354+
"Accept": "*/*",
349355
"Connection": "Upgrade, HTTP2-Settings",
350356
"Http2-Settings": "AAEAAEAAAAIAAAABAAMAAABkAAQBAAAAAAUAAEAA",
351357
"User-Agent": "Java-http-client/21.0.1",
@@ -372,6 +378,8 @@ add_specs suite_builder =
372378
expected_response = Json.parse <| '''
373379
{
374380
"headers": {
381+
"Accept-Encoding": "gzip",
382+
"Accept": "*/*",
375383
"Connection": "Upgrade, HTTP2-Settings",
376384
"Http2-Settings": "AAEAAEAAAAIAAAABAAMAAABkAAQBAAAAAAUAAEAA",
377385
"User-Agent": "Java-http-client/21.0.1",
@@ -454,6 +462,8 @@ add_specs suite_builder =
454462
expected_response = Json.parse <| '''
455463
{
456464
"headers": {
465+
"Accept-Encoding": "gzip",
466+
"Accept": "*/*",
457467
"Connection": "Upgrade, HTTP2-Settings",
458468
"Http2-Settings": "AAEAAEAAAAIAAAABAAMAAABkAAQBAAAAAAUAAEAA",
459469
"User-Agent": "Java-http-client/21.0.1",
@@ -476,6 +486,8 @@ add_specs suite_builder =
476486
expected_response = Json.parse <| '''
477487
{
478488
"headers": {
489+
"Accept-Encoding": "gzip",
490+
"Accept": "*/*",
479491
"Connection": "Upgrade, HTTP2-Settings",
480492
"Http2-Settings": "AAEAAEAAAAIAAAABAAMAAABkAAQBAAAAAAUAAEAA",
481493
"User-Agent": "Java-http-client/21.0.1",
@@ -500,6 +512,8 @@ add_specs suite_builder =
500512
expected_response = Json.parse <| '''
501513
{
502514
"headers": {
515+
"Accept-Encoding": "gzip",
516+
"Accept": "*/*",
503517
"Connection": "Upgrade, HTTP2-Settings",
504518
"Http2-Settings": "AAEAAEAAAAIAAAABAAMAAABkAAQBAAAAAAUAAEAA",
505519
"User-Agent": "Java-http-client/21.0.1",
@@ -522,6 +536,8 @@ add_specs suite_builder =
522536
expected_response = Json.parse <| '''
523537
{
524538
"headers": {
539+
"Accept-Encoding": "gzip",
540+
"Accept": "*/*",
525541
"Connection": "Upgrade, HTTP2-Settings",
526542
"Http2-Settings": "AAEAAEAAAAIAAAABAAMAAABkAAQBAAAAAAUAAEAA",
527543
"User-Agent": "Java-http-client/21.0.1",
@@ -688,6 +704,8 @@ echo_response_template method path data content_type content_length=data.length
688704
template = '''
689705
{
690706
"headers": {
707+
"Accept-Encoding": "gzip",
708+
"Accept": "*/*",
691709
"Connection": "Upgrade, HTTP2-Settings",
692710
"Http2-Settings": "AAEAAEAAAAIAAAABAAMAAABkAAQBAAAAAAUAAEAA",
693711
"User-Agent": "Java-http-client/21.0.1",

0 commit comments

Comments
 (0)