mirror of
https://github.com/lennart-k/rustical.git
synced 2026-01-30 11:48:18 +00:00
Fix status code for failed preconditions
This commit is contained in:
@@ -23,7 +23,7 @@ impl IntoResponse for Precondition {
|
|||||||
if let Err(err) = error.serialize_root(&mut writer) {
|
if let Err(err) = error.serialize_root(&mut writer) {
|
||||||
return rustical_dav::Error::from(err).into_response();
|
return rustical_dav::Error::from(err).into_response();
|
||||||
}
|
}
|
||||||
let mut res = Response::builder().status(StatusCode::PRECONDITION_FAILED);
|
let mut res = Response::builder().status(StatusCode::FORBIDDEN);
|
||||||
res.headers_mut().unwrap().typed_insert(ContentType::xml());
|
res.headers_mut().unwrap().typed_insert(ContentType::xml());
|
||||||
res.body(Body::from(output)).unwrap()
|
res.body(Body::from(output)).unwrap()
|
||||||
}
|
}
|
||||||
@@ -72,7 +72,10 @@ impl Error {
|
|||||||
Self::XmlDecodeError(_) => StatusCode::BAD_REQUEST,
|
Self::XmlDecodeError(_) => StatusCode::BAD_REQUEST,
|
||||||
Self::ChronoParseError(_) | Self::NotImplemented => StatusCode::INTERNAL_SERVER_ERROR,
|
Self::ChronoParseError(_) | Self::NotImplemented => StatusCode::INTERNAL_SERVER_ERROR,
|
||||||
Self::NotFound => StatusCode::NOT_FOUND,
|
Self::NotFound => StatusCode::NOT_FOUND,
|
||||||
Self::PreconditionFailed(_err) => StatusCode::PRECONDITION_FAILED,
|
// The correct status code for a failed precondition is not PreconditionFailed but
|
||||||
|
// Forbidden (or Conflict):
|
||||||
|
// https://datatracker.ietf.org/doc/html/rfc4791#section-1.3
|
||||||
|
Self::PreconditionFailed(_err) => StatusCode::FORBIDDEN,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -82,10 +85,7 @@ impl IntoResponse for Error {
|
|||||||
if let Self::PreconditionFailed(precondition) = self {
|
if let Self::PreconditionFailed(precondition) = self {
|
||||||
return precondition.into_response();
|
return precondition.into_response();
|
||||||
}
|
}
|
||||||
if matches!(
|
if matches!(self.status_code(), StatusCode::INTERNAL_SERVER_ERROR) {
|
||||||
self.status_code(),
|
|
||||||
StatusCode::INTERNAL_SERVER_ERROR | StatusCode::PRECONDITION_FAILED
|
|
||||||
) {
|
|
||||||
error!("{self}");
|
error!("{self}");
|
||||||
}
|
}
|
||||||
(self.status_code(), self.to_string()).into_response()
|
(self.status_code(), self.to_string()).into_response()
|
||||||
|
|||||||
@@ -51,19 +51,18 @@ impl Error {
|
|||||||
_ => StatusCode::BAD_REQUEST,
|
_ => StatusCode::BAD_REQUEST,
|
||||||
},
|
},
|
||||||
Self::PropReadOnly => StatusCode::CONFLICT,
|
Self::PropReadOnly => StatusCode::CONFLICT,
|
||||||
Self::PreconditionFailed => StatusCode::PRECONDITION_FAILED,
|
|
||||||
Self::InternalError | Self::IOError(_) => StatusCode::INTERNAL_SERVER_ERROR,
|
Self::InternalError | Self::IOError(_) => StatusCode::INTERNAL_SERVER_ERROR,
|
||||||
Self::Forbidden => StatusCode::FORBIDDEN,
|
// The correct status code for a failed precondition is not PreconditionFailed but
|
||||||
|
// Forbidden (or Conflict):
|
||||||
|
// https://datatracker.ietf.org/doc/html/rfc4791#section-1.3
|
||||||
|
Self::PreconditionFailed | Self::Forbidden => StatusCode::FORBIDDEN,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl axum::response::IntoResponse for Error {
|
impl axum::response::IntoResponse for Error {
|
||||||
fn into_response(self) -> axum::response::Response {
|
fn into_response(self) -> axum::response::Response {
|
||||||
if matches!(
|
if matches!(self.status_code(), StatusCode::INTERNAL_SERVER_ERROR) {
|
||||||
self.status_code(),
|
|
||||||
StatusCode::INTERNAL_SERVER_ERROR | StatusCode::PRECONDITION_FAILED
|
|
||||||
) {
|
|
||||||
error!("{self}");
|
error!("{self}");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -53,9 +53,7 @@ impl IntoResponse for Error {
|
|||||||
fn into_response(self) -> axum::response::Response {
|
fn into_response(self) -> axum::response::Response {
|
||||||
if matches!(
|
if matches!(
|
||||||
self.status_code(),
|
self.status_code(),
|
||||||
StatusCode::INTERNAL_SERVER_ERROR
|
StatusCode::INTERNAL_SERVER_ERROR | StatusCode::CONFLICT
|
||||||
| StatusCode::PRECONDITION_FAILED
|
|
||||||
| StatusCode::CONFLICT
|
|
||||||
) {
|
) {
|
||||||
error!("{self}");
|
error!("{self}");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ END:VCALENDAR";
|
|||||||
.typed_insert(Authorization::basic("user", "pass"));
|
.typed_insert(Authorization::basic("user", "pass"));
|
||||||
|
|
||||||
let response = app.clone().oneshot(request).await.unwrap();
|
let response = app.clone().oneshot(request).await.unwrap();
|
||||||
assert_eq!(response.status(), StatusCode::PRECONDITION_FAILED);
|
assert_eq!(response.status(), StatusCode::FORBIDDEN);
|
||||||
let body = response.extract_string().await;
|
let body = response.extract_string().await;
|
||||||
insta::assert_snapshot!(body, @r#"
|
insta::assert_snapshot!(body, @r#"
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|||||||
Reference in New Issue
Block a user