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   58034 use strict;
  5         12  
  5         118  
4 5     5   22 use warnings;
  5         9  
  5         130  
5              
6 5     5   26 use base 'Protocol::WebSocket::Handshake';
  5         14  
  5         1891  
7              
8 5     5   32 use Protocol::WebSocket::Request;
  5         11  
  5         101  
9 5     5   1657 use Protocol::WebSocket::Frame;
  5         19  
  5         1964  
10              
11             sub new_from_psgi {
12 2     2 1 968 my $class = shift;
13              
14 2         12 my $req = Protocol::WebSocket::Request->new_from_psgi(@_);
15 2         11 my $self = $class->new(req => $req);
16              
17 2         5 return $self;
18             }
19              
20             sub parse {
21 51     51 1 151 my $self = shift;
22              
23 51         165 my $req = $self->req;
24 51         157 my $res = $self->res;
25              
26 51 50       139 return 1 if $req->is_done;
27              
28 51 100       169 unless ($req->parse($_[0])) {
29 1         5 $self->error($req->error);
30 1         4 return;
31             }
32              
33 50 100 100     109 if ($req->is_body || $req->is_done) {
34 8         22 $res->version($req->version);
35 8         23 $res->host($req->host);
36              
37 8         33 $res->secure($req->secure);
38 8         23 $res->resource_name($req->resource_name);
39 8         26 $res->origin($req->origin);
40             }
41              
42 50 100 100     121 if ($req->version eq 'draft-ietf-hybi-00') {
    100 100        
43 4 100       13 if ($self->is_done) {
44 3         15 $res->checksum(undef);
45 3         13 $res->number1($req->number1);
46 3         14 $res->number2($req->number2);
47 3         19 $res->challenge($req->challenge);
48             }
49             else {
50 1         10 $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         13 $res->key($req->key);
57             }
58              
59 50         225 return 1;
60             }
61              
62 9     9 1 29 sub is_body { shift->req->is_body }
63 58     58 1 154 sub is_done { shift->req->is_done }
64             sub to_string {
65 8     8 1 24 my $self = shift;
66              
67 8 100       24 if ($self->is_body) {
    100          
68 1         5 return $self->{partial} = $self->res->to_string;
69             }
70             elsif ($self->{partial}) {
71 1         5 my $to_string = $self->res->to_string;
72              
73 1         35 $to_string =~ s/^\Q$self->{partial}\E//;
74              
75 1         7 return $to_string;
76             }
77              
78 6         25 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__