diff --git a/crates/dav-proto/src/schema/request.rs b/crates/dav-proto/src/schema/request.rs index 397b07d0..878c03e6 100644 --- a/crates/dav-proto/src/schema/request.rs +++ b/crates/dav-proto/src/schema/request.rs @@ -5,18 +5,18 @@ */ use super::{ + Collation, MatchType, property::{DavProperty, DavValue, LockScope, LockType}, response::Ace, - Collation, MatchType, }; -use crate::Depth; +use crate::{Condition, Depth}; use calcard::{ icalendar::{ICalendarComponentType, ICalendarParameterName, ICalendarProperty}, vcard::{VCardParameterName, VCardProperty}, }; use types::{ - dead_property::{ArchivedDeadProperty, ArchivedDeadPropertyTag, DeadElementTag, DeadProperty}, TimeRange, + dead_property::{ArchivedDeadProperty, ArchivedDeadPropertyTag, DeadElementTag, DeadProperty}, }; #[derive(Debug, Clone, PartialEq, Eq, Default)] @@ -284,3 +284,12 @@ impl DavDeadProperty for ArchivedDeadProperty { } } } + +impl Condition<'_> { + pub fn is_none_match(&self) -> bool { + match self { + Condition::ETag { is_not, .. } | Condition::Exists { is_not } => *is_not, + Condition::StateToken { .. } => false, + } + } +} diff --git a/crates/dav/src/common/lock.rs b/crates/dav/src/common/lock.rs index 75b1daef..0302cb78 100644 --- a/crates/dav/src/common/lock.rs +++ b/crates/dav/src/common/lock.rs @@ -605,7 +605,18 @@ impl LockRequestHandler for Server { return lock_response; } - Err(DavError::Code(StatusCode::PRECONDITION_FAILED)) + Err(DavError::Code( + if matches!(method, DavMethod::GET | DavMethod::HEAD) + && headers + .if_ + .iter() + .any(|if_| if_.list.iter().any(|cond| cond.is_none_match())) + { + StatusCode::NOT_MODIFIED + } else { + StatusCode::PRECONDITION_FAILED + }, + )) } }