Отправка заголовков с запросом соединения через веб-сокет (Mojolicious) - PullRequest
0 голосов
/ 14 сентября 2018

Мне нужно открыть соединение через веб-сокет из Perl с сервером.Я получил его на echo.websocket.org, но когда я заменяю websocket.org реальным сервером, рукопожатие не удается.Я подозреваю, что мне нужно отправить несколько дополнительных заголовков, но я не уверен, как это сделать.Я использую Mojolicious, чтобы установить соединение:

use strict;

use Mojo::UserAgent;
use Mojo::IOLoop;

# Open WebSocket
my $ua = Mojo::UserAgent->new;
$ua->websocket('wss://someserver.com/' => {
'Origin' => 'https://www.myserver.com',
'Sec-WebSocket-Extensions' => 'permessage-deflate'
} => sub {
  my ($ua, $tx) = @_;

  # Check if WebSocket handshake was successful
  unless( $tx->is_websocket ) {
    print "Handshake failed!\n";
    return;
  }

  # Wait for WebSocket to be closed
  $tx->on(finish => sub {
    my ($tx, $code, $reason) = @_;
    print "WebSocket closed with status $code.\n";
  });

  # Close WebSocket after receiving one message
  $tx->on(message => sub {
    my ($tx, $msg) = @_;
    print "WebSocket message: $msg\n";
    $tx->finish;
  });

  # Send a message to the server
  $tx->send("Hello world!");
});

# Start event loop if necessary
Mojo::IOLoop->start unless Mojo::IOLoop->is_running;

print "Done.\n";

Как видите, я пытаюсь добавить два заголовка запроса: Origin и Sec-WebSocket-Extensions.

Это правильный способ сделать это?Я спрашиваю, потому что рукопожатие все еще не удается.

1 Ответ

0 голосов
/ 15 июля 2019

Один правильный способ может заключаться в установке заголовков каждый раз, когда вы выполняете запрос http, который также должен включать тип запросов веб-сокетов ... и способом, который указан на стороне сервера веб-сокетов ...

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!'}});
 });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...