Support RFC 8441 upgrades over HTTP/2 CONNECT
See gh-34362 Signed-off-by: Jared Wiltshire <jazdw@users.noreply.github.com>
This commit is contained in:
parent
d59991fcc9
commit
49f9b40fba
|
@ -205,23 +205,25 @@ public class HandshakeWebSocketService implements WebSocketService, Lifecycle {
|
|||
HttpMethod method = request.getMethod();
|
||||
HttpHeaders headers = request.getHeaders();
|
||||
|
||||
if (HttpMethod.GET != method && CONNECT_METHOD != method) {
|
||||
if (HttpMethod.GET != method && !CONNECT_METHOD.equals(method)) {
|
||||
return Mono.error(new MethodNotAllowedException(
|
||||
request.getMethod(), Set.of(HttpMethod.GET, CONNECT_METHOD)));
|
||||
}
|
||||
|
||||
if (!"WebSocket".equalsIgnoreCase(headers.getUpgrade())) {
|
||||
return handleBadRequest(exchange, "Invalid 'Upgrade' header: " + headers);
|
||||
}
|
||||
if (HttpMethod.GET == method) {
|
||||
if (!"WebSocket".equalsIgnoreCase(headers.getUpgrade())) {
|
||||
return handleBadRequest(exchange, "Invalid 'Upgrade' header: " + headers);
|
||||
}
|
||||
|
||||
List<String> connectionValue = headers.getConnection();
|
||||
if (!connectionValue.contains("Upgrade") && !connectionValue.contains("upgrade")) {
|
||||
return handleBadRequest(exchange, "Invalid 'Connection' header: " + headers);
|
||||
}
|
||||
List<String> connectionValue = headers.getConnection();
|
||||
if (!connectionValue.contains("Upgrade") && !connectionValue.contains("upgrade")) {
|
||||
return handleBadRequest(exchange, "Invalid 'Connection' header: " + headers);
|
||||
}
|
||||
|
||||
String key = headers.getFirst(SEC_WEBSOCKET_KEY);
|
||||
if (key == null) {
|
||||
return handleBadRequest(exchange, "Missing \"Sec-WebSocket-Key\" header");
|
||||
String key = headers.getFirst(SEC_WEBSOCKET_KEY);
|
||||
if (key == null) {
|
||||
return handleBadRequest(exchange, "Missing \"Sec-WebSocket-Key\" header");
|
||||
}
|
||||
}
|
||||
|
||||
String protocol = selectProtocol(headers, handler);
|
||||
|
|
|
@ -151,7 +151,7 @@ public class WebSocketHttpHeaders extends HttpHeaders {
|
|||
}
|
||||
|
||||
/**
|
||||
* Returns the value of the {@code Sec-WebSocket-Key} header.
|
||||
* Returns the value of the {@code Sec-WebSocket-Protocol} header.
|
||||
* @return the value of the header
|
||||
*/
|
||||
public List<String> getSecWebSocketProtocol() {
|
||||
|
|
|
@ -215,7 +215,7 @@ public abstract class AbstractHandshakeHandler implements HandshakeHandler, Life
|
|||
}
|
||||
try {
|
||||
HttpMethod httpMethod = request.getMethod();
|
||||
if (HttpMethod.GET != httpMethod && CONNECT_METHOD != httpMethod) {
|
||||
if (HttpMethod.GET != httpMethod && !CONNECT_METHOD.equals(httpMethod)) {
|
||||
response.setStatusCode(HttpStatus.METHOD_NOT_ALLOWED);
|
||||
response.getHeaders().setAllow(Set.of(HttpMethod.GET, CONNECT_METHOD));
|
||||
if (logger.isErrorEnabled()) {
|
||||
|
@ -223,13 +223,15 @@ public abstract class AbstractHandshakeHandler implements HandshakeHandler, Life
|
|||
}
|
||||
return false;
|
||||
}
|
||||
if (!"WebSocket".equalsIgnoreCase(headers.getUpgrade())) {
|
||||
handleInvalidUpgradeHeader(request, response);
|
||||
return false;
|
||||
}
|
||||
if (!headers.getConnection().contains("Upgrade") && !headers.getConnection().contains("upgrade")) {
|
||||
handleInvalidConnectHeader(request, response);
|
||||
return false;
|
||||
if (HttpMethod.GET == httpMethod) {
|
||||
if (!"WebSocket".equalsIgnoreCase(headers.getUpgrade())) {
|
||||
handleInvalidUpgradeHeader(request, response);
|
||||
return false;
|
||||
}
|
||||
if (!headers.getConnection().contains("Upgrade") && !headers.getConnection().contains("upgrade")) {
|
||||
handleInvalidConnectHeader(request, response);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (!isWebSocketVersionSupported(headers)) {
|
||||
handleWebSocketVersionNotSupported(request, response);
|
||||
|
@ -239,13 +241,15 @@ public abstract class AbstractHandshakeHandler implements HandshakeHandler, Life
|
|||
response.setStatusCode(HttpStatus.FORBIDDEN);
|
||||
return false;
|
||||
}
|
||||
String wsKey = headers.getSecWebSocketKey();
|
||||
if (wsKey == null) {
|
||||
if (logger.isErrorEnabled()) {
|
||||
logger.error("Missing \"Sec-WebSocket-Key\" header");
|
||||
if (HttpMethod.GET == httpMethod) {
|
||||
String wsKey = headers.getSecWebSocketKey();
|
||||
if (wsKey == null) {
|
||||
if (logger.isErrorEnabled()) {
|
||||
logger.error("Missing \"Sec-WebSocket-Key\" header");
|
||||
}
|
||||
response.setStatusCode(HttpStatus.BAD_REQUEST);
|
||||
return false;
|
||||
}
|
||||
response.setStatusCode(HttpStatus.BAD_REQUEST);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
catch (IOException ex) {
|
||||
|
|
Loading…
Reference in New Issue