Skip to content

Commit 2f77b36

Browse files
committed
Filter :status from HttpClient headers
1 parent 7cc9fe1 commit 2f77b36

File tree

2 files changed

+71
-2
lines changed

2 files changed

+71
-2
lines changed

client/client-http/src/main/java/software/amazon/smithy/java/client/http/JavaHttpClientTransport.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import java.net.http.HttpClient;
1515
import java.net.http.HttpConnectTimeoutException;
1616
import java.time.Duration;
17+
import java.util.HashMap;
1718
import software.amazon.smithy.java.client.core.ClientTransport;
1819
import software.amazon.smithy.java.client.core.ClientTransportFactory;
1920
import software.amazon.smithy.java.client.core.MessageExchange;
@@ -170,8 +171,10 @@ private HttpResponse sendRequest(java.net.http.HttpRequest request) {
170171
}
171172
}
172173

173-
private HttpResponse createSmithyResponse(java.net.http.HttpResponse<InputStream> response) {
174-
var headerMap = response.headers().map();
174+
// package-private for testing
175+
HttpResponse createSmithyResponse(java.net.http.HttpResponse<InputStream> response) {
176+
var headerMap = new HashMap<>(response.headers().map());
177+
headerMap.remove(":status");
175178
LOGGER.trace("Got response: {}; headers: {}", response, headerMap);
176179

177180
var headers = HttpHeaders.of(headerMap);

client/client-http/src/test/java/software/amazon/smithy/java/client/http/JavaHttpClientTest.java

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,20 @@
1010
import static org.hamcrest.Matchers.empty;
1111
import static org.hamcrest.Matchers.equalTo;
1212
import static org.hamcrest.Matchers.not;
13+
import static org.junit.jupiter.api.Assertions.assertFalse;
1314

15+
import java.io.ByteArrayInputStream;
16+
import java.io.InputStream;
1417
import java.net.URI;
1518
import java.net.URISyntaxException;
19+
import java.net.http.HttpClient;
20+
import java.net.http.HttpHeaders;
21+
import java.net.http.HttpRequest;
22+
import java.net.http.HttpResponse;
23+
import java.util.List;
24+
import java.util.Map;
25+
import java.util.Optional;
26+
import javax.net.ssl.SSLSession;
1627
import org.junit.jupiter.api.AfterAll;
1728
import org.junit.jupiter.api.BeforeAll;
1829
import org.junit.jupiter.api.Test;
@@ -91,4 +102,59 @@ public void automaticallyAppliesUserAgentPlugin() throws URISyntaxException {
91102
// the interceptor is package-private, so this check will suffice.
92103
assertThat(config.interceptors().toString(), containsString("UserAgentPlugin"));
93104
}
105+
106+
@Test
107+
public void filtersStatusPseudoHeaderFromResponse() throws Exception {
108+
// Create a fake Java HttpResponse with :status pseudo-header
109+
var fakeResponse = new HttpResponse<InputStream>() {
110+
@Override
111+
public int statusCode() {
112+
return 200;
113+
}
114+
115+
@Override
116+
public HttpHeaders headers() {
117+
return HttpHeaders.of(
118+
Map.of(":status", List.of("200"), "content-type", List.of("application/json")),
119+
(k, v) -> true);
120+
}
121+
122+
@Override
123+
public InputStream body() {
124+
return new ByteArrayInputStream(new byte[0]);
125+
}
126+
127+
@Override
128+
public HttpClient.Version version() {
129+
return HttpClient.Version.HTTP_2;
130+
}
131+
132+
@Override
133+
public HttpRequest request() {
134+
return null;
135+
}
136+
137+
@Override
138+
public Optional<HttpResponse<InputStream>> previousResponse() {
139+
return Optional.empty();
140+
}
141+
142+
@Override
143+
public Optional<SSLSession> sslSession() {
144+
return Optional.empty();
145+
}
146+
147+
@Override
148+
public URI uri() {
149+
return URI.create("http://localhost/test");
150+
}
151+
};
152+
153+
var transport = new JavaHttpClientTransport();
154+
var response = transport.createSmithyResponse(fakeResponse);
155+
156+
assertFalse(response.headers().map().containsKey(":status"),
157+
"Response headers should not contain :status pseudo-header");
158+
assertThat(response.headers().firstValue("content-type"), equalTo("application/json"));
159+
}
94160
}

0 commit comments

Comments
 (0)