Skip to content

Commit a0baeae

Browse files
committed
Fix port handling in HtmlUnitRequestBuilder
Prior to this commit, HtmlUnitRequestBuilder set the server port in the MockHttpServletRequest to -1 if the URL did not contain an explicit port. However, that can lead to errors in consumers of the request that do not expect an invalid port number. In addition, HtmlUnitRequestBuilder always set the remote port in the MockHttpServletRequest to the value of the server port, which does not make sense, since the remote port of the client has nothing to do with the port on the server. To address those issues, this commit revises HtmlUnitRequestBuilder so that it: - Does not set the server and local ports if the explicit or derived default value is -1. - Consistently sets the server and local ports to the same valid value. - Does not set the remote port. Closes gh-35709
1 parent 115dee9 commit a0baeae

File tree

2 files changed

+74
-75
lines changed

2 files changed

+74
-75
lines changed

spring-test/src/main/java/org/springframework/test/web/servlet/htmlunit/HtmlUnitRequestBuilder.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -211,14 +211,12 @@ private void parent(MockHttpServletRequest request, @Nullable RequestBuilder par
211211

212212
private void ports(UriComponents uriComponents, MockHttpServletRequest request) {
213213
int serverPort = uriComponents.getPort();
214-
request.setServerPort(serverPort);
215214
if (serverPort == -1) {
216-
int portConnection = this.webRequest.getUrl().getDefaultPort();
217-
request.setLocalPort(serverPort);
218-
request.setRemotePort(portConnection);
215+
serverPort = this.webRequest.getUrl().getDefaultPort();
219216
}
220-
else {
221-
request.setRemotePort(serverPort);
217+
if (serverPort != -1) {
218+
request.setServerPort(serverPort);
219+
request.setLocalPort(serverPort);
222220
}
223221
}
224222

spring-test/src/test/java/org/springframework/test/web/servlet/htmlunit/HtmlUnitRequestBuilderTests.java

Lines changed: 70 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626

2727
import jakarta.servlet.ServletContext;
2828
import jakarta.servlet.http.Cookie;
29+
import jakarta.servlet.http.HttpServletRequest;
2930
import jakarta.servlet.http.HttpSession;
3031
import org.apache.commons.io.IOUtils;
3132
import org.apache.http.auth.UsernamePasswordCredentials;
@@ -339,22 +340,6 @@ void buildRequestLocalName() {
339340
assertThat(actualRequest.getLocalName()).isEqualTo("localhost");
340341
}
341342

342-
@Test
343-
void buildRequestLocalPortMatchingDefault() throws Exception {
344-
webRequest.setUrl(new URL("http://localhost:80/test/this/here"));
345-
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
346-
347-
assertThat(actualRequest.getLocalPort()).isEqualTo(-1);
348-
}
349-
350-
@Test
351-
void buildRequestLocalMissing() throws Exception {
352-
webRequest.setUrl(new URL("http://localhost/test/this"));
353-
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
354-
355-
assertThat(actualRequest.getLocalPort()).isEqualTo(-1);
356-
}
357-
358343
@Test
359344
void buildRequestMethods() {
360345
for (HttpMethod expectedMethod : HttpMethod.values()) {
@@ -534,71 +519,94 @@ void buildRequestReader() throws Exception {
534519
}
535520

536521
@Test
537-
void buildRequestRemoteAddr() {
522+
void buildRequestRemoteAddressHostAndPort() {
538523
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
539524

540525
assertThat(actualRequest.getRemoteAddr()).isEqualTo("127.0.0.1");
526+
assertThat(actualRequest.getRemoteHost()).isEqualTo("localhost");
527+
assertThat(actualRequest.getRemotePort()).isEqualTo(80);
541528
}
542529

543530
@Test
544-
void buildRequestRemoteHost() {
531+
void buildRequestRequestedSessionId() {
532+
String sessionId = "session-id";
533+
webRequest.setAdditionalHeader("Cookie", "JSESSIONID=" + sessionId);
545534
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
546535

547-
assertThat(actualRequest.getRemoteAddr()).isEqualTo("127.0.0.1");
536+
assertThat(actualRequest.getRequestedSessionId()).isEqualTo(sessionId);
548537
}
549538

550539
@Test
551-
void buildRequestRemotePort() throws Exception {
552-
webRequest.setUrl(new URL("http://localhost:80/test/this/here"));
540+
void buildRequestRequestedSessionIdNull() {
553541
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
554542

555-
assertThat(actualRequest.getRemotePort()).isEqualTo(80);
543+
assertThat(actualRequest.getRequestedSessionId()).isNull();
556544
}
557545

558546
@Test
559-
void buildRequestRemotePort8080() throws Exception {
560-
webRequest.setUrl(new URL("https://example.com:8080/"));
547+
void buildRequestUri() {
548+
String uri = requestBuilder.buildRequest(servletContext).getRequestURI();
549+
assertThat(uri).isEqualTo("/test/this/here");
550+
}
561551

562-
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
552+
@Test
553+
void buildRequestWithSchemeHttpAndDefaultPort() throws Exception {
554+
webRequest.setUrl(new URL("http://localhost/test"));
555+
var request = requestBuilder.buildRequest(servletContext);
563556

564-
assertThat(actualRequest.getRemotePort()).isEqualTo(8080);
557+
assertUrlAndPorts(request, "http://localhost/test", 80, false);
565558
}
566559

567560
@Test
568-
void buildRequestRemotePort80WithDefault() throws Exception {
569-
webRequest.setUrl(new URL("http://company.example/"));
570-
571-
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
561+
void buildRequestWithSchemeHttpAndExplicitDefaultPort() throws Exception {
562+
webRequest.setUrl(new URL("http://localhost:80/test"));
563+
var request = requestBuilder.buildRequest(servletContext);
572564

573-
assertThat(actualRequest.getRemotePort()).isEqualTo(80);
565+
assertUrlAndPorts(request, "http://localhost/test", 80, false);
574566
}
575567

576568
@Test
577-
void buildRequestRequestedSessionId() {
578-
String sessionId = "session-id";
579-
webRequest.setAdditionalHeader("Cookie", "JSESSIONID=" + sessionId);
580-
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
569+
void buildRequestWithSchemeHttpAndExplicitPort() throws Exception {
570+
webRequest.setUrl(new URL("http://localhost:8081/test"));
571+
var request = requestBuilder.buildRequest(servletContext);
581572

582-
assertThat(actualRequest.getRequestedSessionId()).isEqualTo(sessionId);
573+
assertUrlAndPorts(request, "http://localhost:8081/test", 8081, false);
574+
575+
// Unlikely scheme/port combination:
576+
webRequest.setUrl(new URL("http://localhost:443/test"));
577+
request = requestBuilder.buildRequest(servletContext);
578+
579+
assertUrlAndPorts(request, "http://localhost:443/test", 443, false);
583580
}
584581

585582
@Test
586-
void buildRequestRequestedSessionIdNull() {
587-
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
583+
void buildRequestWithSchemeHttpsAndDefaultPort() throws Exception {
584+
webRequest.setUrl(new URL("https://localhost/test"));
585+
var request = requestBuilder.buildRequest(servletContext);
588586

589-
assertThat(actualRequest.getRequestedSessionId()).isNull();
587+
assertUrlAndPorts(request, "https://localhost/test", 443, true);
590588
}
591589

592590
@Test
593-
void buildRequestUri() {
594-
String uri = requestBuilder.buildRequest(servletContext).getRequestURI();
595-
assertThat(uri).isEqualTo("/test/this/here");
591+
void buildRequestWithSchemeHttpsAndExplicitDefaultPort() throws Exception {
592+
webRequest.setUrl(new URL("https://localhost:443/test"));
593+
var request = requestBuilder.buildRequest(servletContext);
594+
595+
assertUrlAndPorts(request, "https://localhost/test", 443, true);
596596
}
597597

598598
@Test
599-
void buildRequestUrl() {
600-
String uri = requestBuilder.buildRequest(servletContext).getRequestURL().toString();
601-
assertThat(uri).isEqualTo("https://example.com/test/this/here");
599+
void buildRequestWithSchemeHttpsAndExplicitPort() throws Exception {
600+
webRequest.setUrl(new URL("https://localhost:8443/test"));
601+
var request = requestBuilder.buildRequest(servletContext);
602+
603+
assertUrlAndPorts(request, "https://localhost:8443/test", 8443, true);
604+
605+
// Unlikely scheme/port combination:
606+
webRequest.setUrl(new URL("https://localhost:80/test"));
607+
request = requestBuilder.buildRequest(servletContext);
608+
609+
assertUrlAndPorts(request, "https://localhost:80/test", 80, true);
602610
}
603611

604612
@Test
@@ -624,30 +632,6 @@ void buildRequestServerName() {
624632
assertThat(actualRequest.getServerName()).isEqualTo("example.com");
625633
}
626634

627-
@Test
628-
void buildRequestServerPort() throws Exception {
629-
webRequest.setUrl(new URL("http://localhost:8080/test/this/here"));
630-
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
631-
632-
assertThat(actualRequest.getServerPort()).isEqualTo(8080);
633-
}
634-
635-
@Test
636-
void buildRequestServerPortMatchingDefault() throws Exception {
637-
webRequest.setUrl(new URL("http://localhost/test/this/here"));
638-
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
639-
640-
assertThat(actualRequest.getServerPort()).isEqualTo(-1);
641-
}
642-
643-
@Test
644-
void buildRequestServerPortDefault() throws Exception {
645-
webRequest.setUrl(new URL("https://example.com/"));
646-
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
647-
648-
assertThat(actualRequest.getServerPort()).isEqualTo(-1);
649-
}
650-
651635
@Test
652636
void buildRequestServletContext() {
653637
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
@@ -910,4 +894,21 @@ private String getContextPath() {
910894
return (String) ReflectionTestUtils.getField(requestBuilder, "contextPath");
911895
}
912896

897+
private static void assertUrlAndPorts(HttpServletRequest request, String url, int serverPort, boolean secure) {
898+
assertThat(request.getRequestURL()).asString().as("url").isEqualTo(url);
899+
assertThat(request.getServerPort()).as("server port").isEqualTo(serverPort);
900+
// In a mocked request, the local post is always the same as the server port.
901+
assertThat(request.getLocalPort()).as("local port").isEqualTo(serverPort);
902+
// Remote Port is always 80 (MockHttpServletRequest.DEFAULT_SERVER_PORT),
903+
// since a mocked request does not influence the remote host, port, or address.
904+
assertThat(request.getRemotePort()).as("remote port").isEqualTo(80);
905+
906+
if (secure) {
907+
assertThat(request.isSecure()).as("secure").isTrue();
908+
}
909+
else {
910+
assertThat(request.isSecure()).as("secure").isFalse();
911+
}
912+
}
913+
913914
}

0 commit comments

Comments
 (0)