/*
 * Copyright (c) 2011-2019 Contributors to the Eclipse Foundation
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
 * which is available at https://www.apache.org/licenses/LICENSE-2.0.
 *
 * SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
 */
package io.vertx.core.http.impl;

import io.vertx.core.Handler;
import io.vertx.core.http.HttpServerRequest;
import io.vertx.core.http.ServerWebSocket;

import static io.vertx.core.http.HttpHeaders.UPGRADE;
import static io.vertx.core.http.HttpHeaders.WEBSOCKET;

An Handler<HttpServerRequest> decorator that handles
  • ServerWebSocket dispatch to a WebSocket handler when necessary.
  • invalid HTTP version sent by the client
Author:Julien Viet
/** * An {@code Handler<HttpServerRequest>} decorator that handles * <ul> * <li>{@code ServerWebSocket} dispatch to a WebSocket handler when necessary.</li> * <li>invalid HTTP version sent by the client</li> * </ul> * * * @author <a href="mailto:julien@julienviet.com">Julien Viet</a> */
public class Http1xServerRequestHandler implements Handler<HttpServerRequest> { private final HttpServerConnectionHandler handlers; public Http1xServerRequestHandler(HttpServerConnectionHandler handlers) { this.handlers = handlers; } @Override public void handle(HttpServerRequest req) { Handler<ServerWebSocket> wsHandler = handlers.wsHandler; Handler<HttpServerRequest> reqHandler = handlers.requestHandler; if (wsHandler != null ) { if (req.headers().contains(UPGRADE, WEBSOCKET, true) && handlers.server.wsAccept()) { // Missing upgrade header + null request handler will be handled when creating the handshake by sending a 400 error // handle((Http1xServerRequest) req, wsHandler); ((Http1xServerRequest)req).webSocket().onComplete(ar -> { if (ar.succeeded()) { ServerWebSocketImpl ws = (ServerWebSocketImpl) ar.result(); wsHandler.handle(ws); ws.tryHandshake(101); } else { // ???? } }); } else { if (reqHandler != null) { reqHandler.handle(req); } else { req.response().setStatusCode(400).end(); } } } else if (req.version() == null) { // Invalid HTTP version, i.e not HTTP/1.1 or HTTP/1.0 req.response().setStatusCode(501).end(); req.response().close(); } else { reqHandler.handle(req); } } }