2673: Use _method=GET hack to avoid combining request body with GET
[arvados.git] / sdk / perl / lib / Arvados / Request.pm
1 package Arvados::Request;
2 use Data::Dumper;
3 use LWP::UserAgent;
4 use URI::Escape;
5 use Encode;
6 use strict;
7 @Arvados::HTTP::ISA = qw(LWP::UserAgent);
8
9 sub new
10 {
11     my $class = shift;
12     my $self = {};
13     bless ($self, $class);
14     return $self->_init(@_);
15 }
16
17 sub _init
18 {
19     my $self = shift;
20     $self->{'ua'} = new LWP::UserAgent(@_);
21     $self->{'ua'}->agent ("libarvados-perl/".$Arvados::VERSION);
22     $self;
23 }
24
25 sub set_uri
26 {
27     my $self = shift;
28     $self->{'uri'} = shift;
29 }
30
31 sub process_request
32 {
33     my $self = shift;
34     my %req;
35     my %content;
36     my $method = $self->{'method'};
37     if ($method eq 'GET' || $method eq 'HEAD') {
38         $content{'_method'} = $method;
39         $method = 'POST';
40     }
41     $req{$method} = $self->{'uri'};
42     $self->{'req'} = new HTTP::Request (%req);
43     $self->{'req'}->header('Authorization' => ('OAuth2 ' . $self->{'authToken'})) if $self->{'authToken'};
44     $self->{'req'}->header('Accept' => 'application/json');
45     my ($p, $v);
46     while (($p, $v) = each %{$self->{'queryParams'}}) {
47         $content{$p} = (ref($v) eq "") ? $v : JSON::encode_json($v);
48     }
49     my $content;
50     while (($p, $v) = each %content) {
51         $content .= '&' unless $content eq '';
52         $content .= uri_escape($p);
53         $content .= '=';
54         $content .= uri_escape($v);
55     }
56     $self->{'req'}->content_type("application/x-www-form-urlencoded; charset='utf8'");
57     $self->{'req'}->content(Encode::encode('utf8', $content));
58     $self->{'res'} = $self->{'ua'}->request ($self->{'req'});
59 }
60
61 sub get_status
62 {
63     my $self = shift;
64     return ($self->{'res'}->code(),
65             $self->{'res'}->message());
66 }
67
68 sub get_body
69 {
70     my $self = shift;
71     return $self->{'res'}->content;
72 }
73
74 sub set_method
75 {
76     my $self = shift;
77     $self->{'method'} = shift;
78 }
79
80 sub set_query_params
81 {
82     my $self = shift;
83     $self->{'queryParams'} = shift;
84 }
85
86 sub set_auth_token
87 {
88     my $self = shift;
89     $self->{'authToken'} = shift;
90 }
91
92 sub get_headers
93 {
94     ""
95 }
96
97 1;