File Coverage

blib/lib/Plack/Middleware/JSONP.pm
Criterion Covered Total %
statement 35 35 100.0
branch 6 8 75.0
condition 2 3 66.6
subroutine 8 8 100.0
pod 2 2 100.0
total 53 56 94.6


line stmt bran cond sub pod time code
1             package Plack::Middleware::JSONP;
2 1     1   7 use strict;
  1         1  
  1         36  
3 1     1   5 use parent qw(Plack::Middleware);
  1         2  
  1         4  
4 1     1   62 use Plack::Util;
  1         1  
  1         22  
5 1     1   562 use URI::Escape ();
  1         1495  
  1         30  
6              
7 1     1   7 use Plack::Util::Accessor qw/callback_key/;
  1         1  
  1         6  
8              
9             sub prepare_app {
10 2     2 1 3 my $self = shift;
11 2 100       5 unless (defined $self->callback_key) {
12 1         4 $self->callback_key('callback');
13             }
14             }
15              
16             sub call {
17 4     4 1 8 my($self, $env) = @_;
18 4         14 my $res = $self->app->($env);
19             $self->response_cb($res, sub {
20 4     4   6 my $res = shift;
21 4 50       13 if (defined $res->[2]) {
22 4         10 my $h = Plack::Util::headers($res->[1]);
23 4         14 my $callback_key = $self->callback_key;
24 4 100 66     26 if ($h->get('Content-Type') =~ m!/(?:json|javascript)! &&
25             $env->{QUERY_STRING} =~ /(?:^|&)$callback_key=([^&]+)/) {
26 2         23 my $cb = URI::Escape::uri_unescape($1);
27 2 50       37 if ($cb =~ /^[\w\.\[\]]+$/) {
28 2         4 my $body;
29 2         15 Plack::Util::foreach($res->[2], sub { $body .= $_[0] });
  3         10  
30 2         9 my $jsonp = "/**/$cb($body)";
31 2         7 $res->[2] = [ $jsonp ];
32 2         18 $h->set('Content-Length', length $jsonp);
33 2         7 $h->set('Content-Type', 'text/javascript');
34             }
35             }
36             }
37 4         42 });
38             }
39              
40             1;
41              
42             __END__