Проблема с именем заголовков netty websocket в нижнем регистре - PullRequest
0 голосов
/ 23 мая 2018

Я использую netty для реализации сервера websocket.Сервер должен работать с некоторыми старыми клиентскими библиотеками websocket (написанными на других языках), которые не соблюдают правило нечувствительности к регистру HTTP-заголовка.Я сталкиваюсь с проблемой там.

Мой конвейер входящего канала довольно стандартный, который выглядит следующим образом.23.Наконец, я вижу, что ответ рукопожатия websocket, отправляемый клиенту, все в именах заголовков в нижнем регистре, как показано ниже.

upgrade: websocket\r\n
connection: upgrade\r\n
sec-websocket-accept: hex-values=\r\n

Но более старый клиент websocket ожидает заголовок в следующем формате.

Upgrade: websocket\r\n
Connection: Upgrade\r\n
Sec-WebSocket-Accept: hex-values=\r\n

В результате соединение веб-сокета не завершается.Кто-нибудь сталкивался с этой проблемой?

Строки заголовка приходят из класса HttpHeaderNames вместо класса HttpHeader.Исправление заключается в изменении WebSocketServerHandshaker13.newHandshakeResponse () для использования необходимого HttpHeader.Но это, возможно, потребует изменений в самом коде нетто.Может кто-нибудь предложить какой-нибудь более чистый способ обойти эту проблему без изменения кода netty?

  1. Есть ли способ добавить / изменить заголовок ответа http при использовании существующих классов рукопожатия netty websocket?
  2. Должен ли я написать собственный WebSocketServerProtocolHandler для достижения того же самого?
  3. Любой другой способ?

Цените любой ответ !!!

Большое спасибо заранее.

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Вы можете использовать Netty ChannelOutboundHandlerAdapter, чтобы изменить заголовок где-то в конвейере.После этого удалите этот обработчик из конвейера, чтобы он не мешал фреймам WebSocket.Пожалуйста, найдите код ниже.

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelOutboundHandlerAdapter;
import io.netty.channel.ChannelPromise;
import io.netty.handler.codec.http.HttpResponse;

public class OutboundHeadersChanger extends ChannelOutboundHandlerAdapter {

    @Override
    public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {
        if (msg instanceof HttpResponse) {
            ((HttpResponse) msg).headers().set("some-header", "some-header-value");
        }

        super.write(ctx, msg, promise);
    }
}
0 голосов
/ 23 мая 2018

Единственный способ - это реализовать это самостоятельно, к сожалению, поскольку это определенно «испорченное» поведение на стороне клиента.Что вы можете сделать, это добавить ChannelOutboundHandler к ChannelPipeline, который "исправит" заголовки для вас.

...