$response->header("Client-Date" => HTTP::Date::time2str(time));
$self->run_handlers("response_done", $response);
$self->progress("end", $response);
return $response;
}
sub prepare_request
{
my($self, $request) = @_;
die "Method missing" unless $request->method;
my $url = $request->url;
die "URL missing" unless $url;
die "URL must be absolute" unless $url->scheme;
$self->run_handlers("request_preprepare", $request);
my $max_size = $self->{max_size};
if (defined $max_size) {
my $last = $max_size - 1;
$last = 0 if $last < 0; # there is no way to actually request no content
$request->init_header('Range' => "bytes=0-$last");
}
if (my $def_headers = $self->{def_headers}) {
for my $h ($def_headers->header_field_names) {
$request->init_header($h => [$def_headers->header($h)]);
}
}
$self->run_handlers("request_prepare", $request);
return $request;
}
sub simple_request
{
my($self, $request, $arg, $size) = @_;
# sanity check the request passed in
if (defined $request) {
if (ref $request) {
Carp::croak("You need a request object, not a " . ref($request) . " object")
if ref($request) eq 'ARRAY' or ref($request) eq 'HASH' or
!$request->can('method') or !$request->can('uri');
}
else {
Carp::croak("You need a request object, not '$request'");
}
}
else {
Carp::croak("No request object passed in");
}
eval {
$request = $self->prepare_request($request);
};
if ($@) {
$@ =~ s/ at .* line \d+.*//s; # remove file/line number
return _new_response($request, &HTTP::Status::RC_BAD_REQUEST, $@);
}
return $self->send_request($request, $arg, $size);
}
sub request
{
my($self, $request, $arg, $size, $previous) = @_;
LWP::Debug::trace('()');
my $response = $self->simple_request($request, $arg, $size);
if ($previous) {
$response->previous($previous);
# Check for loop in the redirects, we only count
my $count = 0;
my $r = $response;
while ($r) {
if (++$count > $self->{max_redirect}) {
$response->header("Client-Warning" =>
"Redirect loop detected (max_redirect = $self->{max_redirect})");
return $response;
}
$r = $r->previous;
}
}
if (my $req = $self->run_handlers("response_redirect", $response)) {
return $self->request($req, $arg, $size, $response);
}
my $code = $response->code;
LWP::Debug::debug('Simple response: ' .
(HTTP::Status::status_message($code) ||
=3= |