mirror of
https://github.com/lennart-k/rustical.git
synced 2026-01-30 06:58:26 +00:00
PUT object: Return ETag
This commit is contained in:
@@ -6,7 +6,7 @@ use axum::extract::{Path, State};
|
|||||||
use axum::response::{IntoResponse, Response};
|
use axum::response::{IntoResponse, Response};
|
||||||
use axum_extra::TypedHeader;
|
use axum_extra::TypedHeader;
|
||||||
use headers::{ContentType, ETag, HeaderMapExt, IfNoneMatch};
|
use headers::{ContentType, ETag, HeaderMapExt, IfNoneMatch};
|
||||||
use http::{HeaderMap, Method, StatusCode};
|
use http::{HeaderMap, HeaderValue, Method, StatusCode};
|
||||||
use rustical_ical::CalendarObject;
|
use rustical_ical::CalendarObject;
|
||||||
use rustical_store::CalendarStore;
|
use rustical_store::CalendarStore;
|
||||||
use rustical_store::auth::Principal;
|
use rustical_store::auth::Principal;
|
||||||
@@ -82,9 +82,15 @@ pub async fn put_event<C: CalendarStore>(
|
|||||||
debug!("invalid calendar data:\n{body}");
|
debug!("invalid calendar data:\n{body}");
|
||||||
return Err(Error::PreconditionFailed(Precondition::ValidCalendarData));
|
return Err(Error::PreconditionFailed(Precondition::ValidCalendarData));
|
||||||
};
|
};
|
||||||
|
let etag = object.get_etag();
|
||||||
cal_store
|
cal_store
|
||||||
.put_object(principal, calendar_id, object, overwrite)
|
.put_object(principal, calendar_id, object, overwrite)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
Ok(StatusCode::CREATED.into_response())
|
let mut headers = HeaderMap::new();
|
||||||
|
headers.insert(
|
||||||
|
"ETag",
|
||||||
|
HeaderValue::from_str(&etag).expect("Contains no invalid characters"),
|
||||||
|
);
|
||||||
|
Ok((StatusCode::CREATED, headers).into_response())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ use axum::extract::{Path, State};
|
|||||||
use axum::response::{IntoResponse, Response};
|
use axum::response::{IntoResponse, Response};
|
||||||
use axum_extra::TypedHeader;
|
use axum_extra::TypedHeader;
|
||||||
use axum_extra::headers::{ContentType, ETag, HeaderMapExt, IfNoneMatch};
|
use axum_extra::headers::{ContentType, ETag, HeaderMapExt, IfNoneMatch};
|
||||||
|
use http::HeaderValue;
|
||||||
use http::Method;
|
use http::Method;
|
||||||
use http::{HeaderMap, StatusCode};
|
use http::{HeaderMap, StatusCode};
|
||||||
use rustical_dav::privileges::UserPrivilege;
|
use rustical_dav::privileges::UserPrivilege;
|
||||||
@@ -87,9 +88,15 @@ pub async fn put_object<AS: AddressbookStore>(
|
|||||||
};
|
};
|
||||||
|
|
||||||
let object = AddressObject::from_vcf(object_id, body)?;
|
let object = AddressObject::from_vcf(object_id, body)?;
|
||||||
|
let etag = object.get_etag();
|
||||||
addr_store
|
addr_store
|
||||||
.put_object(principal, addressbook_id, object, overwrite)
|
.put_object(principal, addressbook_id, object, overwrite)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
Ok(StatusCode::CREATED.into_response())
|
let mut headers = HeaderMap::new();
|
||||||
|
headers.insert(
|
||||||
|
"ETag",
|
||||||
|
HeaderValue::from_str(&etag).expect("Contains no invalid characters"),
|
||||||
|
);
|
||||||
|
Ok((StatusCode::CREATED, headers).into_response())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -52,12 +52,12 @@ pub async fn route_delete<R: ResourceService>(
|
|||||||
return Err(Error::Unauthorized.into());
|
return Err(Error::Unauthorized.into());
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(if_match) = if_match {
|
if let Some(if_match) = if_match
|
||||||
if !resource.satisfies_if_match(&if_match) {
|
&& !resource.satisfies_if_match(&if_match)
|
||||||
|
{
|
||||||
// Precondition failed
|
// Precondition failed
|
||||||
return Err(crate::Error::PreconditionFailed.into());
|
return Err(crate::Error::PreconditionFailed.into());
|
||||||
}
|
}
|
||||||
}
|
|
||||||
if let Some(if_none_match) = if_none_match
|
if let Some(if_none_match) = if_none_match
|
||||||
&& resource.satisfies_if_none_match(&if_none_match)
|
&& resource.satisfies_if_none_match(&if_none_match)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user