root/lang/perl/Net-Google-Spreadsheets/trunk/lib/Net/Google/Spreadsheets/UserAgent.pm @ 27538

Revision 27538, 2.8 kB (checked in by lopnor, 4 years ago)

fix pod

Line 
1package Net::Google::Spreadsheets::UserAgent;
2use Moose;
3use Carp;
4use LWP::UserAgent;
5use HTTP::Request;
6use URI;
7use XML::Atom::Entry;
8use XML::Atom::Feed;
9
10has source => (
11    isa => 'Str',
12    is => 'ro',
13    required => 1,
14);
15
16has auth => (
17    isa => 'Str',
18    is => 'rw',
19    required => 1,
20);
21
22has ua => (
23    isa => 'LWP::UserAgent',
24    is => 'ro',
25    required => 1,
26    lazy => 1,
27    default => sub {
28        my $self = shift;
29        my $ua = LWP::UserAgent->new(
30            agent => $self->source,
31        );
32        $ua->default_headers(
33            HTTP::Headers->new(
34                Authorization => sprintf('GoogleLogin auth=%s', $self->auth),
35                GData_Version => 2,
36            )
37        );
38        return $ua;
39    }
40);
41
42sub request {
43    my ($self, $args) = @_;
44    my $method = delete $args->{method};
45    $method ||= $args->{content} ? 'POST' : 'GET';
46    my $uri = URI->new($args->{'uri'});
47    $uri->query_form($args->{query}) if $args->{query};
48    my $req = HTTP::Request->new($method => "$uri");
49    $req->content($args->{content}) if $args->{content};
50    $req->header('Content-Type' => $args->{content_type}) if $args->{content_type};
51    if ($args->{header}) {
52        while (my @pair = each %{$args->{header}}) {
53            $req->header(@pair);
54        }
55    }
56    my $res = $self->ua->request($req);
57    unless ($res->is_success) {
58#        warn $res->request->as_string;
59#        warn $res->as_string;
60        die sprintf("request for '%s' failed: %s", $uri, $res->status_line);
61    }
62    return $res;
63}
64
65sub feed {
66    my ($self, $url, $query) = @_;
67    my $res = $self->request(
68        {
69            uri => $url,
70            query => $query || undef,
71        }
72    );
73    return XML::Atom::Feed->new(\($res->content));
74}
75
76sub entry {
77    my ($self, $url, $query) = @_;
78    my $res = $self->request(
79        {
80            uri => $url,
81            query => $query || undef,
82        }
83    );
84    return XML::Atom::Entry->new(\($res->content));
85}
86
87sub post {
88    my ($self, $url, $entry, $header) = @_;
89    my $res = $self->request(
90        {
91            uri => $url,
92            content => $entry->as_xml,
93            header => $header || undef,
94            content_type => 'application/atom+xml',
95        }
96    );
97    return (ref $entry)->new(\($res->content));
98}
99
100sub put {
101    my ($self, $args) = @_;
102    my $res = $self->request(
103        {
104            method => 'PUT',
105            uri => $args->{self}->editurl,
106            content => $args->{entry}->as_xml,
107            header => {'If-Match' => $args->{self}->etag },
108            content_type => 'application/atom+xml',
109        }
110    );
111    return XML::Atom::Entry->new(\($res->content));
112}
113
1141;
115__END__
116
117=head1 NAME
118
119Net::Google::Spreadsheets::UserAgent;
120
121=head1 AUTHOR
122
123Nobuo Danjou E<lt>nobuo.danjou@gmail.comE<gt>
124
125=cut
Note: See TracBrowser for help on using the browser.