Skip to content

Commit f956110

Browse files
authored
Merge pull request #499 from benoitf/OPENVSX-498
fix: X-Forwarded-Host header can be array or comma separated list
2 parents 4995593 + 9d14dd7 commit f956110

File tree

2 files changed

+58
-4
lines changed

2 files changed

+58
-4
lines changed

server/src/main/java/org/eclipse/openvsx/util/UrlUtil.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@
1212
import java.nio.charset.Charset;
1313
import java.nio.charset.StandardCharsets;
1414

15+
import java.util.ArrayList;
16+
import java.util.Collections;
17+
1518
import javax.servlet.http.HttpServletRequest;
1619

1720
import org.apache.commons.lang3.ArrayUtils;
@@ -159,11 +162,19 @@ protected static String getBaseUrl(HttpServletRequest request) {
159162
// Use the host and port from the X-Forwarded-Host header if present
160163
String host;
161164
int port;
162-
var forwardedHost = request.getHeader("X-Forwarded-Host");
163-
if (forwardedHost == null) {
165+
var forwardedHostHeadersEnumeration = request.getHeaders("X-Forwarded-Host");
166+
if (forwardedHostHeadersEnumeration == null || !forwardedHostHeadersEnumeration.hasMoreElements()) {
164167
host = request.getServerName();
165168
port = request.getServerPort();
166169
} else {
170+
// take the first one
171+
var forwardedHost = forwardedHostHeadersEnumeration.nextElement();
172+
173+
// if it's comma separated, take the first one
174+
var forwardedHosts = forwardedHost.split(",");
175+
if (forwardedHosts.length > 1) {
176+
forwardedHost = forwardedHosts[0];
177+
}
167178
int colonIndex = forwardedHost.lastIndexOf(':');
168179
if (colonIndex > 0) {
169180
host = forwardedHost.substring(0, colonIndex);

server/src/test/java/org/eclipse/openvsx/util/UrlUtilTest.java

Lines changed: 45 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@
1212
import static org.assertj.core.api.Assertions.assertThat;
1313
import static org.mockito.Mockito.doReturn;
1414

15+
import java.util.ArrayList;
16+
import java.util.Collections;
17+
1518
import javax.servlet.http.HttpServletRequest;
1619

1720
import org.junit.jupiter.api.AfterEach;
@@ -100,9 +103,49 @@ public void testWithXForwarded() throws Exception {
100103

101104
// XForwarded content
102105
doReturn("https").when(request).getHeader("X-Forwarded-Proto");
103-
doReturn("open-vsx.org").when(request).getHeader("X-Forwarded-Host");
106+
var items = new ArrayList<String>();
107+
items.add("open-vsx.org");
108+
doReturn(Collections.enumeration(items)).when(request).getHeaders("X-Forwarded-Host");
104109
doReturn("/openvsx").when(request).getHeader("X-Forwarded-Prefix");
105110
assertThat(UrlUtil.getBaseUrl(request)).isEqualTo("https://open-vsx.org/openvsx/");
106-
}
111+
}
112+
113+
// Check base URL is using array X-Forwarded-Host headers
114+
@Test
115+
public void testWithXForwardedHostArray() throws Exception {
116+
// basic request
117+
doReturn("http").when(request).getScheme();
118+
doReturn("localhost").when(request).getServerName();
119+
doReturn(8080).when(request).getServerPort();
120+
doReturn("/").when(request).getContextPath();
121+
122+
// XForwarded content
123+
doReturn("https").when(request).getHeader("X-Forwarded-Proto");
124+
var items = new ArrayList<String>();
125+
items.add("open-vsx.org");
126+
items.add("foo.com");
127+
items.add("bar.com");
128+
doReturn(Collections.enumeration(items)).when(request).getHeaders("X-Forwarded-Host");
129+
doReturn("/openvsx").when(request).getHeader("X-Forwarded-Prefix");
130+
assertThat(UrlUtil.getBaseUrl(request)).isEqualTo("https://open-vsx.org/openvsx/");
131+
}
132+
133+
// Check base URL is using comma separated X-Forwarded-Host headers
134+
@Test
135+
public void testWithXForwardedHostCommaSeparated() throws Exception {
136+
// basic request
137+
doReturn("http").when(request).getScheme();
138+
doReturn("localhost").when(request).getServerName();
139+
doReturn(8080).when(request).getServerPort();
140+
doReturn("/").when(request).getContextPath();
141+
142+
// XForwarded content
143+
doReturn("https").when(request).getHeader("X-Forwarded-Proto");
144+
var items = new ArrayList<String>();
145+
items.add("open-vsx.org, foo.com, bar.com");
146+
doReturn(Collections.enumeration(items)).when(request).getHeaders("X-Forwarded-Host");
147+
doReturn("/openvsx").when(request).getHeader("X-Forwarded-Prefix");
148+
assertThat(UrlUtil.getBaseUrl(request)).isEqualTo("https://open-vsx.org/openvsx/");
149+
}
107150

108151
}

0 commit comments

Comments
 (0)