Perl 发送带有websocket连接请求的标头(Mojolicious)

Perl 发送带有websocket连接请求的标头(Mojolicious),perl,websocket,mojolicious,Perl,Websocket,Mojolicious,我需要从Perl与服务器打开websocket连接。我在echo.websocket.org上使用了它,但是当我用真正的服务器替换websocket.org时,握手失败了。我怀疑我需要发送一些额外的标题,但我不确定如何做到这一点。我正在使用Mojolicious建立连接: 使用严格; 使用Mojo::UserAgent; 使用Mojo::IOLoop; #开口网袋 my$ua=Mojo::UserAgent->new; $ua->websocket('wss://someserver.com/'

我需要从Perl与服务器打开websocket连接。我在echo.websocket.org上使用了它,但是当我用真正的服务器替换websocket.org时,握手失败了。我怀疑我需要发送一些额外的标题,但我不确定如何做到这一点。我正在使用Mojolicious建立连接:

使用严格;
使用Mojo::UserAgent;
使用Mojo::IOLoop;
#开口网袋
my$ua=Mojo::UserAgent->new;
$ua->websocket('wss://someserver.com/' => {
'来源'=>'https://www.myserver.com',
“Sec WebSocket Extensions'=>“permessage deflate”
}=>子系统{
我的($ua,$tx)=@;
#检查WebSocket握手是否成功
除非($tx->is\u websocket){
打印“握手失败!\n”;
返回;
}
#等待WebSocket关闭
$tx->on(完成=>sub{
我的($tx,$code,$reason)=@;
打印“WebSocket已关闭,状态为$code。\n”;
});
#收到一条消息后关闭WebSocket
$tx->on(消息=>sub{
我的($tx,$msg)=@;
打印“WebSocket消息:$msg\n”;
$tx->finish;
});
#向服务器发送消息
$tx->发送(“你好,世界!”);
});
#如有必要,启动事件循环
Mojo::IOLoop->启动,除非Mojo::IOLoop->正在运行;
打印“完成。\n”;
如您所见,我正在尝试添加两个请求头:OriginSec-WebSocket-Extensions


这是正确的方法吗?我这样问是因为握手仍然失败。

一个正确的方法可能是在每次执行http请求时设置头,其中还应包括web套接字类型的请求。。。以web套接字服务器端指定的方式

my $ua  = Mojo::UserAgent->new;
$ua->on(start => sub {
   my ($ua, $tx) = @_;
   $tx->req->headers->header('Sec-WebSocket-Extensions' => 'foo-bar-extensions');
   $tx->req->headers->header('Origin' => 'foo-bar-origin'); 
});

$ua->websocket('ws://my.server/jsonecho' => sub {
   my ($ua, $tx) = @_;
   say 'WebSocket handshake failed!' and return unless $tx->is_websocket;
   $tx->on(json => sub {
   my ($tx, $hash) = @_;
   say "WebSocket message via JSON: $hash->{msg}";
   $tx->finish;
   });
   $tx->send({json => {msg => 'Hello World!'}});
 });

实际上,您要问的是如何解决一台服务器出现的问题,而不是另一台服务器出现的问题,而不提供关于另一台服务器的任何可用信息以及它到底是如何发生故障的。这使得我们无法理解问题发生的原因,也无法帮助您。相反,您似乎无缘无故地随机修改了一些额外的标题。而且,你不能仅仅添加一些任意的
Sec-WebSocket扩展
头而不实际支持给定的扩展。问题是:“如何向WebSocket连接请求添加额外的头”。问题不是“这里有什么问题”。正如我所说,我怀疑缺少某些头是这里的问题,但我不能确定,因为我无法在主要的文档中找到如何发送多个头。这是我的第一个问题:“这是发送额外标题的方式吗?”如果您只想知道这是否是添加标题的正确方式:是的,是的。为什么它仍然失败:不知道,因为不清楚您的服务器期望什么以及您的代码到底是如何失败的。例如,它可能在SSL握手过程中失败,而SSL握手过程甚至在它发送任何HTTP头之前。我知道文档说明了如何设置“Sec WebSocket Extensions”头。但它并没有提到你可以用同样的方法设置任意的头。如果可以的话,我想知道我所做的是否是发送多个头的正确方法。文档中甚至有一个示例,其中设置了
DNT
头。是的,您可以通过这种方式一次设置多个标题(只是尝试了一下),而且您的方式也是正确的。