Netty 4.0 - исключение WebSocketHandshakeException: не запрос WebSocket: отсутствует ключ - PullRequest
0 голосов
/ 05 июня 2019

У меня было следующее исключение с сервером веб-сокетов Netty 4.0

io.netty.handler.codec.http.websocketx.WebSocketHandshakeException: not a WebSocket request: missing key at io.netty.handler.codec.http.websocketx.WebSocketServerHandshaker13.newHandshakeResponse(WebSocketServerHandshaker13.java:104) at io.netty.handler.codec.http.websocketx.WebSocketServerHandshaker.handshake(WebSocketServerHandshaker.java:160) at io.netty.handler.codec.http.websocketx.WebSocketServerHandshaker.handshake(WebSocketServerHandshaker.java:135)

, но я не смог найти причину, почему это произошло с версиями Netty 4.x.

после нескольких часов трудолюбия я обнаружил, что когда мы используем WebSocketServerHandshakerFactory, мы должны передать FullHttpRequest рукопожатию.но проблема в том, что 'WebSocketServerHandshaker13' запрашивает параметры заголовка с помощью 'FullHttpRequest'.но конструктор DefaultFullHttpRequest не принимает параметры заголовка по умолчанию, мы должны установить его отдельно, после того, как проблема с параметрами заголовка, установленная с помощью FullHttpRequest, будет решена.

    WebSocketServerHandshakerFactory wsFactory =
            new WebSocketServerHandshakerFactory(getWebSocketURL(req), null, true);
    handshaker = wsFactory.newHandshaker(req);
    if (handshaker == null) {
        WebSocketServerHandshakerFactory.sendUnsupportedWebSocketVersionResponse(ctx.channel());
    } else {
        if(req instanceof HttpRequest){
            FullHttpRequest fullHttpRequest = new DefaultFullHttpRequest(req.getProtocolVersion(), req.getMethod(),req.getUri());
            fullHttpRequest.headers().set(req.headers());
            try{
                String fullReqHeadder = fullHttpRequest.headers().get(HttpHeaders.Names.SEC_WEBSOCKET_KEY);
                System.out.println("Full Req Headderr " + fullReqHeadder);
                handshaker.handshake(ctx.channel(), fullHttpRequest);
            }catch (Exception ex){
                ex.printStackTrace();
            }
        }

    }
}```
...