diff --git a/zuul-core/src/main/java/com/netflix/zuul/message/http/HttpRequestMessageImpl.java b/zuul-core/src/main/java/com/netflix/zuul/message/http/HttpRequestMessageImpl.java index 4cc24192dc..8f56a7f784 100644 --- a/zuul-core/src/main/java/com/netflix/zuul/message/http/HttpRequestMessageImpl.java +++ b/zuul-core/src/main/java/com/netflix/zuul/message/http/HttpRequestMessageImpl.java @@ -97,6 +97,7 @@ public class HttpRequestMessageImpl implements HttpRequestMessage { private String reconstructedUri = null; private String pathAndQuery = null; private String infoForLogging = null; + private String originalHost = null; private static final SocketAddress UNDEFINED_CLIENT_DEST_ADDRESS = new SocketAddress() { @Override @@ -510,7 +511,10 @@ protected String generateInfoForLogging() { @Override public String getOriginalHost() { try { - return getOriginalHost(getHeaders(), getServerName()); + if (originalHost == null) { + originalHost = getOriginalHost(getHeaders(), getServerName()); + } + return originalHost; } catch (URISyntaxException e) { throw new IllegalArgumentException(e); } @@ -662,7 +666,7 @@ protected String _reconstructURI() { String scheme = getOriginalScheme().toLowerCase(); uri.append(scheme); - uri.append(URI_SCHEME_SEP).append(getOriginalHost(getHeaders(), getServerName())); + uri.append(URI_SCHEME_SEP).append(getOriginalHost()); int port = getOriginalPort(); if ((URI_SCHEME_HTTP.equals(scheme) && 80 == port) || (URI_SCHEME_HTTPS.equals(scheme) && 443 == port)) { @@ -674,7 +678,7 @@ protected String _reconstructURI() { uri.append(getPathAndQuery()); return uri.toString(); - } catch (URISyntaxException e) { + } catch (IllegalArgumentException e) { // This is not really so bad, just debug log it and move on. LOG.debug("Error reconstructing request URI!", e); return ""; @@ -700,7 +704,8 @@ public String toString() { + inboundRequest + ", parsedCookies=" + parsedCookies + ", reconstructedUri='" + reconstructedUri + '\'' + ", pathAndQuery='" - + pathAndQuery + '\'' + ", infoForLogging='" + + pathAndQuery + '\'' + "/ originalHost='" + + originalHost + '\'' + ", infoForLogging='" + infoForLogging + '\'' + '}'; } } diff --git a/zuul-core/src/test/java/com/netflix/zuul/message/http/HttpRequestMessageImplTest.java b/zuul-core/src/test/java/com/netflix/zuul/message/http/HttpRequestMessageImplTest.java index e35dfec51b..2e2419a224 100644 --- a/zuul-core/src/test/java/com/netflix/zuul/message/http/HttpRequestMessageImplTest.java +++ b/zuul-core/src/test/java/com/netflix/zuul/message/http/HttpRequestMessageImplTest.java @@ -305,6 +305,34 @@ void testPathAndQuery_immutable() { assertEquals("/blah", request.getPathAndQuery()); } + @Test + void testGetOriginalHost_immutable() { + HttpQueryParams queryParams = new HttpQueryParams(); + Headers headers = new Headers(); + headers.add("Host", "blah.netflix.com"); + request = new HttpRequestMessageImpl( + new SessionContext(), + "HTTP/1.1", + "POST", + "/some/where", + queryParams, + headers, + "192.168.0.2", + "https", + 7002, + "localhost", + new SocketAddress() {}, + true); + + // Check it's the same value 2nd time. + assertEquals("blah.netflix.com", request.getOriginalHost()); + assertEquals("blah.netflix.com", request.getOriginalHost()); + + // Update the Host header value and ensure the result didn't change. + headers.set("Host", "testOriginalHost2"); + assertEquals("blah.netflix.com", request.getOriginalHost()); + } + @Test void testGetOriginalHost() { HttpQueryParams queryParams = new HttpQueryParams();