@@ -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
10131020sub _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