Skip to content

Commit

Permalink
fix: strange issue that occurs only on Microsoft WebDAV (#382)
Browse files Browse the repository at this point in the history
  • Loading branch information
sigoden authored May 11, 2024
1 parent 75f06f7 commit cb7d417
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 6 deletions.
3 changes: 2 additions & 1 deletion src/auth.rs
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,7 @@ impl AccessControl {
path: &str,
method: &Method,
authorization: Option<&HeaderValue>,
guard_options: bool,
) -> (Option<String>, Option<AccessPaths>) {
if let Some(authorization) = authorization {
if let Some(user) = get_auth_user(authorization) {
Expand All @@ -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)));
}

Expand Down
28 changes: 23 additions & 5 deletions src/server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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) {
Expand All @@ -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<Self>, req: Request) -> Result<Response> {
pub async fn handle(
self: Arc<Self>,
req: Request,
is_microsoft_webdav: bool,
) -> Result<Response> {
let mut res = Response::default();

let req_path = req.uri().path();
Expand All @@ -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) => {
Expand Down Expand Up @@ -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(_)) => {}
Expand Down

0 comments on commit cb7d417

Please sign in to comment.