@@ -26,7 +26,6 @@ use Module::Runtime qw(use_module);
26
26
27
27
use { {moduleName} }::Configuration;
28
28
29
-
30
29
sub new {
31
30
my $class = shift;
32
31
@@ -41,7 +40,7 @@ sub new {
41
40
'ua' => LWP::UserAgent->new,
42
41
'config' => $config,
43
42
);
44
-
43
+
45
44
return bless \%args, $class;
46
45
}
47
46
@@ -76,23 +75,21 @@ sub set_timeout {
76
75
sub call_api {
77
76
my $self = shift;
78
77
my ($resource_path , $method , $query_params , $post_params , $header_params , $body_data , $auth_settings ) = @_;
79
-
78
+
80
79
# update parameters based on authentication settings
81
80
$self -> update_params_for_auth ($header_params , $query_params , $auth_settings );
82
-
83
-
81
+
84
82
my $_url = $self -> {config} { base_url} . $resource_path;
85
-
83
+
86
84
# build query
87
85
if (%$query_params) {
88
86
$_url = ($_url . ' ?' . eval { URI::Query-> new ($query_params )-> stringify } );
89
87
}
90
-
91
-
88
+
92
89
# body data
93
90
$body_data = to_json($body_data->to_hash) if defined $body_data && $body_data->can('to_hash'); # model to json string
94
91
my $_body_data = %$post_params ? $post_params : $body_data;
95
-
92
+
96
93
# Make the HTTP request
97
94
my $_request;
98
95
if ($method eq 'POST') {
@@ -101,15 +98,15 @@ sub call_api {
101
98
'form-data' : $header_params->{ ' Content-Type' } ;
102
99
103
100
$_request = POST($_url, %$header_params, Content => $_body_data);
104
-
101
+
105
102
}
106
103
elsif ($method eq 'PUT') {
107
104
# multipart
108
105
$header_params -> {' Content-Type' } = lc $header_params->{ ' Content-Type' } eq 'multipart/form' ?
109
106
'form-data' : $header_params->{ ' Content-Type' } ;
110
-
107
+
111
108
$_request = PUT($_url, %$header_params, Content => $_body_data);
112
-
109
+
113
110
}
114
111
elsif ($method eq 'GET') {
115
112
my $headers = HTTP::Headers-> new (% $header_params );
@@ -130,17 +127,17 @@ sub call_api {
130
127
131
128
$self->{ ua} ->timeout($self->{ http_timeout} || $self->{ config} { http_timeout} );
132
129
$self->{ ua} ->agent($self->{ http_user_agent} || $self->{ config} { http_user_agent} );
133
-
130
+
134
131
$log->debugf("REQUEST: %s", $_request->as_string);
135
132
my $_response = $self->{ ua} ->request($_request);
136
133
$log->debugf("RESPONSE: %s", $_response->as_string);
137
-
134
+
138
135
unless ($_response->is_success) {
139
136
croak(sprintf " API Exception(%s): %s\n %s" , $_response -> code , $_response -> message , $_response -> content );
140
137
}
141
138
142
139
return $_response->content;
143
-
140
+
144
141
}
145
142
146
143
# Take value and turn it into a string suitable for inclusion in
@@ -160,12 +157,12 @@ sub to_path_value {
160
157
# @param object $object an object to be serialized to a string
161
158
# @return string the serialized object
162
159
sub to_query_value {
163
- my ($self , $object ) = @_;
164
- if (ref($object ) eq ' ARRAY' ) {
165
- return join(' ,' , @$object );
166
- } else {
167
- return $self -> to_string ($object );
168
- }
160
+ my ($self , $object ) = @_;
161
+ if (ref($object ) eq ' ARRAY' ) {
162
+ return join(' ,' , @$object );
163
+ } else {
164
+ return $self -> to_string ($object );
165
+ }
169
166
}
170
167
171
168
@@ -213,7 +210,7 @@ sub deserialize
213
210
{
214
211
my ($self , $class , $data ) = @_;
215
212
$log -> debugf (" deserializing %s for %s" , $data , $class );
216
-
213
+
217
214
if (not defined $data ) {
218
215
return undef;
219
216
} elsif ( (substr($class, 0, 5)) eq 'HASH[') { #hash
@@ -232,10 +229,9 @@ sub deserialize
232
229
} else {
233
230
#TODO log error
234
231
}
235
-
236
232
} elsif ( (substr($class, 0, 6)) eq 'ARRAY[' ) { # array of data
237
233
return $data if $data eq ' []' ; # return if empty array
238
-
234
+
239
235
my $_sub_class = substr($class , 6, -1);
240
236
my $_json_data = decode_json $data ;
241
237
my @_values = ();
@@ -259,7 +255,6 @@ sub deserialize
259
255
return $_instance -> from_hash (decode_json $data );
260
256
}
261
257
}
262
-
263
258
}
264
259
265
260
# return 'Accept' based on an array of accept provided
@@ -268,15 +263,15 @@ sub deserialize
268
263
sub select_header_accept
269
264
{
270
265
my ($self , @header) = @_;
271
-
266
+
272
267
if (@header == 0 || (@header == 1 && $header [0] eq ' ' )) {
273
268
return undef;
274
269
} elsif (grep(/^application\/json$/i, @header)) {
275
270
return ' application/json' ;
276
271
} else {
277
272
return join(' ,' , @header);
278
273
}
279
-
274
+
280
275
}
281
276
282
277
# return the content type based on an array of content-type provided
@@ -285,31 +280,31 @@ sub select_header_accept
285
280
sub select_header_content_type
286
281
{
287
282
my ($self , @header) = @_;
288
-
283
+
289
284
if (@header == 0 || (@header == 1 && $header [0] eq ' ' )) {
290
285
return ' application/json' ; # default to application/json
291
286
} elsif (grep(/^application\/json$/i, @header)) {
292
287
return ' application/json' ;
293
288
} else {
294
289
return join(' ,' , @header);
295
290
}
296
-
291
+
297
292
}
298
293
299
294
# Get API key (with prefix if set)
300
295
# @param string key name
301
296
# @return string API key with the prefix
302
297
sub get_api_key_with_prefix
303
298
{
304
- my ($self , $key_name ) = @_;
299
+ my ($self , $key_name ) = @_;
305
300
306
- my $api_key = $self -> {config} { api_key} { $key_name } ;
307
-
308
- return unless $api_key;
309
-
310
- my $prefix = $self->{ config} { api_key_prefix} { $key_name } ;
311
- return $prefix ? "$prefix $api_key" : $api_key;
312
- }
301
+ my $api_key = $self -> {config} { api_key} { $key_name } ;
302
+
303
+ return unless $api_key;
304
+
305
+ my $prefix = $self->{ config} { api_key_prefix} { $key_name } ;
306
+ return $prefix ? "$prefix $api_key" : $api_key;
307
+ }
313
308
314
309
# update header and query param based on authentication setting
315
310
#
@@ -318,36 +313,46 @@ sub get_api_key_with_prefix
318
313
# @param array $authSettings array of authentication scheme (e.g ['api_key'])
319
314
sub update_params_for_auth {
320
315
my ($self , $header_params , $query_params , $auth_settings ) = @_;
321
-
316
+
322
317
return $self -> _global_auth_setup ($header_params , $query_params )
323
- unless $auth_settings && @$auth_settings ;
324
-
318
+ unless $auth_settings && @$auth_settings ;
319
+
325
320
# one endpoint can have more than 1 auth settings
326
321
foreach my $auth (@$auth_settings ) {
327
322
# determine which one to use
328
323
if (! defined($auth )) {
329
324
# TODO show warning about auth setting not defined
330
325
}
331
- { {#authMethods} }elsif ($auth eq '{ {name} }') {
332
- {{#isApiKey} }{ {#isKeyInHeader} }
326
+ { {#authMethods} }
327
+ elsif ($auth eq '{ {name} }') {
328
+ {{#isApiKey} }
329
+ { {#isKeyInHeader} }
333
330
my $api_key = $self->get_api_key_with_prefix('{ {keyParamName} }');
334
331
if ($api_key) {
335
332
$header_params -> {' {{keyParamName}}' } = $api_key;
336
- }{ {/isKeyInHeader} }{ {#isKeyInQuery} }
333
+ }
334
+ { {/isKeyInHeader} }
335
+ { {#isKeyInQuery} }
337
336
my $api_key = $self->get_api_key_with_prefix('{ {keyParamName} }');
338
337
if ($api_key) {
339
338
$query_params -> {' {{keyParamName}}' } = $api_key;
340
- }{ {/isKeyInQuery} }{ {/isApiKey} }{ {#isBasic} }
339
+ }
340
+ { {/isKeyInQuery} }
341
+ { {/isApiKey} }
342
+ { {#isBasic} }
341
343
if ($self->{ config} { username} || $self->{ config} { password} ) {
342
344
$header_params -> {' Authorization' } = 'Basic ' . encode_base64($self->{ config} { username} . ":" . $self->{ config} { password} );
343
- }{ {/isBasic} }{ {#isOAuth} }
345
+ }
346
+ { {/isBasic} }
347
+ { {#isOAuth} }
344
348
if ($self->{ config} { access_token} ) {
345
349
$header_params -> {' Authorization' } = 'Bearer ' . $self->{ config} { access_token} ;
346
- }{ {/isOAuth} }
350
+ }
351
+ { {/isOAuth} }
347
352
}
348
353
{ {/authMethods} }
349
354
else {
350
- # TODO show warning about security definition not found
355
+ # TODO show warning about security definition not found
351
356
}
352
357
}
353
358
}
@@ -357,37 +362,36 @@ sub update_params_for_auth {
357
362
# OpenAPI Spec does not describe the intended authorization. So we check in the config for any
358
363
# auth tokens and if we find any, we use them for all endpoints;
359
364
sub _global_auth_setup {
360
- my ($self , $header_params , $query_params ) = @_;
361
-
362
- my $tokens = $self -> {config} ->get_tokens;
363
- return unless keys %$tokens;
364
-
365
- # basic
366
- if (my $uname = delete $tokens->{ username} ) {
367
- my $pword = delete $tokens -> {password} ;
368
- $header_params->{ ' Authorization' } = 'Basic '.encode_base64($uname.":".$pword);
369
- }
370
-
371
- # oauth
372
- if (my $access_token = delete $tokens->{ access_token} ) {
373
- $header_params -> {' Authorization' } = 'Bearer ' . $access_token;
374
- }
375
-
376
- # other keys
377
- foreach my $token_name (keys %$tokens) {
378
- my $in = $tokens -> {$token_name } ->{ in} ;
379
- my $token = $self->get_api_key_with_prefix($token_name);
380
- if ($in eq 'head') {
381
- $header_params -> {$token_name } = $token;
382
- }
383
- elsif ($in eq 'query') {
384
- $query_params -> {$token_name } = $token;
385
- }
386
- else {
387
- die " Don't know where to put token '$token_name' ('$in' is not 'head' or 'query')" ;
388
- }
389
- }
390
- }
365
+ my ($self , $header_params , $query_params ) = @_;
366
+
367
+ my $tokens = $self -> {config} ->get_tokens;
368
+ return unless keys %$tokens;
391
369
370
+ # basic
371
+ if (my $uname = delete $tokens->{ username} ) {
372
+ my $pword = delete $tokens -> {password} ;
373
+ $header_params->{ ' Authorization' } = 'Basic '.encode_base64($uname.":".$pword);
374
+ }
375
+
376
+ # oauth
377
+ if (my $access_token = delete $tokens->{ access_token} ) {
378
+ $header_params -> {' Authorization' } = 'Bearer ' . $access_token;
379
+ }
380
+
381
+ # other keys
382
+ foreach my $token_name (keys %$tokens) {
383
+ my $in = $tokens -> {$token_name } ->{ in} ;
384
+ my $token = $self->get_api_key_with_prefix($token_name);
385
+ if ($in eq 'head') {
386
+ $header_params -> {$token_name } = $token;
387
+ }
388
+ elsif ($in eq 'query') {
389
+ $query_params -> {$token_name } = $token;
390
+ }
391
+ else {
392
+ die " Don't know where to put token '$token_name' ('$in' is not 'head' or 'query')" ;
393
+ }
394
+ }
395
+ }
392
396
393
397
1;
0 commit comments