File Coverage

blib/lib/OAuth/Lite2/ParamMethod/FormEncodedBody.pm
Criterion Covered Total %
statement 63 64 98.4
branch 11 12 91.6
condition 8 10 80.0
subroutine 13 13 100.0
pod 4 4 100.0
total 99 103 96.1


line stmt bran cond sub pod time code
1             package OAuth::Lite2::ParamMethod::FormEncodedBody;
2              
3 3     3   18 use strict;
  3         8  
  3         136  
4 3     3   18 use warnings;
  3         4  
  3         129  
5              
6 3     3   64 use parent 'OAuth::Lite2::ParamMethod';
  3         6  
  3         27  
7 3     3   219 use HTTP::Request;
  3         5  
  3         93  
8 3     3   14 use HTTP::Headers;
  3         7  
  3         78  
9 3     3   15 use Carp ();
  3         4  
  3         63  
10 3     3   62 use bytes ();
  3         5  
  3         73  
11 3     3   16 use Params::Validate;
  3         7  
  3         212  
12 3     3   18 use OAuth::Lite2::Util qw(build_content);
  3         5  
  3         2176  
13              
14             =head1 NAME
15              
16             OAuth::Lite2::ParamMethod::FormEncodedBody - builder/parser for OAuth 2.0 FormEncodedBody type of parameter
17              
18             =head1 SYNOPSIS
19              
20             my $meth = OAuth::Lite2::ParamMethod::FormEncodedBody->new;
21              
22             # server side
23             if ($meth->match( $plack_request )) {
24             my ($token, $params) = $meth->parse( $plack_request );
25             }
26              
27             # client side
28             my $http_req = $meth->request_builder(...);
29              
30             =head1 DESCRIPTION
31              
32             builder/parser for OAuth 2.0 FormEncodedBody type of parameter
33              
34             =head1 METHODS
35              
36             =head2 new
37              
38             Constructor
39              
40             =head2 match( $plack_request )
41              
42             Returns true if passed L object is matched for the type of this method.
43              
44             if ( $meth->match( $plack_request ) ) {
45             ...
46             }
47              
48             =cut
49              
50             sub match {
51 25     25 1 40 my ($self, $req) = @_;
52 25         87 my $method = lc $req->method;
53             return (($method eq 'post'
54             || $method eq 'put'
55             || $method eq 'delete')
56             && $req->content_type eq 'application/x-www-form-urlencoded'
57 25   66     349 && ($req->body_parameters->{oauth_token} || $req->body_parameters->{access_token}));
58             }
59              
60             =head2 parse( $plack_request )
61              
62             Parse the L, and returns access token and oauth parameters.
63              
64             my ($token, $params) = $meth->parse( $plack_request );
65              
66             =cut
67              
68             sub parse {
69 13     13 1 565 my ($self, $req) = @_;
70 13         33 my $params = $req->body_parameters;
71 13         67 my $token = $params->{access_token};
72 13         48 $params->remove('access_token');
73 13 100       415 if($params->{oauth_token}){
74 6         12 $token = $params->{oauth_token};
75 6         19 $params->remove('oauth_token');
76             }
77 13         166 return ($token, $params);
78             }
79              
80             =head2 build_request( %params )
81              
82             Build L object.
83              
84             my $req = $meth->build_request(
85             url => $url,
86             method => $http_method,
87             token => $access_token,
88             oauth_params => $oauth_params,
89             params => $params,
90             content => $content,
91             headers => $headers,
92             );
93              
94             =cut
95              
96             sub build_request {
97 5     5 1 1864 my $self = shift;
98 5         130 my %args = Params::Validate::validate(@_, {
99             url => 1,
100             method => 1,
101             token => 1,
102             oauth_params => 1,
103             params => { optional => 1 },
104             content => { optional => 1 },
105             headers => { optional => 1 },
106             });
107 5         47 my $method = uc $args{method};
108 5 100 100     26 if ($method eq 'GET' || $method eq 'DELETE') {
109 2         303 Carp::croak qq{When you request with GET or DELETE method, }
110             .qq{You can't use FormEncodedBody type OAuth parameters.}
111             } else {
112              
113 3   50     8 my $oauth_params = $args{oauth_params} || {};
114 3         6 $oauth_params->{access_token} = $args{token};
115              
116 3         4 my $headers = $args{headers};
117 3 100       5 if (defined $headers) {
118 1 50       3 if (ref($headers) eq 'ARRAY') {
119 1         4 $headers = HTTP::Headers->new(@$headers);
120             } else {
121 0         0 $headers = $headers->clone;
122             }
123             } else {
124 2         7 $headers = HTTP::Headers->new;
125             }
126              
127 3 100       48 unless ($headers->header("Content-Type")) {
128 2         44 $headers->header("Content-Type",
129             "application/x-www-form-urlencoded");
130             }
131 3         66 my $content_type = $headers->header("Content-Type");
132 3   100     78 my $params = $args{params} || {};
133 3 100       8 if ($content_type ne "application/x-www-form-urlencoded") {
134 1         107 Carp::croak qq{When you use FormEncodedBody-type OAuth parameters,}
135             .qq{Content-Type header must be application/x-www-form-urlencoded.}
136             }
137 2         12 my $content = build_content({%$params, %$oauth_params});
138 2         7 $headers->header("Content-Length", bytes::length($content));
139 2         56 my $req = HTTP::Request->new($method, $args{url}, $headers, $content);
140 2         325 return $req;
141             }
142             }
143              
144             =head2 is_legacy( $plack_request )
145              
146             Returns true if passed L object is based draft version 10.
147              
148             if ( $meth->is_legacy( $plack_request ) ) {
149             ...
150             }
151              
152             =cut
153              
154             sub is_legacy {
155 12     12 1 35 my ($self, $req) = @_;
156 12         37 my $method = lc $req->method;
157 12         75 return ($req->body_parameters->{oauth_token});
158             }
159              
160             =head1 SEE ALSO
161              
162             L
163             L
164             L
165             L
166              
167             =head1 AUTHOR
168              
169             Lyo Kato, Elyo.kato@gmail.comE
170              
171             =head1 COPYRIGHT AND LICENSE
172              
173             Copyright (C) 2010 by Lyo Kato
174              
175             This library is free software; you can redistribute it and/or modify
176             it under the same terms as Perl itself, either Perl version 5.8.8 or,
177             at your option, any later version of Perl 5 you may have available.
178              
179             =cut
180              
181              
182             1;