From 9510bbeda61c29c5faf00c773b648ad99aa7638a Mon Sep 17 00:00:00 2001 From: "$(git --no-pager log --format=format:'%an' -n 1)" <$(git --no-pager log --format=format:'%ae' -n 1)> Date: Thu, 18 Apr 2024 15:56:19 -0700 Subject: [PATCH 1/3] Lazy cache originalhost --- .../message/http/HttpRequestMessageImpl.java | 17 ++++++- .../http/HttpRequestMessageImplTest.java | 45 +++++++++++++++++++ 2 files changed, 61 insertions(+), 1 deletion(-) 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..e133bd9e56 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 @@ -64,6 +64,9 @@ public class HttpRequestMessageImpl implements HttpRequestMessage { private static final DynamicStringProperty REGEX_PTNS_TO_STRIP_PROP = new DynamicStringProperty("zuul.request.cookie.cleaner.strip", " Secure,"); + private static final CachedDynamicBooleanProperty CACHE_ORIGINAL_HOST = + new CachedDynamicBooleanProperty("zuul.HttpRequestMessage.original.host.cache", false); + private static final List RE_STRIP; static { @@ -97,6 +100,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,12 +514,23 @@ protected String generateInfoForLogging() { @Override public String getOriginalHost() { try { - return getOriginalHost(getHeaders(), getServerName()); + if (!CACHE_ORIGINAL_HOST.get()) { + return generateOriginalHost(getHeaders(), getServerName()); + } + + if (originalHost == null) { + originalHost = generateOriginalHost(getHeaders(), getServerName()); + } + return originalHost; } catch (URISyntaxException e) { throw new IllegalArgumentException(e); } } + String generateOriginalHost(Headers headers, String serverName) throws URISyntaxException { + return getOriginalHost(headers, serverName); + } + @VisibleForTesting static String getOriginalHost(Headers headers, String serverName) throws URISyntaxException { String xForwardedHost = headers.getFirst(HttpHeaderNames.X_FORWARDED_HOST); 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..3a114540e1 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,51 @@ void testPathAndQuery_immutable() { assertEquals("/blah", request.getPathAndQuery()); } + @Test + void testGetOriginalHost_immutable() throws Exception { + config.setProperty("zuul.HttpRequestMessage.original.host.cache", true); + + 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()); + + request = new HttpRequestMessageImpl( + new SessionContext(), + "HTTP/1.1", + "POST", + "/some/where", + queryParams, + headers, + "192.168.0.2", + "https", + 7002, + "localhost", + new SocketAddress() {}, + true); + request = spy(request); + when(request.generateOriginalHost(headers, "localhost")).thenReturn("testOriginalHost"); + assertEquals("testOriginalHost", request.getOriginalHost()); + assertEquals("testOriginalHost", request.getOriginalHost()); + verify(request).generateOriginalHost(headers, "localhost"); + } + @Test void testGetOriginalHost() { HttpQueryParams queryParams = new HttpQueryParams(); From 811e370e86ace46f451c84d85ebc9375562c5ea8 Mon Sep 17 00:00:00 2001 From: "$(git --no-pager log --format=format:'%an' -n 1)" <$(git --no-pager log --format=format:'%ae' -n 1)> Date: Fri, 19 Apr 2024 09:19:16 -0700 Subject: [PATCH 2/3] Update toString function --- .../com/netflix/zuul/message/http/HttpRequestMessageImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 e133bd9e56..109efbe4ad 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 @@ -715,7 +715,8 @@ public String toString() { + inboundRequest + ", parsedCookies=" + parsedCookies + ", reconstructedUri='" + reconstructedUri + '\'' + ", pathAndQuery='" - + pathAndQuery + '\'' + ", infoForLogging='" + + pathAndQuery + '\'' + "/ originalHost='" + + originalHost + '\'' + ", infoForLogging='" + infoForLogging + '\'' + '}'; } } From 542b81b6703d488c612e704b442521bec68def1b Mon Sep 17 00:00:00 2001 From: "$(git --no-pager log --format=format:'%an' -n 1)" <$(git --no-pager log --format=format:'%ae' -n 1)> Date: Mon, 29 Apr 2024 09:10:25 -0700 Subject: [PATCH 3/3] Update unittests --- .../message/http/HttpRequestMessageImpl.java | 17 +++---------- .../http/HttpRequestMessageImplTest.java | 25 +++---------------- 2 files changed, 7 insertions(+), 35 deletions(-) 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 109efbe4ad..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 @@ -64,9 +64,6 @@ public class HttpRequestMessageImpl implements HttpRequestMessage { private static final DynamicStringProperty REGEX_PTNS_TO_STRIP_PROP = new DynamicStringProperty("zuul.request.cookie.cleaner.strip", " Secure,"); - private static final CachedDynamicBooleanProperty CACHE_ORIGINAL_HOST = - new CachedDynamicBooleanProperty("zuul.HttpRequestMessage.original.host.cache", false); - private static final List RE_STRIP; static { @@ -514,12 +511,8 @@ protected String generateInfoForLogging() { @Override public String getOriginalHost() { try { - if (!CACHE_ORIGINAL_HOST.get()) { - return generateOriginalHost(getHeaders(), getServerName()); - } - if (originalHost == null) { - originalHost = generateOriginalHost(getHeaders(), getServerName()); + originalHost = getOriginalHost(getHeaders(), getServerName()); } return originalHost; } catch (URISyntaxException e) { @@ -527,10 +520,6 @@ public String getOriginalHost() { } } - String generateOriginalHost(Headers headers, String serverName) throws URISyntaxException { - return getOriginalHost(headers, serverName); - } - @VisibleForTesting static String getOriginalHost(Headers headers, String serverName) throws URISyntaxException { String xForwardedHost = headers.getFirst(HttpHeaderNames.X_FORWARDED_HOST); @@ -677,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)) { @@ -689,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 ""; 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 3a114540e1..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 @@ -306,9 +306,7 @@ void testPathAndQuery_immutable() { } @Test - void testGetOriginalHost_immutable() throws Exception { - config.setProperty("zuul.HttpRequestMessage.original.host.cache", true); - + void testGetOriginalHost_immutable() { HttpQueryParams queryParams = new HttpQueryParams(); Headers headers = new Headers(); headers.add("Host", "blah.netflix.com"); @@ -330,24 +328,9 @@ void testGetOriginalHost_immutable() throws Exception { assertEquals("blah.netflix.com", request.getOriginalHost()); assertEquals("blah.netflix.com", request.getOriginalHost()); - request = new HttpRequestMessageImpl( - new SessionContext(), - "HTTP/1.1", - "POST", - "/some/where", - queryParams, - headers, - "192.168.0.2", - "https", - 7002, - "localhost", - new SocketAddress() {}, - true); - request = spy(request); - when(request.generateOriginalHost(headers, "localhost")).thenReturn("testOriginalHost"); - assertEquals("testOriginalHost", request.getOriginalHost()); - assertEquals("testOriginalHost", request.getOriginalHost()); - verify(request).generateOriginalHost(headers, "localhost"); + // Update the Host header value and ensure the result didn't change. + headers.set("Host", "testOriginalHost2"); + assertEquals("blah.netflix.com", request.getOriginalHost()); } @Test