Skip to content

Commit 110be33

Browse files
committed
Honor Host header for server name/port in MckHtSrvRq
Prior to this commit, the getServerName() and getServerPort() methods in MockHttpServletRequest simply returned the 'mocked' serverName and serverPort but ignored the 'Host' header entirely. Per the Servlet specification, however, these methods must parse the server name or port from the 'Host' header if it is present and otherwise fall back to the resolved server name or port. This commit fixes this by ensuring that getServerName() and getServerPort() properly parse the server's name or port from the 'Host' header if it is present in the request. If the 'Host' header is not present, MockHttpServletRequest falls back to returning the 'mocked' serverName and serverPort. Issue: SPR-12088
1 parent 51e4b07 commit 110be33

File tree

2 files changed

+113
-0
lines changed

2 files changed

+113
-0
lines changed

spring-test/src/main/java/org/springframework/mock/web/MockHttpServletRequest.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,8 @@ public class MockHttpServletRequest implements HttpServletRequest {
107107

108108
private static final String CONTENT_TYPE_HEADER = "Content-Type";
109109

110+
private static final String HOST_HEADER = "Host";
111+
110112
private static final String CHARSET_PREFIX = "charset=";
111113

112114
private static final ServletInputStream EMPTY_SERVLET_INPUT_STREAM =
@@ -544,6 +546,19 @@ public void setServerName(String serverName) {
544546

545547
@Override
546548
public String getServerName() {
549+
String host = getHeader(HOST_HEADER);
550+
if (host != null) {
551+
host = host.trim();
552+
if (host.startsWith("[")) {
553+
host = host.substring(1, host.indexOf(']'));
554+
}
555+
else if (host.contains(":")) {
556+
host = host.substring(0, host.indexOf(':'));
557+
}
558+
return host;
559+
}
560+
561+
// else
547562
return this.serverName;
548563
}
549564

@@ -553,6 +568,22 @@ public void setServerPort(int serverPort) {
553568

554569
@Override
555570
public int getServerPort() {
571+
String host = getHeader(HOST_HEADER);
572+
if (host != null) {
573+
host = host.trim();
574+
int idx;
575+
if (host.startsWith("[")) {
576+
idx = host.indexOf(':', host.indexOf(']'));
577+
}
578+
else {
579+
idx = host.indexOf(':');
580+
}
581+
if (idx != -1) {
582+
return Integer.parseInt(host.substring(idx + 1));
583+
}
584+
}
585+
586+
// else
556587
return this.serverPort;
557588
}
558589

spring-test/src/test/java/org/springframework/mock/web/MockHttpServletRequestTests.java

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@
4242
*/
4343
public class MockHttpServletRequestTests {
4444

45+
private static final String HOST = "Host";
46+
4547
private MockHttpServletRequest request = new MockHttpServletRequest();
4648

4749

@@ -212,6 +214,86 @@ public void setPreferredLocales() {
212214
assertEqualEnumerations(Collections.enumeration(preferredLocales), request.getLocales());
213215
}
214216

217+
@Test
218+
public void getServerNameWithDefaultName() {
219+
assertEquals("localhost", request.getServerName());
220+
}
221+
222+
@Test
223+
public void getServerNameWithCustomName() {
224+
request.setServerName("example.com");
225+
assertEquals("example.com", request.getServerName());
226+
}
227+
228+
@Test
229+
public void getServerNameViaHostHeaderWithoutPort() {
230+
String testServer = "test.server";
231+
request.addHeader(HOST, testServer);
232+
assertEquals(testServer, request.getServerName());
233+
}
234+
235+
@Test
236+
public void getServerNameViaHostHeaderWithPort() {
237+
String testServer = "test.server";
238+
request.addHeader(HOST, testServer + ":8080");
239+
assertEquals(testServer, request.getServerName());
240+
}
241+
242+
@Test
243+
public void getServerNameViaHostHeaderAsIpv6AddressWithoutPort() {
244+
String ipv6Address = "[2001:db8:0:1]";
245+
request.addHeader(HOST, ipv6Address);
246+
assertEquals("2001:db8:0:1", request.getServerName());
247+
}
248+
249+
@Test
250+
public void getServerNameViaHostHeaderAsIpv6AddressWithPort() {
251+
String ipv6Address = "[2001:db8:0:1]:8081";
252+
request.addHeader(HOST, ipv6Address);
253+
assertEquals("2001:db8:0:1", request.getServerName());
254+
}
255+
256+
@Test
257+
public void getServerPortWithDefaultPort() {
258+
assertEquals(80, request.getServerPort());
259+
}
260+
261+
@Test
262+
public void getServerPortWithCustomPort() {
263+
request.setServerPort(8080);
264+
assertEquals(8080, request.getServerPort());
265+
}
266+
267+
@Test
268+
public void getServerPortViaHostHeaderAsIpv6AddressWithoutPort() {
269+
String testServer = "[2001:db8:0:1]";
270+
request.addHeader(HOST, testServer);
271+
assertEquals(80, request.getServerPort());
272+
}
273+
274+
@Test
275+
public void getServerPortViaHostHeaderAsIpv6AddressWithPort() {
276+
String testServer = "[2001:db8:0:1]";
277+
int testPort = 9999;
278+
request.addHeader(HOST, testServer + ":" + testPort);
279+
assertEquals(testPort, request.getServerPort());
280+
}
281+
282+
@Test
283+
public void getServerPortViaHostHeaderWithoutPort() {
284+
String testServer = "test.server";
285+
request.addHeader(HOST, testServer);
286+
assertEquals(80, request.getServerPort());
287+
}
288+
289+
@Test
290+
public void getServerPortViaHostHeaderWithPort() {
291+
String testServer = "test.server";
292+
int testPort = 9999;
293+
request.addHeader(HOST, testServer + ":" + testPort);
294+
assertEquals(testPort, request.getServerPort());
295+
}
296+
215297
@Test
216298
public void getRequestURL() {
217299
request.setServerPort(8080);

0 commit comments

Comments
 (0)