actix-files returns response with NamedFile::into_response

This commit is contained in:
fakeshadow 2021-01-09 03:30:26 +08:00
parent e03899379c
commit 498d171282
3 changed files with 17 additions and 20 deletions

View File

@ -1,7 +1,11 @@
# Changes # Changes
## Unreleased - 2021-xx-xx ## Unreleased - 2021-xx-xx
### Changed
* Rework `Responder` trait to be sync and returns `Response`/`HttpResponse` directly.
Making it more simple and performant. [#1891]
[#1891]: https://github.com/actix/actix-web/pull/1891
## 4.0.0-beta.1 - 2021-01-07 ## 4.0.0-beta.1 - 2021-01-07
### Added ### Added

View File

@ -16,7 +16,7 @@ use actix_web::{
}, },
ContentEncoding, StatusCode, ContentEncoding, StatusCode,
}, },
Error, HttpMessage, HttpRequest, HttpResponse, Responder, HttpMessage, HttpRequest, HttpResponse, Responder,
}; };
use bitflags::bitflags; use bitflags::bitflags;
use mime_guess::from_path; use mime_guess::from_path;
@ -276,7 +276,7 @@ impl NamedFile {
} }
/// Creates an `HttpResponse` with file as a streaming body. /// Creates an `HttpResponse` with file as a streaming body.
pub fn into_response(self, req: &HttpRequest) -> Result<HttpResponse, Error> { pub fn into_response(self, req: &HttpRequest) -> HttpResponse {
if self.status_code != StatusCode::OK { if self.status_code != StatusCode::OK {
let mut res = HttpResponse::build(self.status_code); let mut res = HttpResponse::build(self.status_code);
@ -306,7 +306,7 @@ impl NamedFile {
counter: 0, counter: 0,
}; };
return Ok(res.streaming(reader)); return res.streaming(reader);
} }
let etag = if self.flags.contains(Flags::ETAG) { let etag = if self.flags.contains(Flags::ETAG) {
@ -410,17 +410,17 @@ impl NamedFile {
); );
} else { } else {
resp.header(header::CONTENT_RANGE, format!("bytes */{}", length)); resp.header(header::CONTENT_RANGE, format!("bytes */{}", length));
return Ok(resp.status(StatusCode::RANGE_NOT_SATISFIABLE).finish()); return resp.status(StatusCode::RANGE_NOT_SATISFIABLE).finish();
}; };
} else { } else {
return Ok(resp.status(StatusCode::BAD_REQUEST).finish()); return resp.status(StatusCode::BAD_REQUEST).finish();
}; };
}; };
if precondition_failed { if precondition_failed {
return Ok(resp.status(StatusCode::PRECONDITION_FAILED).finish()); return resp.status(StatusCode::PRECONDITION_FAILED).finish();
} else if not_modified { } else if not_modified {
return Ok(resp.status(StatusCode::NOT_MODIFIED).finish()); return resp.status(StatusCode::NOT_MODIFIED).finish();
} }
let reader = ChunkedReadFile { let reader = ChunkedReadFile {
@ -435,7 +435,7 @@ impl NamedFile {
resp.status(StatusCode::PARTIAL_CONTENT); resp.status(StatusCode::PARTIAL_CONTENT);
} }
Ok(resp.body(SizedStream::new(length, reader))) resp.body(SizedStream::new(length, reader))
} }
} }
@ -496,6 +496,5 @@ fn none_match(etag: Option<&header::EntityTag>, req: &HttpRequest) -> bool {
impl Responder for NamedFile { impl Responder for NamedFile {
fn respond_to(self, req: &HttpRequest) -> HttpResponse { fn respond_to(self, req: &HttpRequest) -> HttpResponse {
self.into_response(req) self.into_response(req)
.unwrap_or_else(|e| HttpResponse::from_error(e))
} }
} }

View File

@ -120,10 +120,8 @@ impl Service<ServiceRequest> for FilesService {
named_file.flags = self.file_flags; named_file.flags = self.file_flags;
let (req, _) = req.into_parts(); let (req, _) = req.into_parts();
Either::Left(ok(match named_file.into_response(&req) { let res = named_file.into_response(&req);
Ok(item) => ServiceResponse::new(req, item), Either::Left(ok(ServiceResponse::new(req, res)))
Err(e) => ServiceResponse::from_err(e, req),
}))
} }
Err(e) => self.handle_err(e, req), Err(e) => self.handle_err(e, req),
} }
@ -154,12 +152,8 @@ impl Service<ServiceRequest> for FilesService {
named_file.flags = self.file_flags; named_file.flags = self.file_flags;
let (req, _) = req.into_parts(); let (req, _) = req.into_parts();
match named_file.into_response(&req) { let res = named_file.into_response(&req);
Ok(item) => { Either::Left(ok(ServiceResponse::new(req, res)))
Either::Left(ok(ServiceResponse::new(req.clone(), item)))
}
Err(e) => Either::Left(ok(ServiceResponse::from_err(e, req))),
}
} }
Err(e) => self.handle_err(e, req), Err(e) => self.handle_err(e, req),
} }