File Coverage

blib/lib/SockJS/Transport/JSONPPolling.pm
Criterion Covered Total %
statement 47 49 95.9
branch 10 12 83.3
condition 2 3 66.6
subroutine 7 7 100.0
pod 0 2 0.0
total 66 73 90.4


line stmt bran cond sub pod time code
1             package SockJS::Transport::JSONPPolling;
2              
3 1     1   480 use strict;
  1         2  
  1         28  
4 1     1   5 use warnings;
  1         2  
  1         28  
5              
6 1     1   6 use base 'SockJS::Transport::Base';
  1         2  
  1         434  
7              
8             sub new {
9 6     6 0 15028 my $self = shift->SUPER::new(@_);
10              
11 6         12 push @{$self->{allowed_methods}}, 'GET';
  6         15  
12              
13 6         25 return $self;
14             }
15              
16             sub dispatch_GET {
17 6     6 0 12 my $self = shift;
18 6         12 my ($env, $conn, $path) = @_;
19              
20 6         35 my ($callback) = $env->{QUERY_STRING} =~ m/(?:^|&|;)c=([^&;]+)/;
21 6 100       14 if (!$callback) {
22 1         6 return [500, [], ['"callback" parameter required']];
23             }
24              
25 5         14 $callback =~ s/%(..)/chr(hex($1))/eg;
  0         0  
26 5 100       21 if ($callback !~ m/^[a-zA-Z0-9-_\.]+$/) {
27 1         5 return [500, [], ['invalid "callback" parameter']];
28             }
29              
30             return sub {
31 4     4   582 my $respond = shift;
32              
33 4         37 my $writer = $respond->(
34             [ 200,
35             [ 'Content-Type' => 'application/javascript; charset=UTF-8',
36             'Connection' => 'close',
37             ]
38             ]
39             );
40              
41 4 100 66     25 if ($conn->is_connected && !$conn->is_reconnecting) {
42 1         14 my $message = $self->_wrap_message($callback,
43             'c[2010,"Another connection still open"]' . "\n");
44 1         13 $writer->write($message);
45 1         66 $writer->close;
46 1         39 return;
47             }
48              
49             $conn->write_cb(
50             sub {
51 3         7 my $conn = shift;
52 3         6 my ($message) = @_;
53              
54 3         16 $message = $self->_wrap_message($callback, $message);
55              
56 3         38 $writer->write($message);
57 3         202 $writer->write('');
58 3         202 $writer->close;
59              
60 3 50       133 $conn->reconnecting if $conn->is_connected;
61             }
62 3         21 );
63              
64 3 100       8 if ($conn->is_closed) {
    50          
65 1         3 $conn->connected;
66 1         3 $conn->close;
67             }
68             elsif ($conn->is_connected) {
69 0         0 $conn->reconnected;
70             }
71             else {
72 2         8 $conn->write('o');
73              
74 2         7 $conn->connected;
75             }
76 4         35 };
77             }
78              
79             sub _wrap_message {
80 4     4   8 my $self = shift;
81 4         9 my ($callback, $message) = @_;
82              
83 4         29 $message =~ s/(['""\\\/\n\r\t]{1})/\\$1/smg;
84 4         13 $message = qq{/**/$callback("$message");\r\n};
85              
86 4         9 return $message;
87             }
88              
89             1;