/
Curl.pm
58 lines (39 loc) · 1.18 KB
/
Curl.pm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
package Web::Weaver::Curl;
use strict;
use warnings;
use parent qw(Web::Weaver);
use Carp ();
use WWW::Curl::Easy;
use HTTP::Response::Parser qw(parse_http_response);
use Data::Dump qw(dump);
sub new {
my($class, %args) = @_;
my $agent = delete $args{agent};
my $timeout = delete $args{timeout};
if(%args) {
Carp::croak("Unknown options: " . join ", ", sort keys %args);
}
my $curl = WWW::Curl::Easy->new();
$curl->setopt(CURLOPT_HEADER, 0);
$curl->setopt(CURLOPT_USERAGENT,
$agent || $class->default_user_agent);
$curl->setopt(CURLOPT_TIMEOUT, $timeout) if defined $timeout;
return bless { curl => $curl }, $class;
}
sub request {
my($self, $env) = @_;
my $curl = $self->{curl};
my $uri = $self->build_uri($env);
$curl->setopt(CURLOPT_URL, $uri);
my $header = '';
open my $header_fh, '>', \$header;
$curl->setopt(CURLOPT_WRITEHEADER, \$header_fh);
my $body = '';
open my $body_fh, '>', \$body;
$curl->setopt(CURLOPT_WRITEDATA, \$body_fh);
my $ret = $curl->perform();
my %res;
parse_http_response($header, \%res);
return [$res{_rc}, [%{$res{_headers}}], [$body]];
}
1;