File Coverage

blib/lib/Net/ACME2/HTTP_Tiny.pm
Criterion Covered Total %
statement 33 37 89.1
branch 3 6 50.0
condition 2 3 66.6
subroutine 9 9 100.0
pod 2 3 66.6
total 49 58 84.4


line stmt bran cond sub pod time code
1             package Net::ACME2::HTTP_Tiny;
2              
3             =encoding utf-8
4              
5             =head1 NAME
6              
7             Net::ACME2::HTTP_Tiny - HTTP client for Net::ACME
8              
9             =head1 SYNOPSIS
10              
11             use Net::ACME2::HTTP_Tiny;
12              
13             my $http = Net::ACME2::HTTP_Tiny->new();
14              
15             #NOTE: Unlike HTTP::Tiny’s method, this will die() if the HTTP
16             #session itself fails--for example, if the network connection was
17             #interrupted. These will be Net::ACME2::X::HTTP::Network instances.
18             #
19             #This also fails on HTTP errors (4xx and 5xx). The errors are
20             #instances of Net::ACME2::X::HTTP::Protocol.
21             #
22             my $resp_obj = $http->post_form( $the_url, \%the_form_post );
23              
24             =head1 DESCRIPTION
25              
26             This module largely duplicates the work of C, just without the
27             dependency on C (which brings in a mess of other undesirables).
28              
29             The chief benefit is that C and related methods will return
30             instances of C rather than simple hashes.
31              
32             This also always verifies remote SSL connections and always Cs if
33             either the network connection fails or the protocol indicates an error
34             (4xx or 5xx).
35              
36             =cut
37              
38 3     3   233652 use strict;
  3         24  
  3         84  
39 3     3   15 use warnings;
  3         6  
  3         74  
40              
41 3     3   12 use parent qw( HTTP::Tiny );
  3         4  
  3         15  
42              
43 3     3   135818 use HTTP::Tiny::UA::Response ();
  3         10736  
  3         60  
44              
45 3     3   821 use Net::ACME2::X ();
  3         8  
  3         53  
46              
47             # This circular dependency is unfortunate, but PAUSE needs to see a static
48             # $Net::ACME2::VERSION. (Thanks to Dan Book for pointing it out.)
49 3     3   1114 use Net::ACME2 ();
  3         7  
  3         879  
50              
51             sub VERSION {
52              
53             # HTTP::Tiny gets upset if there’s anything non-numeric
54             # (e.g., “-TRIAL1”) in VERSION(). So weed it out here.
55 19     19 0 1002 my $version = $Net::ACME2::VERSION;
56 19         50 $version =~ s<[^0-9].].*><>;
57              
58 19         89 return $version;
59             }
60              
61             #Use this to tweak SSL config, e.g., if you want to cache PublicSuffix.
62             our @SSL_OPTIONS;
63              
64             sub new {
65 19     19 1 63 my ( $class, %args ) = @_;
66              
67             $args{'SSL_options'} = {
68 19 50       87 ( $args{'SSL_options'} ? (%{ $args{'SSL_options'} }) : () ),
  0         0  
69             @SSL_OPTIONS,
70             };
71              
72 19         125 my $self = $class->SUPER::new(
73             verify_SSL => 1,
74             %args,
75             );
76              
77 19         56 return $self;
78             }
79              
80             #mocked in tests
81             *_base_request = HTTP::Tiny->can('request');
82              
83             sub request {
84 54     54 1 151 my ( $self, $method, $url, $args_hr ) = @_;
85              
86             #HTTP::Tiny clobbers $@. The clobbering is useless since the
87             #error is in the $resp variable already. Clobbering also risks
88             #action-at-a-distance problems, so prevent it here.
89              
90             #cf. eval_bug.readme
91 54         111 my $eval_err = $@;
92              
93 54   66     326 my $resp = _base_request( $self, $method, $url, $args_hr || () );
94              
95 54         341145648 $@ = $eval_err;
96              
97 54         406 my $resp_obj = HTTP::Tiny::UA::Response->new($resp);
98              
99             #cf. HTTP::Tiny docs
100 54 50       4426 if ( $resp_obj->status() == 599 ) {
101             die Net::ACME2::X->create(
102             'HTTP::Network',
103             {
104             method => $method,
105             url => $url,
106             error => $resp_obj->content(),
107 0         0 redirects => $resp->{'redirects'},
108             }
109             );
110             }
111              
112 54 50       515 if ( $resp->{'status'} >= 400 ) {
113             die Net::ACME2::X->create(
114             'HTTP::Protocol',
115             {
116             method => $method,
117             redirects => $resp->{'redirects'},
118 0         0 ( map { ( $_ => $resp_obj->$_() ) } qw( content status reason url headers ) ),
  0         0  
119             },
120             );
121             }
122              
123 54         276 return $resp_obj;
124             }
125              
126             1;
127