diff --git a/src/auth.rs b/src/auth.rs index 7eb59454a..58a8bd9f9 100644 --- a/src/auth.rs +++ b/src/auth.rs @@ -100,6 +100,7 @@ impl AccessControl { path: &str, method: &Method, authorization: Option<&HeaderValue>, + guard_options: bool, ) -> (Option, Option) { if let Some(authorization) = authorization { if let Some(user) = get_auth_user(authorization) { @@ -116,7 +117,7 @@ impl AccessControl { return (None, None); } - if method == Method::OPTIONS { + if !guard_options && method == Method::OPTIONS { return (None, Some(AccessPaths::new(AccessPerm::ReadOnly))); } diff --git a/src/server.rs b/src/server.rs index 832cd1d03..3cb7996be 100644 --- a/src/server.rs +++ b/src/server.rs @@ -23,7 +23,7 @@ use hyper::body::Frame; use hyper::{ body::Incoming, header::{ - HeaderValue, AUTHORIZATION, CONTENT_DISPOSITION, CONTENT_LENGTH, CONTENT_RANGE, + HeaderValue, AUTHORIZATION, CONNECTION, CONTENT_DISPOSITION, CONTENT_LENGTH, CONTENT_RANGE, CONTENT_TYPE, RANGE, }, Method, StatusCode, Uri, @@ -107,12 +107,18 @@ impl Server { let uri = req.uri().clone(); let assets_prefix = &self.assets_prefix; let enable_cors = self.args.enable_cors; + let is_microsoft_webdav = req + .headers() + .get("user-agent") + .and_then(|v| v.to_str().ok()) + .map(|v| v.starts_with("Microsoft-WebDAV-MiniRedir/")) + .unwrap_or_default(); let mut http_log_data = self.args.http_logger.data(&req); if let Some(addr) = addr { http_log_data.insert("remote_addr".to_string(), addr.ip().to_string()); } - let mut res = match self.clone().handle(req).await { + let mut res = match self.clone().handle(req, is_microsoft_webdav).await { Ok(res) => { http_log_data.insert("status".to_string(), res.status().as_u16().to_string()); if !uri.path().starts_with(assets_prefix) { @@ -132,13 +138,22 @@ impl Server { } }; + if is_microsoft_webdav { + // microsoft webdav requires this. + res.headers_mut() + .insert(CONNECTION, HeaderValue::from_static("close")); + } if enable_cors { add_cors(&mut res); } Ok(res) } - pub async fn handle(self: Arc, req: Request) -> Result { + pub async fn handle( + self: Arc, + req: Request, + is_microsoft_webdav: bool, + ) -> Result { let mut res = Response::default(); let req_path = req.uri().path(); @@ -162,7 +177,10 @@ impl Server { } let authorization = headers.get(AUTHORIZATION); - let guard = self.args.auth.guard(&relative_path, &method, authorization); + let guard = + self.args + .auth + .guard(&relative_path, &method, authorization, is_microsoft_webdav); let (user, access_paths) = match guard { (None, None) => { @@ -1204,7 +1222,7 @@ impl Server { let guard = self .args .auth - .guard(&dest_path, req.method(), authorization); + .guard(&dest_path, req.method(), authorization, false); match guard { (_, Some(_)) => {}