File Coverage

inc/Mock/HTTP/Tiny.pm
Criterion Covered Total %
statement 55 58 94.8
branch 13 24 54.1
condition 9 16 56.2
subroutine 14 14 100.0
pod 5 5 100.0
total 96 117 82.0


line stmt bran cond sub pod time code
1             package HTTP::Tiny;
2              
3 1     1   20 use 5.008;
  1         3  
4              
5 1     1   5 use strict;
  1         2  
  1         26  
6 1     1   6 use warnings;
  1         1  
  1         96  
7              
8 1     1   9 use Carp;
  1         1  
  1         159  
9 1     1   954 use Storable ();
  1         5726  
  1         56  
10              
11             our $VERSION = '0.013';
12              
13 1     1   9 use constant HASH_REF => ref {};
  1         22  
  1         184  
14              
15             BEGIN {
16 1     1   4 local $@ = undef;
17              
18             eval {
19 1         879 require HTTP::Status;
20 1         6723 *_status_message = \&HTTP::Status::status_message;
21 1         837 1;
22             } or *_status_message = sub {
23 0         0 my ( $status ) = @_;
24 0 0       0 return _is_success( $status ) ? 'OK' : 'Failed';
25 1 50       3 };
26             }
27              
28             sub new {
29 14     14 1 48 my ( $class, %arg ) = @_;
30             defined $arg{fn}
31 14 50       84 or $arg{fn} = 't/data/_http/status';
32 14 50       55 if ( defined $arg{agent} ) {
33             $arg{agent} =~ m/ \s \z /smx
34 0 0       0 and $arg{agent} .= $class->_default_agent();
35             } else {
36 14         71 $arg{agent} = $class->_default_agent();
37             }
38 14   33     150 return bless \%arg, ref $class || $class;
39             }
40              
41             sub agent {
42 1     1 1 3 my ( $invocant ) = @_;
43 1 50       5 ref $invocant
44             or return $invocant->_default_agent();
45 1         5 return $invocant->{agent};
46             }
47              
48             sub _default_agent {
49 14     14   34 my ( $self ) = @_;
50 14   33     165 ( my $agent = ref $self || $self ) =~ s/ :: /-/smxg;
51 14         243 return join '/', "Mock $agent", $self->VERSION();
52             }
53              
54             # NOTE this is only the static functionality.
55             sub can_ssl {
56 12     12 1 27 local $@ = undef;
57 12         44 my ( $ok, $reason ) = ( 1, '' );
58 12 50       33 eval {
59 12         1474 require IO::Socket::SSL;
60 12         129410 IO::Socket::SSL->VERSION( 1.42 );
61 12         88 1;
62             } or ( $ok, $reason ) =
63             ( 0, "IO::Socket::SSL 1.42 must be installed for https support\n" );
64             wantarray
65 12 100       47 or return $ok;
66 11         45 return ( $ok, $reason );
67             }
68              
69             sub head {
70 17     17 1 88 my ( $self, $url ) = @_;
71 17         70 return $self->request( HEAD => $url );
72             }
73              
74             sub request {
75 17     17 1 39 my ( $self, undef, $url ) = @_;
76 17   66     114 $self->{status} ||= Storable::retrieve( $self->{fn} );
77 17         1715 my $resp = $self->{status}{$url};
78 17 100 100     102 HASH_REF eq ref $resp
79             or $resp = {
80             status => $resp || 404,
81             };
82 17         128 $resp->{success} = _is_success( $resp->{status} );
83             defined $resp->{reason}
84 17 50       102 or $resp->{reason} = _status_message( $resp->{status} );
85             defined $resp->{url}
86 17 100       140 or $resp->{url} = $url;
87             defined $resp->{content}
88 17 50       54 or $resp->{content} = '';
89 17   50     112 $resp->{headers} ||= {};
90 17         132 return $resp;
91             }
92              
93             sub _is_success {
94 17     17   43 my ( $status ) = @_;
95 17   66     121 return $status >= 200 && $status < 300;
96             }
97              
98             1;
99              
100             __END__