From be288fa00af234c797aeaa7dd516dfdbf0e8f0f5 Mon Sep 17 00:00:00 2001 From: Nikolay Kim Date: Tue, 10 Apr 2018 10:57:53 -0700 Subject: [PATCH] for NamedFile process etag and last modified only if status code is 200 --- src/application.rs | 16 ++++++++-------- src/fs.rs | 15 +++++++++++++++ src/resource.rs | 30 ++++++++++++++++++++++++++++++ 3 files changed, 53 insertions(+), 8 deletions(-) diff --git a/src/application.rs b/src/application.rs index f6c1261056c..db0e9d813bc 100644 --- a/src/application.rs +++ b/src/application.rs @@ -216,8 +216,8 @@ impl App where S: 'static { /// let app = App::new() /// .prefix("/app") /// .resource("/test", |r| { - /// r.method(http::Method::GET).f(|_| HttpResponse::Ok()); - /// r.method(http::Method::HEAD).f(|_| HttpResponse::MethodNotAllowed()); + /// r.get().f(|_| HttpResponse::Ok()); + /// r.head().f(|_| HttpResponse::MethodNotAllowed()); /// }) /// .finish(); /// } @@ -309,8 +309,8 @@ impl App where S: 'static { /// fn main() { /// let app = App::new() /// .resource("/test", |r| { - /// r.method(http::Method::GET).f(|_| HttpResponse::Ok()); - /// r.method(http::Method::HEAD).f(|_| HttpResponse::MethodNotAllowed()); + /// r.get().f(|_| HttpResponse::Ok()); + /// r.head().f(|_| HttpResponse::MethodNotAllowed()); /// }); /// } /// ``` @@ -377,7 +377,7 @@ impl App where S: 'static { /// /// fn main() { /// let app = App::new() - /// .resource("/index.html", |r| r.f(index)) + /// .resource("/index.html", |r| r.get().f(index)) /// .external_resource("youtube", "https://youtube.com/watch/{video_id}") /// .finish(); /// } @@ -449,14 +449,14 @@ impl App where S: 'static { /// /// ```rust /// # extern crate actix_web; - /// use actix_web::{App, HttpResponse, http, fs, middleware}; + /// use actix_web::{App, HttpResponse, fs, middleware}; /// /// // this function could be located in different module /// fn config(app: App) -> App { /// app /// .resource("/test", |r| { - /// r.method(http::Method::GET).f(|_| HttpResponse::Ok()); - /// r.method(http::Method::HEAD).f(|_| HttpResponse::MethodNotAllowed()); + /// r.get().f(|_| HttpResponse::Ok()); + /// r.head().f(|_| HttpResponse::MethodNotAllowed()); /// }) /// } /// diff --git a/src/fs.rs b/src/fs.rs index 8c6402621b9..73ca68289fb 100644 --- a/src/fs.rs +++ b/src/fs.rs @@ -182,6 +182,21 @@ impl Responder for NamedFile { type Error = io::Error; fn respond_to(self, req: HttpRequest) -> Result { + if self.status_code != StatusCode::OK { + let mut resp = HttpResponse::build(self.status_code); + resp.if_some(self.path().extension(), |ext, resp| { + resp.set(header::ContentType(get_mime_type(&ext.to_string_lossy()))); + }); + let reader = ChunkedReadFile { + size: self.md.len(), + offset: 0, + cpu_pool: self.cpu_pool.unwrap_or_else(|| req.cpu_pool().clone()), + file: Some(self.file), + fut: None, + }; + return Ok(resp.streaming(reader)) + } + if self.only_get && *req.method() != Method::GET && *req.method() != Method::HEAD { return Ok(HttpResponse::MethodNotAllowed() .header(header::CONTENT_TYPE, "text/plain") diff --git a/src/resource.rs b/src/resource.rs index 0ffc641223f..19a1b057c50 100644 --- a/src/resource.rs +++ b/src/resource.rs @@ -92,6 +92,36 @@ impl ResourceHandler { self.routes.last_mut().unwrap() } + /// Register a new `GET` route. + pub fn get(&mut self) -> &mut Route { + self.routes.push(Route::default()); + self.routes.last_mut().unwrap().filter(pred::Get()) + } + + /// Register a new `POST` route. + pub fn post(&mut self) -> &mut Route { + self.routes.push(Route::default()); + self.routes.last_mut().unwrap().filter(pred::Post()) + } + + /// Register a new `PUT` route. + pub fn put(&mut self) -> &mut Route { + self.routes.push(Route::default()); + self.routes.last_mut().unwrap().filter(pred::Put()) + } + + /// Register a new `DELETE` route. + pub fn delete(&mut self) -> &mut Route { + self.routes.push(Route::default()); + self.routes.last_mut().unwrap().filter(pred::Delete()) + } + + /// Register a new `HEAD` route. + pub fn head(&mut self) -> &mut Route { + self.routes.push(Route::default()); + self.routes.last_mut().unwrap().filter(pred::Head()) + } + /// Register a new route and add method check to route. /// /// This is shortcut for: