Skip to content

Commit 26e06d3

Browse files
authored
Bael 9455 (#18863)
* BAEL-9455 * BAEL-9455
1 parent 1961fae commit 26e06d3

File tree

2 files changed

+162
-0
lines changed

2 files changed

+162
-0
lines changed
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.baeldung.hostport;
2+
3+
import jakarta.servlet.http.HttpServletRequest;
4+
import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
5+
6+
public class GetHostPort {
7+
8+
public static String getHostWithPort(HttpServletRequest request) {
9+
String scheme = request.getScheme();
10+
String serverName = request.getServerName();
11+
int serverPort = request.getServerPort();
12+
13+
boolean isDefaultPort = ("http".equals(scheme) && serverPort == 80)
14+
|| ("https".equals(scheme) && serverPort == 443);
15+
16+
if (isDefaultPort) {
17+
return String.format("%s://%s", scheme, serverName);
18+
} else {
19+
return String.format("%s://%s:%d", scheme, serverName, serverPort);
20+
}
21+
}
22+
23+
public static String getBaseUrl() {
24+
return ServletUriComponentsBuilder.fromCurrentRequestUri()
25+
.replacePath(null)
26+
.build()
27+
.toUriString();
28+
}
29+
30+
public static String getForwardedHost(HttpServletRequest request) {
31+
String forwardedHost = request.getHeader("X-Forwarded-Host");
32+
String forwardedProto = request.getHeader("X-Forwarded-Proto");
33+
String forwardedPort = request.getHeader("X-Forwarded-Port");
34+
35+
String scheme = forwardedProto != null ? forwardedProto : request.getScheme();
36+
String host = forwardedHost != null ? forwardedHost : request.getServerName();
37+
String port = forwardedPort != null ? forwardedPort : String.valueOf(request.getServerPort());
38+
39+
boolean isDefaultPort = ("http".equals(scheme) && "80".equals(port))
40+
|| ("https".equals(scheme) && "443".equals(port));
41+
42+
return isDefaultPort ? String.format("%s://%s", scheme, host)
43+
: String.format("%s://%s:%s", scheme, host, port);
44+
}
45+
}
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
package com.baeldung.hostport;
2+
3+
import jakarta.servlet.http.HttpServletRequest;
4+
import org.junit.jupiter.api.Test;
5+
import org.mockito.Mockito;
6+
import org.springframework.mock.web.MockHttpServletRequest;
7+
import org.springframework.web.context.request.RequestContextHolder;
8+
import org.springframework.web.context.request.ServletRequestAttributes;
9+
10+
import java.net.MalformedURLException;
11+
import java.net.URL;
12+
13+
import static org.junit.jupiter.api.Assertions.assertEquals;
14+
15+
public class GetHostPortUnitTest {
16+
17+
@Test
18+
void givenHttpWithDefaultPort_whenGetHostWithPort_thenReturnWithoutPort() {
19+
HttpServletRequest request = Mockito.mock(HttpServletRequest.class);
20+
Mockito.when(request.getScheme()).thenReturn("http");
21+
Mockito.when(request.getServerName()).thenReturn("example.com");
22+
Mockito.when(request.getServerPort()).thenReturn(80);
23+
24+
String result = GetHostPort.getHostWithPort(request);
25+
26+
assertEquals("http://example.com", result);
27+
}
28+
29+
@Test
30+
void givenHttpsWithDefaultPort_whenGetHostWithPort_thenReturnWithoutPort() {
31+
HttpServletRequest request = Mockito.mock(HttpServletRequest.class);
32+
Mockito.when(request.getScheme()).thenReturn("https");
33+
Mockito.when(request.getServerName()).thenReturn("secure.example.com");
34+
Mockito.when(request.getServerPort()).thenReturn(443);
35+
36+
String result = GetHostPort.getHostWithPort(request);
37+
38+
assertEquals("https://secure.example.com", result);
39+
}
40+
41+
@Test
42+
void givenHttpWithCustomPort_whenGetHostWithPort_thenIncludePort() {
43+
HttpServletRequest request = Mockito.mock(HttpServletRequest.class);
44+
Mockito.when(request.getScheme()).thenReturn("http");
45+
Mockito.when(request.getServerName()).thenReturn("localhost");
46+
Mockito.when(request.getServerPort()).thenReturn(8080);
47+
48+
String result = GetHostPort.getHostWithPort(request);
49+
50+
assertEquals("http://localhost:8080", result);
51+
}
52+
53+
@Test
54+
void givenHttpsWithCustomPort_whenGetHostWithPort_thenIncludePort() {
55+
HttpServletRequest request = Mockito.mock(HttpServletRequest.class);
56+
Mockito.when(request.getScheme()).thenReturn("https");
57+
Mockito.when(request.getServerName()).thenReturn("test.example.com");
58+
Mockito.when(request.getServerPort()).thenReturn(8443);
59+
60+
String result = GetHostPort.getHostWithPort(request);
61+
62+
assertEquals("https://test.example.com:8443", result);
63+
}
64+
65+
@Test
66+
void whenUsingServletUriComponentsBuilder_thenReturnBaseUrl() {
67+
MockHttpServletRequest request = new MockHttpServletRequest();
68+
request.setScheme("https");
69+
request.setServerName("example.com");
70+
request.setServerPort(8443);
71+
request.setRequestURI("/api/users/123");
72+
73+
RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request));
74+
String baseUrl = GetHostPort.getBaseUrl();
75+
76+
assertEquals("https://example.com:8443", baseUrl);
77+
78+
RequestContextHolder.resetRequestAttributes();
79+
}
80+
81+
@Test
82+
void givenRequestURL_whenParse_thenExtractHostWithPort() throws MalformedURLException {
83+
HttpServletRequest request = Mockito.mock(HttpServletRequest.class);
84+
Mockito.when(request.getRequestURL()).thenReturn(new StringBuffer("http://localhost:8080/api/test"));
85+
86+
URL url = new URL(request.getRequestURL().toString());
87+
String hostWithPort = url.getPort() == -1
88+
? String.format("%s://%s", url.getProtocol(), url.getHost())
89+
: String.format("%s://%s:%d", url.getProtocol(), url.getHost(), url.getPort());
90+
91+
assertEquals("http://localhost:8080", hostWithPort);
92+
}
93+
94+
@Test
95+
void givenForwardedHeaders_whenGetForwardedHost_thenReturnProxyHost() {
96+
HttpServletRequest request = Mockito.mock(HttpServletRequest.class);
97+
Mockito.when(request.getHeader("X-Forwarded-Host")).thenReturn("proxy.example.com");
98+
Mockito.when(request.getHeader("X-Forwarded-Proto")).thenReturn("https");
99+
Mockito.when(request.getHeader("X-Forwarded-Port")).thenReturn("443");
100+
101+
String result = GetHostPort.getForwardedHost(request);
102+
103+
assertEquals("https://proxy.example.com", result);
104+
}
105+
106+
@Test
107+
void givenNoForwardedHeaders_whenGetForwardedHost_thenUseRequestValues() {
108+
HttpServletRequest request = Mockito.mock(HttpServletRequest.class);
109+
Mockito.when(request.getScheme()).thenReturn("http");
110+
Mockito.when(request.getServerName()).thenReturn("localhost");
111+
Mockito.when(request.getServerPort()).thenReturn(8080);
112+
113+
String result = GetHostPort.getForwardedHost(request);
114+
115+
assertEquals("http://localhost:8080", result);
116+
}
117+
}

0 commit comments

Comments
 (0)