Skip to content

Commit 2d92b7b

Browse files
committed
Allow protocol handlers to raise HTTP::Response objects and multiline strings
1 parent a721413 commit 2d92b7b

1 file changed

Lines changed: 15 additions & 8 deletions

File tree

lib/LWP/UserAgent.pm

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -197,14 +197,21 @@ EOT
197197
if (!$response && $self->{use_eval}) {
198198
# we eval, and turn dies into responses below
199199
eval {
200-
$response = $protocol->request($request, $proxy,
201-
$arg, $size, $self->{timeout});
200+
$response = $protocol->request($request, $proxy, $arg, $size, $self->{timeout}) ||
201+
die "No response returned by $protocol";
202202
};
203203
if ($@) {
204-
$@ =~ s/ at .* line \d+.*//s; # remove file/line number
205-
$response = _new_response($request,
206-
&HTTP::Status::RC_INTERNAL_SERVER_ERROR,
207-
$@);
204+
if (UNIVERSAL::isa($@, "HTTP::Response")) {
205+
$response = $@;
206+
$response->request($request);
207+
}
208+
else {
209+
my $full = $@;
210+
(my $status = $@) =~ s/\n.*//s;
211+
$status =~ s/ at .* line \d+.*//s; # remove file/line number
212+
my $code = ($status =~ s/^(\d\d\d)\s+//) ? $1 : &HTTP::Status::RC_INTERNAL_SERVER_ERROR;
213+
$response = _new_response($request, $code, $status, $full);
214+
}
208215
}
209216
}
210217
elsif (!$response) {
@@ -1011,13 +1018,13 @@ sub no_proxy {
10111018

10121019

10131020
sub _new_response {
1014-
my($request, $code, $message) = @_;
1021+
my($request, $code, $message, $content) = @_;
10151022
my $response = HTTP::Response->new($code, $message);
10161023
$response->request($request);
10171024
$response->header("Client-Date" => HTTP::Date::time2str(time));
10181025
$response->header("Client-Warning" => "Internal response");
10191026
$response->header("Content-Type" => "text/plain");
1020-
$response->content("$code $message\n");
1027+
$response->content($content || "$code $message\n");
10211028
return $response;
10221029
}
10231030

0 commit comments

Comments
 (0)