PNG  IHDR;IDATxܻn0K )(pA 7LeG{ §㻢|ذaÆ 6lذaÆ 6lذaÆ 6lom$^yذag5bÆ 6lذaÆ 6lذa{ 6lذaÆ `}HFkm,mӪôô! x|'ܢ˟;E:9&ᶒ}{v]n&6 h_tڠ͵-ҫZ;Z$.Pkž)!o>}leQfJTu іچ\X=8Rن4`Vwl>nG^is"ms$ui?wbs[m6K4O.4%/bC%t Mז -lG6mrz2s%9s@-k9=)kB5\+͂Zsٲ Rn~GRC wIcIn7jJhۛNCS|j08yiHKֶۛkɈ+;SzL/F*\Ԕ#"5m2[S=gnaPeғL lذaÆ 6l^ḵaÆ 6lذaÆ 6lذa; _ذaÆ 6lذaÆ 6lذaÆ RIENDB` package Paws::Net::JsonResponse; use Moose; use JSON::MaybeXS; use Carp qw(croak); use Paws::Exception; use feature 'state'; sub process { my ($self, $call_object, $response) = @_; if ($response->has_header('x-amz-crc32')) { require String::CRC32; my $crc = String::CRC32::crc32($response->content); return Paws::Exception->new( code => 'Crc32Error', message => 'Content CRC32 mismatch', request_id => $response->header('x-amzn-requestid'), ) if ($crc != $response->header('x-amz-crc32')); } if ( $response->status >= 300 ) { return $self->error_to_exception($call_object, $response); } else { return $self->response_to_object($call_object, $response); } } sub unserialize_response { my ($self, $response) = @_; return {} if (not defined $response->content or $response->content eq ''); my $struct = eval { decode_json( $response->content ) }; if ($@) { return Paws::Exception->throw( message => $@, code => 'InvalidContent', request_id => '', http_status => $response->status, ); } return $struct; } sub error_to_exception { my ($self, $call_object, $response) = @_; my $struct = $self->unserialize_response( $response ); my ($message, $request_id); my $code = $struct->{__type} // 'InvalidContent'; if ($code =~ m/#/) { $code = (split /#/, $code)[1]; } if (exists $struct->{message}){ $message = $struct->{message} // ''; } elsif (exists $struct->{Message}){ $message = $struct->{Message} // ''; } else { $message = $code; } $request_id = $response->header('x-amzn-requestid') // ''; Paws::Exception->new( message => $message, code => $code, request_id => $request_id, http_status => $response->status, ); } sub handle_response_strtonativemap { my ($self, $att_class, $value) = @_; if (not defined $value){ return $att_class->new(Map => {}); } else { return $att_class->new(Map => $value); } } sub handle_response_strtoobjmap { my ($self, $att_class, $value) = @_; my $is_array = 0; my $inner_class; my $class = $att_class->meta->get_attribute('Map')->type_constraint->name; if (my ($array_type) = ($class =~ m/^HashRef\[ArrayRef\[(.*)\]\]$/)){ $inner_class = $array_type; $is_array = 1; } elsif (my ($inner_type) = ($class =~ m/^HashRef\[(.*)\]$/)) { $inner_class = $inner_type; $is_array = 0; } Paws->load_class("$inner_class"); if ($is_array) { if (not defined $value){ return $att_class->new(Map => {}); } else { return $att_class->new(Map => { map { my $k = $_; ($k => [ map { $self->new_from_result_struct($inner_class, $_) } @{ $value->{ $k } } ] ) } keys %$value }); } } else { if (not defined $value){ return $att_class->new(Map => {}); } else { return $att_class->new(Map => { map { ($_ => $self->new_from_result_struct($inner_class, $value->{ $_ }) ) } keys %$value }); } } } sub new_from_result_struct { my ($self, $class, $result) = @_; my %args; if (do { state %d; $d{$class} //= $class->does('Paws::API::StrToObjMapParser')}) { return $self->handle_response_strtoobjmap($class, $result); } elsif (do { state %d; $d{$class} //= $class->does('Paws::API::StrToNativeMapParser')}) { return $self->handle_response_strtonativemap($class, $result); } else { foreach my $att (do { state %d; @{$d{$class} //= [$class->meta->get_attribute_list]}}) { next if (not my $meta = do { state %d; exists $d{$class}{$att} ? $d{$class}{$att} : $d{$class}{$att} = $class->meta->get_attribute($att)}); my $key = do { state %d; $d{$class}{$att} //= $meta->does('NameInRequest') } ? $meta->request_name : do { state %d; $d{$class}{$att} //= $meta->does('ParamInHeader') } ? lc($meta->header_name) : $att; my $att_type = $meta->type_constraint; # use Data::Dumper; # print STDERR "USING KEY: $key\n"; # print STDERR "$att IS A '$att_type' TYPE\n"; # print STDERR "VALUE: " . Dumper($result); # my $extracted_val = $result->{ $key }; # print STDERR "RESULT >>> $extracted_val\n"; # We'll consider that an attribute without brackets [] isn't an array type if ($att_type !~ m/\[.*\]$/) { my $value = $result->{ $key }; my $value_ref = ref($value); if ($att_type =~ m/\:\:/) { # Make the att_type stringify for module loading Paws->load_class("$att_type"); if (defined $value) { if (not $value_ref) { $args{ $att } = $value; } else { my $att_class = $att_type->class; if (do { state %d; $d{$att_class} //= $att_class->does('Paws::API::StrToObjMapParser')}) { $args{ $att } = $self->handle_response_strtoobjmap($att_class, $value); } elsif (do { state %d; $d{$att_class} //= $att_class->does('Paws::API::StrToNativeMapParser')}) { $args{ $att } = $self->handle_response_strtonativemap($att_class, $value); } elsif (do { state %d; $d{$att_class} //= $att_class->does('Paws::API::MapParser')}) { my $xml_keys = $att_class->xml_keys; my $xml_values = $att_class->xml_values; $args{ $att } = $att_class->new(map { ($_->{ $xml_keys } => $_->{ $xml_values }) } @$value); } else { $args{ $att } = $self->new_from_result_struct($att_class, $value); } } } } else { if (defined $value) { if ($att_type eq 'Bool') { if ($value eq 'true') { $args{ $att } = 1; } elsif ($value eq 'false') { $args{ $att } = 0; } elsif ($value == 1) { $args{ $att } = 1; } else { $args{ $att } = 0; } } else { $args{ $att } = $value; } } } } elsif (my ($type) = ($att_type =~ m/^ArrayRef\[(.*)\]$/)) { my $value = $result->{ $att }; $value = $result->{ $key } if (not defined $value and $key ne $att); my $value_ref = ref($value); if ($type =~ m/\:\:/) { Paws->load_class($type); if (do { state %d; $d{$type} //= $type->does('Paws::API::StrToObjMapParser')}) { $args{ $att } = [ map { $self->handle_response_strtoobjmap($type, $_) } @$value ]; } elsif (do { state %d; $d{$type} //= $type->does('Paws::API::StrToNativeMapParser')}) { $args{ $att } = [ map { $self->handle_response_strtonativemap($type, $_) } @$value ]; } elsif (do { state %d; $d{$type} //= $type->does('Paws::API::MapParser')}) { die "MapParser Type in an Array. Please implement me"; } else { $args{ $att } = [ map { $self->new_from_result_struct($type, $_) } @$value ]; } } else { if (defined $value){ $args{ $att } = $value; } } } } $class->new(%args); } } sub response_to_object { my ($self, $call_object, $response) = @_; $call_object = $call_object->meta->name; my $returns = (defined $call_object->_returns) && ($call_object->_returns ne 'Paws::API::Response'); my $ret_class = $returns ? $call_object->_returns : 'Paws::API::Response'; Paws->load_class($ret_class); my $headers = $response->headers; my $request_id = $headers->{'x-amz-request-id'} || $headers->{'x-amzn-requestid'}; # AWS has sent duplicate headers x-amx-request-id headers on some services. See issue 324 for more info $request_id = (ref($request_id) eq 'ARRAY') ? $request_id->[0] : $request_id; return Paws::API::Response->new(_request_id => $request_id) if (not $returns); my $unserialized_struct = $self->unserialize_response( $response ); $unserialized_struct->{ _request_id } = $request_id; my $o_result = $self->new_from_result_struct($call_object->_returns, $unserialized_struct); return $o_result; } 1;