当前位置: 首页 > 知识库问答 >
问题:

netty websocket标题名称小写的问题

时经纬
2023-03-14

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

我的入站通道管道非常标准,看起来像下面的HttpServerCodec -

在netty 4 . 1 . 23 . final版本中,我看到发送给客户端的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连接不完整。有人遇到过这个问题吗?

标头字符串来自标题名称类,而不是 Http 标头类。修复方法是将 WebSocket服务器摇手器13.new摇手响应() 更改为使用所需的 HttpHeader。但这可能需要改变网络代码本身。有人可以建议任何更干净的方法来解决这个问题,而不改变网络代码吗?

  1. 在使用现有的netty-websocket握手类时,是否需要添加/修改http响应头
  2. 我应该编写自定义WebSocketServerProtocolHandler来实现同样的功能
  3. 还有其他方法吗

感谢任何回复!!!

提前致谢。

共有2个答案

穆俊哲
2023-03-14

您可以使用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);
    }
}
郝池暝
2023-03-14

唯一的办法就是自己实现它,因为这肯定是客户端的“坏”行为。您可以做的是将ChannelOutboundHandler添加到ChannelPipeline

 类似资料:
  • Linux、Solaris、BSD及其他类Unix操作系统使用的是大小写敏感的文件系统,而Windows和Mac OS X(默认安装)的文件系统则是大小写不敏感的文件系统。即用文件名README、readme以及Readme(混合大小写)进行访问,在Linux等操作系统上访问的是不同的文件,而在Windows和Mac OS X上则指向同一个文件。换句话说,两个不同文件README和readme在L

  • 问题内容: @Column(name=”DateOfBirth”) private Date dateOfBirth; 我特别需要上面的代码来创建一个名为“DateOfBirth”的列,相反,Hibernate为我提供了一个名为date_of_birth的列。我该如何更改?有没有web.xml属性?我遇到了DefaultNamingStrategy和改进的NamingStrategy,但是不确定如

  • 我在mysql工作台上设计了一个数据库。当我转到forward engineer时,我得到了(错误号:121),因为我在多个表中使用了相同的外键,我意识到这是不允许的。我有相当多的连接表,主要是n:m关系。对于这些连接表中的大多数,我都使用复合主键(由2个外键组成)。我的问题是我必须重命名这些主键和外键是唯一的吗?谢谢你的帮助。 (在下面的代码中,我还没有重命名外键)

  • 我有一个Spring Boot应用程序,它在HSQLDB中用flyway生成一个模式。 问题是所有表名和列名都转换为大写(TBL_ROLE、ID、NAME)。目的是使db中的名称与我的脚本中定义的名称完全相同。

  • 问题内容: 我正在从源头解析XML文档,并且它们使用自定义名称空间。 例如。当我使用SimpleXML进行解析时,mostix:名称空间元素均未显示或不可访问。可能是一个非常简单的解决方案,但是有什么想法吗? 问题答案: 通常,人们使用children()。

  • 我正在开发一个应该删除命名列的小PowerShell脚本。有没有办法不选择标题为“xyz”的列? 我试图通过 并将结果连接到逗号分隔的字符串中并删除不需要的标头 然后使用