From 84110a22bc1bb26c44de17802488a6f2d8d7f879 Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Thu, 8 Jul 2021 11:29:29 -0700 Subject: [PATCH] Don't change case of 'Sec-WebSocket-Key' Polish commit 5ca687c9a6b5 had an accidental side-effect of changing the 'Sec-WebSocket-Key' header value to lowercase. This breaks connections since the value needs to be echoed unchanged in the "Sec-WebSocket-Accept" header. Fixes gh-27147 --- .../boot/devtools/livereload/Connection.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/spring-boot-project/spring-boot-devtools/src/main/java/org/springframework/boot/devtools/livereload/Connection.java b/spring-boot-project/spring-boot-devtools/src/main/java/org/springframework/boot/devtools/livereload/Connection.java index 070dca8a4f5e..8e28a59c530e 100644 --- a/spring-boot-project/spring-boot-devtools/src/main/java/org/springframework/boot/devtools/livereload/Connection.java +++ b/spring-boot-project/spring-boot-devtools/src/main/java/org/springframework/boot/devtools/livereload/Connection.java @@ -23,7 +23,6 @@ import java.net.SocketTimeoutException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; -import java.util.Locale; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -44,7 +43,8 @@ class Connection { private static final Log logger = LogFactory.getLog(Connection.class); - private static final Pattern WEBSOCKET_KEY_PATTERN = Pattern.compile("^sec-websocket-key:(.*)$", Pattern.MULTILINE); + private static final Pattern WEBSOCKET_KEY_PATTERN = Pattern.compile("^sec-websocket-key:(.*)$", + Pattern.MULTILINE | Pattern.CASE_INSENSITIVE); public static final String WEBSOCKET_GUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; @@ -73,7 +73,7 @@ class Connection { this.outputStream = new ConnectionOutputStream(outputStream); String header = this.inputStream.readHeader(); logger.debug(LogMessage.format("Established livereload connection [%s]", header)); - this.header = header.toLowerCase(Locale.ENGLISH); + this.header = header; } /** @@ -81,10 +81,11 @@ class Connection { * @throws Exception in case of errors */ void run() throws Exception { - if (this.header.contains("upgrade: websocket") && this.header.contains("sec-websocket-version: 13")) { + String lowerCaseHeader = this.header.toLowerCase(); + if (lowerCaseHeader.contains("upgrade: websocket") && lowerCaseHeader.contains("sec-websocket-version: 13")) { runWebSocket(); } - if (this.header.contains("get /livereload.js")) { + if (lowerCaseHeader.contains("get /livereload.js")) { this.outputStream.writeHttp(getClass().getResourceAsStream("livereload.js"), "text/javascript"); } }