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 1d6fb341ee7..fb6884f2607 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 362b9b25564..724de47e216 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";