1#![doc = include_str!("../README.md")]
2
3use actix_web::http::StatusCode;
4use actix_web::{dev, HttpResponse, ResponseError};
5
6use awc::error::{
7 ConnectError, SendRequestError as AwcSendRequestError,
8};
9use awc::ClientResponse;
10
11use std::fmt;
12
13#[derive(Debug)]
20pub struct SendRequestError(AwcSendRequestError);
21
22impl fmt::Display for SendRequestError {
23 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
24 write!(f, "{}", self.0)
25 }
26}
27
28impl From<AwcSendRequestError> for SendRequestError {
29 fn from(e: AwcSendRequestError) -> Self {
30 Self(e)
31 }
32}
33
34impl ResponseError for SendRequestError {
37 fn status_code(&self) -> StatusCode {
38 match self.0 {
39 AwcSendRequestError::Connect(ConnectError::Timeout) => {
40 StatusCode::GATEWAY_TIMEOUT
41 }
42 AwcSendRequestError::Connect(_) => StatusCode::BAD_REQUEST,
43 _ => StatusCode::INTERNAL_SERVER_ERROR,
44 }
45 }
46}
47
48pub trait IntoHttpResponse {
58 fn into_http_response(self) -> HttpResponse;
63
64 fn into_wrapped_http_response<E>(self) -> Result<HttpResponse, E>
77 where
78 Self: Sized,
79 {
80 Ok(self.into_http_response())
81 }
82}
83
84impl IntoHttpResponse
85 for ClientResponse<dev::Decompress<dev::Payload>>
86{
87 fn into_http_response(self) -> HttpResponse {
88 let mut response = HttpResponse::build(self.status());
89
90 self.headers().into_iter().for_each(|(k, v)| {
91 response.insert_header((k, v));
92 });
93
94 response.streaming(self)
95 }
96}