App-MtAws
view release on metacpan or search on metacpan
lib/App/MtAws/GlacierRequest.pm view on Meta::CPAN
if (!$size || ($self->{expected_size} && $size != $self->{expected_size})) {
die exception
wrong_file_size_in_journal =>
'Wrong Content-Length received from server, probably wrong file size in Journal or wrong server';
}
$self->{writer}->reinit($size);
} else {
# we should "confess" here, but we cant, only exceptions propogated
die exception "unknow_error" => "Unknown error, probably LWP version is too old";
}
}
$self->{writer}->add_data($_[0]);
1;
});
} else {
$resp = $ua->request($req);
}
my $dt = time()-$t0;
if (($resp->code eq '500') && $resp->header('Client-Warning') && ($resp->header('Client-Warning') eq 'Internal response')) {
if ($resp->content =~ /Can't verify SSL peers without knowing which Certificate Authorities to trust/i) {
die exception 'lwp_ssl_ca_exception' =>
'Can\'t verify SSL peers without knowing which Certificate Authorities to trust. Probably "Mozilla::CA" module is missing';
} else {
print "PID $$ HTTP connection problem (timeout?). Will retry ($dt seconds spent for request)\n";
$self->{last_retry_reason} = 'Internal response';
throttle($i);
}
} elsif ($resp->code =~ /^(500|408)$/) {
print "PID $$ HTTP ".$resp->code." This might be normal. Will retry ($dt seconds spent for request)\n";
$self->{last_retry_reason} = $resp->code;
throttle($i);
} elsif (defined($resp->header('X-Died')) && (get_exception($resp->header('X-Died')))) {
die $resp->header('X-Died'); # propogate our own exceptions
} elsif (defined($resp->header('X-Died')) && length($resp->header('X-Died'))) {
print "PID $$ HTTP connection problem. Will retry ($dt seconds spent for request)\n";
$self->{last_retry_reason} = 'X-Died';
throttle($i);
} elsif ($resp->code =~ /^2\d\d$/) {
if ($self->{writer}) {
my ($c, $reason) = $self->{writer}->finish();
if ($c eq 'retry') {
print "PID $$ HTTP $reason. Will retry ($dt seconds spent for request)\n";
$self->{last_retry_reason} = $reason;
throttle($i);
} elsif ($c ne 'ok') {
confess;
} else {
return $resp;
}
} elsif (defined($resp->content_length) && $resp->content_length != length($resp->content)){
print "PID $$ HTTP Unexpected end of data. Will retry ($dt seconds spent for request)\n";
$self->{last_retry_reason}='Unexpected end of data';
throttle($i);
} else {
return $resp;
}
} else {
if ($resp->code =~ /^40[03]$/) {
if ($resp->content_type && $resp->content_type eq 'application/json') {
my $json = JSON::XS->new->allow_nonref;
my $scalar = eval { $json->decode( $resp->content ); }; # we assume content always in utf8
if (defined $scalar) {
my $code = $scalar->{code};
my $type = $scalar->{type};
my $message = $scalar->{message};
if ($code eq 'ThrottlingException') {
print "PID $$ ThrottlingException. Will retry ($dt seconds spent for request)\n";
$self->{last_retry_reason} = 'ThrottlingException';
throttle($i);
next;
}
}
}
}
print STDERR "Error:\n";
print STDERR dump_request_response($req, $resp);
die exception 'http_unexpected_reply' => 'Unexpected reply from remote server';
}
}
die exception 'too_many_tries' => "Request was not successful after "._max_retries." retries";
}
sub get_signature_key
{
my ($secret, $date, $region, $service) = @_;
my $kSecret = $secret;
my $kDate = hmac_sha256($date, "AWS4".$kSecret);
my $kRegion = hmac_sha256($region, $kDate);
my $kService = hmac_sha256($service, $kRegion);
my $kSigning = hmac_sha256("aws4_request", $kService);
my $kSigning_hex = hmac_sha256_hex($kService, "aws4_request");
return ($kSigning, $kSigning_hex);
}
sub trim
{
my ($s) = @_;
$s =~ s/\s*\Z//gsi;
$s =~ s/\A\s*//gsi;
$s;
}
1;
__END__
( run in 1.503 second using v1.01-cache-2.11-cpan-39bf76dae61 )