Skip to content

Commit a4298b2

Browse files
committed
Include request URI’s port, if any, in default Host header
Previously, OperationRequestFactory would add a Host header if one did not already exist in the request’s headers, however it did not include the port. This meant that when the request was being made to a non-standard port (a port other than 80 for an HTTP request and 443 for an HTTPS request) the Host header was incorrect. This commit updates OperationRequestFactory to check the URI for a port and, if it has one, include it in the Host header. UriModifyingOperationPreprocessor has also been updated to correctly include the port in the Host header. Closes gh-269
1 parent 8575259 commit a4298b2

File tree

7 files changed

+38
-13
lines changed

7 files changed

+38
-13
lines changed

spring-restdocs-core/src/main/java/org/springframework/restdocs/operation/OperationRequestFactory.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,10 +100,17 @@ public OperationRequest createFrom(OperationRequest original,
100100
private HttpHeaders augmentHeaders(HttpHeaders originalHeaders, URI uri,
101101
byte[] content) {
102102
return new HttpHeadersHelper(originalHeaders)
103-
.addIfAbsent(HttpHeaders.HOST, uri.getHost())
103+
.addIfAbsent(HttpHeaders.HOST, createHostHeader(uri))
104104
.setContentLengthHeader(content).getHeaders();
105105
}
106106

107+
private String createHostHeader(URI uri) {
108+
if (uri.getPort() == -1) {
109+
return uri.getHost();
110+
}
111+
return uri.getHost() + ":" + uri.getPort();
112+
}
113+
107114
private HttpHeaders getUpdatedHeaders(HttpHeaders originalHeaders,
108115
byte[] updatedContent) {
109116
return new HttpHeadersHelper(originalHeaders)

spring-restdocs-core/src/test/java/org/springframework/restdocs/http/HttpRequestSnippetTests.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,16 @@ public void getRequest() throws IOException {
5959
.request("http://localhost/foo").header("Alpha", "a").build());
6060
}
6161

62+
@Test
63+
public void getRequestWithPort() throws IOException {
64+
this.snippet.expectHttpRequest("get-request")
65+
.withContents(httpRequest(RequestMethod.GET, "/foo").header("Alpha", "a")
66+
.header(HttpHeaders.HOST, "localhost:8080"));
67+
68+
new HttpRequestSnippet().document(operationBuilder("get-request")
69+
.request("http://localhost:8080/foo").header("Alpha", "a").build());
70+
}
71+
6272
@Test
6373
public void getRequestWithQueryString() throws IOException {
6474
this.snippet.expectHttpRequest("get-request-with-query-string")

spring-restdocs-mockmvc/src/test/java/org/springframework/restdocs/mockmvc/MockMvcRestDocumentationIntegrationTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -375,7 +375,7 @@ public void preprocessedRequest() throws Exception {
375375
.header("Content-Type", "application/json")
376376
.header("Accept",
377377
MediaType.APPLICATION_JSON_VALUE)
378-
.header("Host", "localhost")
378+
.header("Host", "localhost:8080")
379379
.header("Content-Length", "13")
380380
.content("{\"a\":\"alpha\"}"))));
381381
String prettyPrinted = String.format("{%n \"a\" : \"<<beta>>\"%n}");

spring-restdocs-restassured/src/main/java/org/springframework/restdocs/restassured/operation/preprocess/UriModifyingOperationPreprocessor.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package org.springframework.restdocs.restassured.operation.preprocess;
1818

