netty websocket标题名称以小写形式出现

时间:2018-05-22 22:21:22

标签: websocket netty

我正在使用netty来实现websocket服务器。服务器需要使用一些旧的websocket客户端库(用其他语言编写),这些库不符合HTTP头不区分大小写的规则。我在那里面临一个问题。

我的入站通道管道非常标准,如下所示 HttpServerCodec - > HttpObjectAggregator - > HttpRequestBuilder - > WebSocketServerProtocolHandler - > WebSocketFrameAggregator - > CustomHandler

在netty版本4.1.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

因此,websocket连接无法完成。 有人遇到过这个问题吗?

标题字符串来自HttpHeaderNames类而不是HttpHeader类。修复是更改WebSocketServerHandshaker13.newHandshakeResponse()以使用所需的HttpHeader。但这可能需要改变网络代码本身。 有人建议任何更简洁的方法来解决这个问题而不改变网络代码吗?

  1. 在使用现有的netty websocket握手类时,是否还要添加/修改http响应头?
  2. 我应该编写自定义WebSocketServerProtocolHandler来实现相同的目的吗?
  3. 还有其他方式吗?
  4. 感谢任何回复!!!

    非常感谢。

2 个答案:

答案 0 :(得分:1)

唯一的方法是自己实施它,因为这绝对是一个“破坏”的#34;客户端的行为。您可以做的是向ChannelOutboundHandler添加ChannelPipeline,这将{"修复"标题为你。

答案 1 :(得分:1)

您可以使用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);
    }
}