From d2d388ff83df0e85ee9fc8ab36e0e92f6561ddc4 Mon Sep 17 00:00:00 2001 From: Tglman Date: Fri, 5 Mar 2021 12:35:09 +0000 Subject: [PATCH] add support of filtering guards in Files of actix-files --- actix-files/src/files.rs | 46 +++++++++++++++++++--------------------- 1 file changed, 22 insertions(+), 24 deletions(-) diff --git a/actix-files/src/files.rs b/actix-files/src/files.rs index 6f8b28bbf..bb0ec12af 100644 --- a/actix-files/src/files.rs +++ b/actix-files/src/files.rs @@ -36,7 +36,8 @@ pub struct Files { renderer: Rc, mime_override: Option>, file_flags: named::Flags, - guards: Option>, + use_guards: Option>, + guards: Vec>, hidden_files: bool, } @@ -46,24 +47,6 @@ impl fmt::Debug for Files { } } -impl Clone for Files { - fn clone(&self) -> Self { - Self { - directory: self.directory.clone(), - index: self.index.clone(), - show_index: self.show_index, - redirect_to_slash: self.redirect_to_slash, - default: self.default.clone(), - renderer: self.renderer.clone(), - file_flags: self.file_flags, - path: self.path.clone(), - mime_override: self.mime_override.clone(), - guards: self.guards.clone(), - hidden_files: self.hidden_files, - } - } -} - impl Files { /// Create new `Files` instance for a specified base directory. /// @@ -103,7 +86,8 @@ impl Files { renderer: Rc::new(directory_listing), mime_override: None, file_flags: named::Flags::default(), - guards: None, + use_guards: None, + guards: Vec::new(), hidden_files: false, } } @@ -184,7 +168,15 @@ impl Files { /// Default behaviour allows GET and HEAD. #[inline] pub fn use_guards(mut self, guards: G) -> Self { - self.guards = Some(Rc::new(guards)); + self.use_guards = Some(Rc::new(guards)); + self + } + + /// Specifies custom guards to use for directory listings and files. + /// + #[inline] + pub fn guard(mut self, guard: G) -> Self { + self.guards.push(Box::new(guard)); self } @@ -225,7 +217,13 @@ impl Files { } impl HttpServiceFactory for Files { - fn register(self, config: &mut AppService) { + fn register(mut self, config: &mut AppService) { + let guards = if self.guards.is_empty() { + None + } else { + Some(std::mem::take(&mut self.guards)) + }; + if self.default.borrow().is_none() { *self.default.borrow_mut() = Some(config.default_service()); } @@ -236,7 +234,7 @@ impl HttpServiceFactory for Files { ResourceDef::prefix(&self.path) }; - config.register_service(rdef, None, self, None) + config.register_service(rdef, guards, self, None) } } @@ -258,7 +256,7 @@ impl ServiceFactory for Files { renderer: self.renderer.clone(), mime_override: self.mime_override.clone(), file_flags: self.file_flags, - guards: self.guards.clone(), + guards: self.use_guards.clone(), hidden_files: self.hidden_files, };