private static URI resolveBaseUrl(HttpServerRequest request) throws URISyntaxException { String scheme = getScheme(request); String header = request.requestHeaders().get(HttpHeaderNames.HOST); if (header != null) { final int portIndex; if (header.startsWith("[")) { portIndex = header.indexOf(':', header.indexOf(']')); } else { portIndex = header.indexOf(':'); } if (portIndex != -1) { try { return new URI(scheme, null, header.substring(0, portIndex), Integer.parseInt(header.substring(portIndex + 1)), null, null, null); } catch (NumberFormatException ex) { throw new URISyntaxException(header, "Unable to parse port", portIndex); } } else { return new URI(scheme, header, null, null); } } else { InetSocketAddress localAddress = request.hostAddress(); return new URI(scheme, null, localAddress.getHostString(), localAddress.getPort(), null, null, null); } }
private static URI resolveBaseUrl(HttpServerRequest request) throws URISyntaxException { String scheme = getScheme(request); String header = request.requestHeaders().get(HttpHeaderNames.HOST); if (header != null) { final int portIndex; if (header.startsWith("[")) { portIndex = header.indexOf(':', header.indexOf(']')); } else { portIndex = header.indexOf(':'); } if (portIndex != -1) { try { return new URI(scheme, null, header.substring(0, portIndex), Integer.parseInt(header.substring(portIndex + 1)), null, null, null); } catch (NumberFormatException ex) { throw new URISyntaxException(header, "Unable to parse port", portIndex); } } else { return new URI(scheme, header, null, null); } } else { InetSocketAddress localAddress = request.hostAddress(); return new URI(scheme, null, localAddress.getHostString(), localAddress.getPort(), null, null, null); } }
private static URI resolveBaseUrl(HttpServerRequest request) throws URISyntaxException { String scheme = getScheme(request); String header = request.requestHeaders().get(HttpHeaderNames.HOST); if (header != null) { final int portIndex; if (header.startsWith("[")) { portIndex = header.indexOf(':', header.indexOf(']')); } else { portIndex = header.indexOf(':'); } if (portIndex != -1) { try { return new URI(scheme, null, header.substring(0, portIndex), Integer.parseInt(header.substring(portIndex + 1)), null, null, null); } catch (NumberFormatException ex) { throw new URISyntaxException(header, "Unable to parse port", portIndex); } } else { return new URI(scheme, header, null, null); } } else { InetSocketAddress localAddress = request.hostAddress(); return new URI(scheme, null, localAddress.getHostString(), localAddress.getPort(), null, null, null); } }
@Test public void xForwardedHostAndPort() { testClientRequest( clientRequestHeaders -> { clientRequestHeaders.add("X-Forwarded-Host", "192.168.0.1"); clientRequestHeaders.add("X-Forwarded-Port", "8080"); }, serverRequest -> { Assertions.assertThat(serverRequest.hostAddress().getHostString()).isEqualTo("192.168.0.1"); Assertions.assertThat(serverRequest.hostAddress().getPort()).isEqualTo(8080); }); }
@Test public void forwardedAllDirectives() { testClientRequest( clientRequestHeaders -> clientRequestHeaders.add("Forwarded", "host=a.example.com:443;proto=https"), serverRequest -> { Assertions.assertThat(serverRequest.hostAddress().getHostString()).isEqualTo("a.example.com"); Assertions.assertThat(serverRequest.hostAddress().getPort()).isEqualTo(443); Assertions.assertThat(serverRequest.scheme()).isEqualTo("https"); }); }
@Test public void forwardedHost() { testClientRequest( clientRequestHeaders -> clientRequestHeaders.add("Forwarded", "host=192.168.0.1"), serverRequest -> { Assertions.assertThat(serverRequest.hostAddress().getHostString()).isEqualTo("192.168.0.1"); Assertions.assertThat(serverRequest.hostAddress().getPort()).isEqualTo(this.connection.address().getPort()); }); }
@Test public void forwardedMultipleHosts() { testClientRequest( clientRequestHeaders -> clientRequestHeaders.add("Forwarded", "host=a.example.com,host=b.example.com, host=c.example.com"), serverRequest -> { Assertions.assertThat(serverRequest.hostAddress().getHostString()).isEqualTo("a.example.com"); Assertions.assertThat(serverRequest.hostAddress().getPort()).isEqualTo(this.connection.address().getPort()); }); }
@Test public void forwardedHostIpV6() { testClientRequest( clientRequestHeaders -> clientRequestHeaders.add("Forwarded", "host=[1abc:2abc:3abc::5ABC:6abc]"), serverRequest -> { Assertions.assertThat(serverRequest.hostAddress().getHostString()).isEqualTo("1abc:2abc:3abc:0:0:0:5abc:6abc"); Assertions.assertThat(serverRequest.hostAddress().getPort()).isEqualTo(this.connection.address().getPort()); }); }
@Test public void forwardedAllDirectivesQuoted() { testClientRequest( clientRequestHeaders -> clientRequestHeaders.add("Forwarded", "host=\"a.example.com:443\";proto=\"https\""), serverRequest -> { Assertions.assertThat(serverRequest.hostAddress().getHostString()).isEqualTo("a.example.com"); Assertions.assertThat(serverRequest.hostAddress().getPort()).isEqualTo(443); Assertions.assertThat(serverRequest.scheme()).isEqualTo("https"); }); }
@Test public void xForwardedHost() { testClientRequest( clientRequestHeaders -> clientRequestHeaders.add("X-Forwarded-Host", "[1abc:2abc:3abc::5ABC:6abc], 192.168.0.1"), serverRequest -> { Assertions.assertThat(serverRequest.hostAddress().getHostString()).isEqualTo("1abc:2abc:3abc:0:0:0:5abc:6abc"); Assertions.assertThat(serverRequest.hostAddress().getPort()).isEqualTo(this.connection.address().getPort()); }); }
@Test public void forwardedMultipleHeaders() { testClientRequest( clientRequestHeaders -> { clientRequestHeaders.add("Forwarded", "host=a.example.com:443;proto=https"); clientRequestHeaders.add("Forwarded", "host=b.example.com"); }, serverRequest -> { Assertions.assertThat(serverRequest.hostAddress().getHostString()).isEqualTo("a.example.com"); Assertions.assertThat(serverRequest.hostAddress().getPort()).isEqualTo(443); Assertions.assertThat(serverRequest.scheme()).isEqualTo("https"); }); }
@Test public void noHeaders() { testClientRequest( clientRequestHeaders -> {}, serverRequest -> { Assertions.assertThat(serverRequest.hostAddress().getHostString()) .containsPattern("^0:0:0:0:0:0:0:1(%\\w*)?|127.0.0.1$"); Assertions.assertThat(serverRequest.hostAddress().getPort()).isEqualTo(this.connection.address().getPort()); }); }
@Test public void xForwardedForHostAndPort() { testClientRequest( clientRequestHeaders -> { clientRequestHeaders.add("X-Forwarded-For", "192.168.0.1"); clientRequestHeaders.add("X-Forwarded-Host", "a.example.com"); clientRequestHeaders.add("X-Forwarded-Port", "8080"); }, serverRequest -> { Assertions.assertThat(serverRequest.remoteAddress().getHostString()).isEqualTo("192.168.0.1") ; Assertions.assertThat(serverRequest.hostAddress().getHostString()).isEqualTo("a.example.com"); Assertions.assertThat(serverRequest.hostAddress().getPort()).isEqualTo(8080); }); }