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   16 use 5.008;
  1         4  
4              
5 1     1   2 use strict;
  1         1  
  1         22  
6 1     1   3 use warnings;
  1         1  
  1         30  
7              
8 1     1   3 use Carp;
  1         2  
  1         101  
9 1     1   597 use Storable ();
  1         3440  
  1         35  
10              
11             our $VERSION = '0.014';
12              
13 1     1   5 use constant HASH_REF => ref {};
  1         4  
  1         117  
14              
15             BEGIN {
16 1     1   2 local $@ = undef;
17              
18             eval {
19 1         569 require HTTP::Status;
20 1         3604 *_status_message = \&HTTP::Status::status_message;
21 1         501 1;
22             } or *_status_message = sub {
23 0         0 my ( $status ) = @_;
24 0 0       0 return _is_success( $status ) ? 'OK' : 'Failed';
25 1 50       1 };
26             }
27              
28             sub new {
29 14     14 1 24 my ( $class, %arg ) = @_;
30             defined $arg{fn}
31 14 50       47 or $arg{fn} = 't/data/_http/status';
32 14 50       24 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         42 $arg{agent} = $class->_default_agent();
37             }
38 14   33     113 return bless \%arg, ref $class || $class;
39             }
40              
41             sub agent {
42 1     1 1 3 my ( $invocant ) = @_;
43 1 50       3 ref $invocant
44             or return $invocant->_default_agent();
45 1         3 return $invocant->{agent};
46             }
47              
48             sub _default_agent {
49 14     14   21 my ( $self ) = @_;
50 14   33     93 ( my $agent = ref $self || $self ) =~ s/ :: /-/smxg;
51 14         159 return join '/', "Mock $agent", $self->VERSION();
52             }
53              
54             # NOTE this is only the static functionality.
55             sub can_ssl {
56 12     12 1 22 local $@ = undef;
57 12         25 my ( $ok, $reason ) = ( 1, '' );
58 12 50       22 eval {
59 12         941 require IO::Socket::SSL;
60 12         68816 IO::Socket::SSL->VERSION( 1.42 );
61 12         55 1;
62             } or ( $ok, $reason ) =
63             ( 0, "IO::Socket::SSL 1.42 must be installed for https support\n" );
64             wantarray
65 12 100       55 or return $ok;
66 11         38 return ( $ok, $reason );
67             }
68              
69             sub head {
70 16     16 1 59 my ( $self, $url ) = @_;
71 16         33 return $self->request( HEAD => $url );
72             }
73              
74             sub request {
75 16     16 1 30 my ( $self, undef, $url ) = @_;
76 16   66     85 $self->{status} ||= Storable::retrieve( $self->{fn} );
77 16         1300 my $resp = $self->{status}{$url};
78 16 100 100     73 HASH_REF eq ref $resp
79             or $resp = {
80             status => $resp || 404,
81             };
82 16         35 $resp->{success} = _is_success( $resp->{status} );
83             defined $resp->{reason}
84 16 50       72 or $resp->{reason} = _status_message( $resp->{status} );
85             defined $resp->{url}
86 16 100       76 or $resp->{url} = $url;
87             defined $resp->{content}
88 16 50       35 or $resp->{content} = '';
89 16   50     86 $resp->{headers} ||= {};
90 16         52 return $resp;
91             }
92              
93             sub _is_success {
94 16     16   30 my ( $status ) = @_;
95 16   66     85 return $status >= 200 && $status < 300;
96             }
97              
98             1;
99              
100             __END__