mirror of https://github.com/fafhrd91/actix-web
handle header error with CustomResponder
This commit is contained in:
parent
351286486c
commit
c3cc1a8d33
|
@ -155,8 +155,7 @@ impl Responder for BytesMut {
|
||||||
pub struct CustomResponder<T> {
|
pub struct CustomResponder<T> {
|
||||||
responder: T,
|
responder: T,
|
||||||
status: Option<StatusCode>,
|
status: Option<StatusCode>,
|
||||||
headers: Option<HeaderMap>,
|
headers: Result<HeaderMap, HttpError>,
|
||||||
error: Option<HttpError>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: Responder> CustomResponder<T> {
|
impl<T: Responder> CustomResponder<T> {
|
||||||
|
@ -164,8 +163,7 @@ impl<T: Responder> CustomResponder<T> {
|
||||||
CustomResponder {
|
CustomResponder {
|
||||||
responder,
|
responder,
|
||||||
status: None,
|
status: None,
|
||||||
headers: None,
|
headers: Ok(HeaderMap::new()),
|
||||||
error: None,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -206,14 +204,12 @@ impl<T: Responder> CustomResponder<T> {
|
||||||
where
|
where
|
||||||
H: IntoHeaderPair,
|
H: IntoHeaderPair,
|
||||||
{
|
{
|
||||||
if self.headers.is_none() {
|
if let Ok(ref mut headers) = self.headers {
|
||||||
self.headers = Some(HeaderMap::new());
|
|
||||||
}
|
|
||||||
|
|
||||||
match header.try_into_header_pair() {
|
match header.try_into_header_pair() {
|
||||||
Ok((key, value)) => self.headers.as_mut().unwrap().append(key, value),
|
Ok((key, value)) => headers.append(key, value),
|
||||||
Err(e) => self.error = Some(e.into()),
|
Err(e) => self.headers = Err(e.into()),
|
||||||
};
|
};
|
||||||
|
}
|
||||||
|
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
@ -221,17 +217,20 @@ impl<T: Responder> CustomResponder<T> {
|
||||||
|
|
||||||
impl<T: Responder> Responder for CustomResponder<T> {
|
impl<T: Responder> Responder for CustomResponder<T> {
|
||||||
fn respond_to(self, req: &HttpRequest) -> HttpResponse {
|
fn respond_to(self, req: &HttpRequest) -> HttpResponse {
|
||||||
|
let headers = match self.headers {
|
||||||
|
Ok(headers) => headers,
|
||||||
|
Err(err) => return HttpResponse::from_error(Error::from(err)),
|
||||||
|
};
|
||||||
|
|
||||||
let mut res = self.responder.respond_to(req);
|
let mut res = self.responder.respond_to(req);
|
||||||
|
|
||||||
if let Some(status) = self.status {
|
if let Some(status) = self.status {
|
||||||
*res.status_mut() = status;
|
*res.status_mut() = status;
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(ref headers) = self.headers {
|
|
||||||
for (k, v) in headers {
|
for (k, v) in headers {
|
||||||
// TODO: before v4, decide if this should be append instead
|
// TODO: before v4, decide if this should be append instead
|
||||||
res.headers_mut().insert(k.clone(), v.clone());
|
res.headers_mut().insert(k, v);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
res
|
res
|
||||||
|
|
Loading…
Reference in New Issue