File Coverage

lib/LWP/CurlLog.pm
Criterion Covered Total %
statement 50 70 71.4
branch 10 20 50.0
condition 2 9 22.2
subroutine 7 7 100.0
pod n/a
total 69 106 65.0


line stmt bran cond sub pod time code
1             package LWP::CurlLog;
2 1     1   74811 use strict;
  1         2  
  1         31  
3 1     1   5 use warnings;
  1         1  
  1         26  
4 1     1   744 use LWP::UserAgent ();
  1         52436  
  1         257  
5              
6             our $VERSION = "0.03";
7             our %opts = (
8             file => undef,
9             response => 1,
10             options => "-k",
11             timing => 0,
12             );
13              
14             sub import {
15 1     1   13 my ($package, %args) = @_;
16 1         4 for my $key (keys %args) {
17 2         5 $opts{$key} = $args{$key};
18             }
19              
20 1 50       5 if (!$opts{file}) {
21 0         0 $opts{fh} = \*STDERR;
22             }
23             else {
24 1         2 my $file2 = $opts{file};
25 1 50       10 if ($file2 =~ m{^~/}) {
26 0   0     0 my $home = $ENV{HOME} || (getpwuid($<))[7];
27 0         0 $file2 =~ s{^~/}{$home/};
28             }
29 1 50       133 open $opts{fh}, ">>", $file2 or die "Can't open $opts{file}: $!";
30             }
31 1         6 select($opts{fh});
32 1         3 $| = 1;
33 1         32 select(STDOUT);
34             }
35              
36 1     1   10 no strict "refs";
  1         2  
  1         32  
37 1     1   6 no warnings "redefine";
  1         2  
  1         645  
38              
39             my $orig_sub = \&LWP::UserAgent::send_request;
40             *{"LWP::UserAgent::send_request"} = sub {
41 1     1   17885 my ($self, $request) = @_;
42              
43 1         3 my $cmd = "curl ";
44 1         3 my $url = $request->uri();
45 1 50       9 if ($url =~ /[=&;?]/) {
46 0         0 $cmd .= "\"$url\" ";
47             }
48             else {
49 1         10 $cmd .= "$url "
50             }
51 1 50       9 if ($opts{options}) {
52 1         3 $cmd .= "$opts{options} ";
53             }
54 1 50 33     4 if ($request->method() && ($request->method() ne "GET" || $request->content_length())) {
      33        
55 0         0 $cmd .= "-X " . $request->method() . " ";
56             }
57 1         91 for my $header ($request->header_field_names) {
58 1 50       41 if ($header =~ /^(Content-Length|User-Agent)$/i) {
59 1         3 next;
60             }
61 0         0 my $value = $request->header($header);
62 0         0 $value =~ s{([\\\$"])}{\\$1}g;
63 0         0 $cmd .= "-H \"$header: $value\" ";
64             }
65 1 50       9 if ($request->header("Content-Length")) {
66 0         0 my $content = $request->decoded_content();
67 0         0 $content =~ s{([\\\$"])}{\\$1}g;
68 0         0 $cmd .= "-d \"$content\" ";
69             }
70 1         63 $cmd =~ s/\s*$//;
71              
72 1         15 print {$opts{fh}} "# " . localtime() . " LWP request\n";
  1         117  
73 1         12 print {$opts{fh}} "$cmd\n";
  1         15  
74 1         4 my $time1 = time();
75 1         8 my $response = $orig_sub->(@_);
76 1         305795 my $time2 = time();
77              
78 1 50       8 if ($opts{response}) {
79 0         0 print {$opts{fh}} "\n# " . localtime() . " LWP response\n";
  0         0  
80 0         0 my $response2 = $response->as_string;
81 0         0 $response2 =~ s/\s*$//g;
82 0         0 print {$opts{fh}} "$response2\n";
  0         0  
83             }
84 1 50       3 if ($opts{timing}) {
85 0         0 my $diff = $time2 - $time1;
86 0         0 print {$opts{fh}} "# ${diff}s\n";
  0         0  
87             }
88              
89 1         2 print {$opts{fh}} "\n";
  1         35  
90              
91 1         7 return $response;
92             };
93              
94             1;
95              
96             __END__