Skip to content

Commit ef6981a

Browse files
committed
[UNDERTOW-2576] ProxyHandler can throw NullPointerException if the source address SocketAddress has no ip address
1 parent 895346a commit ef6981a

File tree

2 files changed

+46
-3
lines changed

2 files changed

+46
-3
lines changed

core/src/main/java/io/undertow/server/handlers/proxy/ProxyHandler.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -482,9 +482,13 @@ public void run() {
482482
final String remoteHost;
483483
final SocketAddress address = exchange.getSourceAddress();
484484
if (address != null) {
485-
remoteHost = ((InetSocketAddress) address).getAddress().getHostAddress();
486-
if(!((InetSocketAddress) address).isUnresolved()) {
487-
request.putAttachment(ProxiedRequestAttachments.REMOTE_ADDRESS, ((InetSocketAddress) address).getAddress().getHostAddress());
485+
if (((InetSocketAddress) address).getAddress() != null){
486+
remoteHost = ((InetSocketAddress) address).getAddress().getHostAddress();
487+
if(!((InetSocketAddress) address).isUnresolved()) {
488+
request.putAttachment(ProxiedRequestAttachments.REMOTE_ADDRESS, ((InetSocketAddress) address).getAddress().getHostAddress());
489+
}
490+
} else {
491+
remoteHost = ((InetSocketAddress) address).getHostString();
488492
}
489493
} else {
490494
//should never happen, unless this is some form of mock request

core/src/test/java/io/undertow/server/handlers/proxy/ProxyHandlerXForwardedForTestCase.java

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import org.junit.runner.RunWith;
1515
import org.xnio.OptionMap;
1616
import org.xnio.Options;
17+
import io.undertow.Handlers;
1718
import io.undertow.Undertow;
1819
import io.undertow.protocols.ssl.UndertowXnioSsl;
1920
import io.undertow.server.HttpHandler;
@@ -70,6 +71,18 @@ public static void teardown() throws Exception {
7071

7172
}
7273

74+
private static void setProxyHandlerWithPeerAddressHandler(boolean rewriteHostHeader, boolean reuseXForwarded) throws Exception {
75+
76+
HttpHandler rootHandler = ProxyHandler.builder().setProxyClient((new LoadBalancingProxyClient()
77+
.setConnectionsPerThread(4)
78+
.addHost(new URI("https", null, DefaultServer.getHostAddress("default"), handlerPort, null, null, null), "s1", ssl)))
79+
.setMaxRequestTime(10000)
80+
.setRewriteHostHeader(rewriteHostHeader)
81+
.setReuseXForwarded(reuseXForwarded).build();
82+
83+
DefaultServer.setRootHandler(Handlers.proxyPeerAddress(rootHandler));
84+
}
85+
7386
private static void setProxyHandler(boolean rewriteHostHeader, boolean reuseXForwarded) throws Exception {
7487

7588
DefaultServer.setRootHandler(ProxyHandler.builder().setProxyClient((new LoadBalancingProxyClient()
@@ -166,11 +179,37 @@ public void testRewriteHostHeader() throws Exception {
166179
}
167180
}
168181

182+
@Test
183+
public void testWithProxyPeerAddressHandler() throws Exception {
184+
setProxyHandlerWithPeerAddressHandler(false, false);
185+
TestHttpClient client = new TestHttpClient();
186+
187+
try {
188+
HttpGet get = new HttpGet(DefaultServer.getDefaultServerURL() + "/x-forwarded");
189+
get.addHeader(Headers.X_FORWARDED_FOR.toString(), "localhost");
190+
HttpResponse result = client.execute(get);
191+
Assert.assertEquals(StatusCodes.OK, result.getStatusLine().getStatusCode());
192+
193+
Assert.assertEquals(port, Integer.parseInt(result.getFirstHeader(Headers.X_FORWARDED_PORT.toString()).getValue()));
194+
Assert.assertEquals("http", result.getFirstHeader(Headers.X_FORWARDED_PROTO.toString()).getValue());
195+
Assert.assertEquals(DefaultServer.getHostAddress(), result.getFirstHeader(Headers.X_FORWARDED_HOST.toString()).getValue());
196+
Assert.assertEquals("localhost", result.getFirstHeader(Headers.X_FORWARDED_FOR.toString()).getValue());
197+
198+
} finally {
199+
client.getConnectionManager().shutdown();
200+
}
201+
}
202+
169203
protected static final class XForwardedHandler implements HttpHandler {
170204

171205
@Override
172206
public void handleRequest(final HttpServerExchange exchange) throws Exception {
173207
// Copy the X-Fowarded* headers into the response
208+
try {
209+
//Thread.sleep(5000);
210+
} catch (Exception e){
211+
// no op
212+
}
174213
if (exchange.getRequestHeaders().contains(Headers.X_FORWARDED_FOR))
175214
exchange.getResponseHeaders().put(Headers.X_FORWARDED_FOR, exchange.getRequestHeaders().getFirst(Headers.X_FORWARDED_FOR));
176215

0 commit comments

Comments
 (0)