| 1 | package Net::Google::Spreadsheets::UserAgent; |
|---|
| 2 | use Moose; |
|---|
| 3 | use Carp; |
|---|
| 4 | use LWP::UserAgent; |
|---|
| 5 | use HTTP::Request; |
|---|
| 6 | use URI; |
|---|
| 7 | use XML::Atom::Entry; |
|---|
| 8 | use XML::Atom::Feed; |
|---|
| 9 | |
|---|
| 10 | has source => ( |
|---|
| 11 | isa => 'Str', |
|---|
| 12 | is => 'ro', |
|---|
| 13 | required => 1, |
|---|
| 14 | ); |
|---|
| 15 | |
|---|
| 16 | has auth => ( |
|---|
| 17 | isa => 'Str', |
|---|
| 18 | is => 'rw', |
|---|
| 19 | required => 1, |
|---|
| 20 | ); |
|---|
| 21 | |
|---|
| 22 | has 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 | |
|---|
| 42 | sub 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 | croak "request failed: ",$res->code; |
|---|
| 61 | } |
|---|
| 62 | return $res; |
|---|
| 63 | } |
|---|
| 64 | |
|---|
| 65 | sub 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 | |
|---|
| 76 | sub 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 | |
|---|
| 87 | sub 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 | |
|---|
| 100 | sub 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 | |
|---|
| 114 | 1; |
|---|
| 115 | __END__ |
|---|
| 116 | |
|---|
| 117 | =head1 NAME |
|---|
| 118 | |
|---|
| 119 | Net::Google::Spreadsheets::UserAgent; |
|---|
| 120 | |
|---|
| 121 | =head1 AUTHOR |
|---|
| 122 | |
|---|
| 123 | Nobuo Danjou E<lt>nobuo.danjou@gmail.comE<gt> |
|---|
| 124 | |
|---|
| 125 | =cut |
|---|