File Coverage

blib/lib/Protocol/WebSocket/Handshake/Server.pm
Criterion Covered Total %
statement 50 52 96.1
branch 15 16 93.7
condition 9 9 100.0
subroutine 10 11 90.9
pod 6 6 100.0
total 90 94 95.7


line stmt bran cond sub pod time code
1             package Protocol::WebSocket::Handshake::Server;
2              
3 5     5   63101 use strict;
  5         9  
  5         124  
4 5     5   23 use warnings;
  5         8  
  5         116  
5              
6 5     5   20 use base 'Protocol::WebSocket::Handshake';
  5         10  
  5         1777  
7              
8 5     5   31 use Protocol::WebSocket::Request;
  5         9  
  5         103  
9 5     5   1990 use Protocol::WebSocket::Frame;
  5         14  
  5         1844  
10              
11             sub new_from_psgi {
12 2     2 1 839 my $class = shift;
13              
14 2         10 my $req = Protocol::WebSocket::Request->new_from_psgi(@_);
15 2         22 my $self = $class->new(req => $req);
16              
17 2         3 return $self;
18             }
19              
20             sub parse {
21 51     51 1 116 my $self = shift;
22              
23 51         126 my $req = $self->req;
24 51         105 my $res = $self->res;
25              
26 51 50       125 return 1 if $req->is_done;
27              
28 51 100       154 unless ($req->parse($_[0])) {
29 1         3 $self->error($req->error);
30 1         4 return;
31             }
32              
33 50 100 100     103 if ($req->is_body || $req->is_done) {
34 8         36 $res->version($req->version);
35 8         27 $res->host($req->host);
36              
37 8         32 $res->secure($req->secure);
38 8         23 $res->resource_name($req->resource_name);
39 8         21 $res->origin($req->origin);
40             }
41              
42 50 100 100     127 if ($req->version eq 'draft-ietf-hybi-00') {
    100 100        
43 4 100       7 if ($self->is_done) {
44 3         20 $res->checksum(undef);
45 3         7 $res->number1($req->number1);
46 3         9 $res->number2($req->number2);
47 3         7 $res->challenge($req->challenge);
48             }
49             else {
50 1         4 $res->checksum('');
51             }
52             }
53             elsif ($self->is_done && $req->version eq 'draft-ietf-hybi-10'
54             || $req->version eq 'draft-ietf-hybi-17')
55             {
56 4         11 $res->key($req->key);
57             }
58              
59 50         185 return 1;
60             }
61              
62 9     9 1 31 sub is_body { shift->req->is_body }
63 58     58 1 149 sub is_done { shift->req->is_done }
64             sub to_string {
65 8     8 1 22 my $self = shift;
66              
67 8 100       23 if ($self->is_body) {
    100          
68 1         3 return $self->{partial} = $self->res->to_string;
69             }
70             elsif ($self->{partial}) {
71 1         3 my $to_string = $self->res->to_string;
72              
73 1         23 $to_string =~ s/^\Q$self->{partial}\E//;
74              
75 1         5 return $to_string;
76             }
77              
78 6         21 return $self->res->to_string;
79             }
80              
81             sub build_frame {
82 0     0 1   my $self = shift;
83              
84 0           return Protocol::WebSocket::Frame->new(version => $self->version, @_);
85             }
86              
87             1;
88             __END__