Спасибо, хорошая идея!

Правда, модуль эти байты портит :-D

У него в недрах при пополнении буфера происходит декодирование UTF-8,
https://metacpan.org/source/VTI/Protocol-WebSocket-0.19/lib/Protocol/WebSocket/Frame.pm#L84

которое реагирует на двухбайтовую последовательность 00000011,11101000,
превращая её в 00000011,11111101.

Таким образом, закрывая на сервере соединение с кодом 1000 OK,
я получаю на клиенте 1021 OK ;-)

$ perl -MEncode -e '$a = pack "n", 1000; $b = Encode::decode("UTF-8",$a); print 
unpack "n", $b'
1021

Прилагаю скрипт-клиент и скрипт-сервер для наглядности.

В Fri, 2 Oct 2015 15:47:43 +0300
Dmitry Smal <[email protected]> пишет:

> Нет.  Close Frame приходит как обычный кусок данных.
> 
> Я использую примерно такой костыль
> > $client->on(read => sub {
> >     my ($client, $buf) = @_;
> >     if ($client->{frame_buffer}->opcode == 8) {
> >         $client->{close_code} = unpack('n', substr($buf, 0, 2));
> > # Вот это не проверял, проверьте!
> >         $client->{close_reason} = substr($buf, 2);
> > # Т.к. использую тектстовый код
> >         return;
> >     }
> 
> 
> On 10/02/2015 01:42 PM, Grigory Batalov wrote:
> > Всем привет!
> >
> > Можно ли в Protocol::WebSocket::Client получить код закрытия сокета,
> > как это делается в Mojo::UserAgent ?
> >
> > $tx->on(
> >      finish => sub {
> >          my ( $tx, $code, $reason ) = @_;
> >          say "WebSocket closed with status ($code) $reason.";
> >      }
> > );
> >
> > Мне это нужно для разделения корректно и некорректно закрытых
> > соединений.
> 

Attachment: test-client.pl
Description: Perl program

Attachment: test-serv.pl
Description: Perl program

-- 
Moscow.pm mailing list
[email protected] | http://moscow.pm.org

Ответить