我正在使用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。但这可能需要改变网络代码本身。 有人建议任何更简洁的方法来解决这个问题而不改变网络代码吗?
感谢任何回复!!!
非常感谢。
答案 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);
}
}