From f1abcba4eb6f1b5a96279a4df43bff39ececdbfa Mon Sep 17 00:00:00 2001 From: Brian Clozel Date: Thu, 20 Jul 2017 15:13:30 +0200 Subject: [PATCH] Support ipV6 Host addresses in HttpHeaders This commit parses the "Host" HTTP request header as an `InetSocketAddress`, while supporting IPv6 addresses like `[::1]`. This host string contains `:` chars even though it has no port information. Issue: SPR-15799 --- .../main/java/org/springframework/http/HttpHeaders.java | 7 ++++++- .../java/org/springframework/http/HttpHeadersTests.java | 8 ++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/spring-web/src/main/java/org/springframework/http/HttpHeaders.java b/spring-web/src/main/java/org/springframework/http/HttpHeaders.java index 1d6fb341ee..fb6884f260 100644 --- a/spring-web/src/main/java/org/springframework/http/HttpHeaders.java +++ b/spring-web/src/main/java/org/springframework/http/HttpHeaders.java @@ -971,7 +971,12 @@ public class HttpHeaders implements MultiValueMap, Serializable if (value == null) { return null; } - int idx = value.lastIndexOf(':'); + final int idx; + if (value.startsWith("[")) { + idx = value.indexOf(':', value.indexOf(']')); + } else { + idx = value.lastIndexOf(':'); + } String hostname = null; int port = 0; if (idx != -1 && idx < value.length() - 1) { diff --git a/spring-web/src/test/java/org/springframework/http/HttpHeadersTests.java b/spring-web/src/test/java/org/springframework/http/HttpHeadersTests.java index 362b9b2556..724de47e21 100644 --- a/spring-web/src/test/java/org/springframework/http/HttpHeadersTests.java +++ b/spring-web/src/test/java/org/springframework/http/HttpHeadersTests.java @@ -168,6 +168,14 @@ public class HttpHeadersTests { assertEquals("Invalid Host header", "localhost", headers.getFirst("Host")); } + @Test + public void ipv6Host() { + InetSocketAddress host = InetSocketAddress.createUnresolved("[::1]", 0); + headers.setHost(host); + assertEquals("Invalid Host header", host, headers.getHost()); + assertEquals("Invalid Host header", "[::1]", headers.getFirst("Host")); + } + @Test(expected = IllegalArgumentException.class) public void illegalETag() { String eTag = "v2.6";