19+
import java.net.URI;
1920
import java.util.ArrayList;
2021
import java.util.Arrays;
2122
import java.util.Collection;
@@ -125,8 +126,10 @@ public OperationRequest preprocess(OperationRequest request) {
125126
if (this.scheme != null) {
126127
uriBuilder.scheme(this.scheme);
127128
}
129+
HttpHeaders modifiedHeaders = modify(request.getHeaders());
128130
if (this.host != null) {
129131
uriBuilder.host(this.host);
132+
modifiedHeaders.set(HttpHeaders.HOST, this.host);
130133
}
131134
if (this.port != null) {
132135
if (StringUtils.hasText(this.port)) {
@@ -136,10 +139,9 @@ public OperationRequest preprocess(OperationRequest request) {
136139
uriBuilder.port(null);
137140
}
138141
}
139-
HttpHeaders modifiedHeaders = modify(request.getHeaders());
140-
if (this.host != null) {
141-
modifiedHeaders.set(HttpHeaders.HOST, this.host);
142-
}
142+
URI modifiedUri = uriBuilder.build(true).toUri();
143+
modifiedHeaders.set(HttpHeaders.HOST, modifiedUri.getHost()
144+
+ (modifiedUri.getPort() == -1 ? "" : ":" + modifiedUri.getPort()));
143145
return this.contentModifyingDelegate.preprocess(
144146
new OperationRequestFactory().create(uriBuilder.build(true).toUri(),
145147
request.getMethod(), request.getContent(), modifiedHeaders,

spring-restdocs-restassured/src/test/java/org/springframework/restdocs/restassured/RestAssuredRequestConverterTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ public void headers() {
142142
assertThat(request.getHeaders().get("Foo"), is(equalTo(Arrays.asList("bar"))));
143143
assertThat(request.getHeaders().get("Accept"), is(equalTo(Arrays.asList("*/*"))));
144144
assertThat(request.getHeaders().get("Host"),
145-
is(equalTo(Arrays.asList("localhost"))));
145+
is(equalTo(Arrays.asList("localhost:" + this.port))));
146146
}
147147

148148
@Test

spring-restdocs-restassured/src/test/java/org/springframework/restdocs/restassured/RestAssuredRestDocumentationIntegrationTests.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -268,9 +268,9 @@ public void preprocessedRequest() throws Exception {
268268
.filter(document("original-request"))
269269
.filter(document("preprocessed-request",
270270
preprocessRequest(prettyPrint(),
271-
removeHeaders("a", HttpHeaders.HOST,
272-
HttpHeaders.CONTENT_LENGTH),
273-
replacePattern(pattern, "\"<<beta>>\""))))
271+
replacePattern(pattern, "\"<<beta>>\""),
272+
modifyUris().removePort(),
273+
removeHeaders("a", HttpHeaders.CONTENT_LENGTH))))
274274
.get("/").then().statusCode(200);
275275
assertThat(
276276
new File("build/generated-snippets/original-request/http-request.adoc"),
@@ -279,7 +279,7 @@ public void preprocessedRequest() throws Exception {
279279
.header("a", "alpha").header("b", "bravo")
280280
.header("Accept", MediaType.APPLICATION_JSON_VALUE)
281281
.header("Content-Type", "application/json; charset=UTF-8")
282-
.header("Host", "localhost")
282+
.header("Host", "localhost:" + this.port)
283283
.header("Content-Length", "13")
284284
.content("{\"a\":\"alpha\"}"))));
285285
String prettyPrinted = String.format("{%n \"a\" : \"<<beta>>\"%n}");
@@ -291,7 +291,7 @@ public void preprocessedRequest() throws Exception {
291291
.header("b", "bravo")
292292
.header("Accept", MediaType.APPLICATION_JSON_VALUE)
293293
.header("Content-Type", "application/json; charset=UTF-8")
294-
.content(prettyPrinted))));
294+
.header("Host", "localhost").content(prettyPrinted))));
295295
}
296296

297297
@Test

spring-restdocs-restassured/src/test/java/org/springframework/restdocs/restassured/operation/preprocess/UriModifyingOperationPreprocessorTests.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,11 @@ public void requestUriSchemeCanBeModified() {
6363
public void requestUriHostCanBeModified() {
6464
this.preprocessor.host("api.example.com");
6565
OperationRequest processed = this.preprocessor
66-
.preprocess(createRequestWithUri("http://api.example.com:12345"));
66+
.preprocess(createRequestWithUri("http://api.foo.com:12345"));
6767
assertThat(processed.getUri(),
6868
is(equalTo(URI.create("http://api.example.com:12345"))));
69+
assertThat(processed.getHeaders().getFirst(HttpHeaders.HOST),
70+
is(equalTo("api.example.com:12345")));
6971
}
7072

7173
@Test
@@ -75,6 +77,8 @@ public void requestUriPortCanBeModified() {
7577
.preprocess(createRequestWithUri("http://api.example.com:12345"));
7678
assertThat(processed.getUri(),
7779
is(equalTo(URI.create("http://api.example.com:23456"))));
80+
assertThat(processed.getHeaders().getFirst(HttpHeaders.HOST),
81+
is(equalTo("api.example.com:23456")));
7882
}
7983

8084
@Test
@@ -83,6 +87,8 @@ public void requestUriPortCanBeRemoved() {
8387
OperationRequest processed = this.preprocessor
8488
.preprocess(createRequestWithUri("http://api.example.com:12345"));
8589
assertThat(processed.getUri(), is(equalTo(URI.create("http://api.example.com"))));
90+
assertThat(processed.getHeaders().getFirst(HttpHeaders.HOST),
91+
is(equalTo("api.example.com")));
8692
}
8793

8894
@Test

0 commit comments

Comments
 (0)