fix: incorrect json response content type

This commit is contained in:
gengteng
2023-08-01 22:11:44 +08:00
parent 9336fa2ad9
commit a48a2a640c
5 changed files with 27 additions and 35 deletions

View File

@@ -1,6 +1,6 @@
[package]
name = "axum-valid"
version = "0.4.1"
version = "0.4.2"
description = "Validation tools for axum using the validator library."
authors = ["GengTeng <me@gteng.org>"]
license = "MIT"
@@ -23,11 +23,6 @@ edition = "2021"
axum = { version = "0.6.18", default-features = false }
validator = "0.16.0"
[dependencies.serde_json]
package = "serde_json"
version = "1.0.103"
optional = true
[dev-dependencies]
anyhow = "1.0.71"
axum = { version = "0.6.18" }
@@ -37,11 +32,12 @@ reqwest = { version = "0.11.18", features = ["json"] }
serde = { version = "1.0.163", features = ["derive"] }
validator = { version = "0.16.0", features = ["derive"] }
serde_json = "1.0.103"
mime = "0.3.17"
[features]
default = ["json", "form", "query"]
json = ["axum/json"]
form = ["axum/form"]
query = ["axum/query"]
into_json = ["serde_json"]
into_json = ["json"]
422 = []

View File

@@ -47,16 +47,14 @@ impl<E: IntoResponse> IntoResponse for ValidRejection<E> {
match self {
ValidRejection::Valid(validate_error) => {
#[cfg(feature = "into_json")]
match serde_json::to_string(&validate_error) {
Ok(json) => (VALIDATION_ERROR_STATUS, json),
Err(error) => (
StatusCode::INTERNAL_SERVER_ERROR,
format!("Failed to serialize validation error into JSON ({validate_error}): {error}"),
),
{
(VALIDATION_ERROR_STATUS, axum::Json(validate_error)).into_response()
}
#[cfg(not(feature = "into_json"))]
(VALIDATION_ERROR_STATUS, validate_error.to_string())
}.into_response(),
{
(VALIDATION_ERROR_STATUS, validate_error.to_string()).into_response()
}
}
ValidRejection::Inner(json_error) => json_error.into_response(),
}
}

View File

@@ -15,6 +15,8 @@ use serde_json::json;
use std::net::SocketAddr;
use validator::Validate;
mod utils;
mod route {
pub const PATH: &str = "/path/:v0/:v1";
pub const QUERY: &str = "/query";
@@ -78,10 +80,7 @@ async fn main() -> anyhow::Result<()> {
.await?;
assert_eq!(invalid_path_response.status(), VALIDATION_ERROR_STATUS);
#[cfg(feature = "into_json")]
assert!(invalid_path_response
.json::<serde_json::Value>()
.await
.is_ok());
utils::check_json(invalid_path_response).await;
println!("Valid<Path<...>> works.");
// Valid<Query<...>>
@@ -107,10 +106,7 @@ async fn main() -> anyhow::Result<()> {
.await?;
assert_eq!(invalid_query_response.status(), VALIDATION_ERROR_STATUS);
#[cfg(feature = "into_json")]
assert!(invalid_query_response
.json::<serde_json::Value>()
.await
.is_ok());
utils::check_json(invalid_query_response).await;
println!("Valid<Query<...>> works.");
// Valid<Form<...>>
@@ -139,10 +135,7 @@ async fn main() -> anyhow::Result<()> {
.await?;
assert_eq!(invalid_form_response.status(), VALIDATION_ERROR_STATUS);
#[cfg(feature = "into_json")]
assert!(invalid_form_response
.json::<serde_json::Value>()
.await
.is_ok());
utils::check_json(invalid_form_response).await;
println!("Valid<Form<...>> works.");
// Valid<Json<...>>
@@ -171,10 +164,7 @@ async fn main() -> anyhow::Result<()> {
.await?;
assert_eq!(invalid_json_response.status(), VALIDATION_ERROR_STATUS);
#[cfg(feature = "into_json")]
assert!(invalid_json_response
.json::<serde_json::Value>()
.await
.is_ok());
utils::check_json(invalid_json_response).await;
println!("Valid<Json<...>> works.");
drop(server_guard);

View File

@@ -12,6 +12,8 @@ use serde::{Deserialize, Serialize};
use std::net::SocketAddr;
use validator::Validate;
mod utils;
const MY_DATA_HEADER: &str = "My-Data";
// 1. Implement your own extractor.
@@ -124,10 +126,7 @@ async fn main() -> anyhow::Result<()> {
.await?;
assert_eq!(invalid_my_data_response.status(), VALIDATION_ERROR_STATUS);
#[cfg(feature = "into_json")]
assert!(invalid_my_data_response
.json::<serde_json::Value>()
.await
.is_ok());
utils::check_json(invalid_my_data_response).await;
println!("Valid<MyData> works.");
drop(server_guard);

9
tests/utils.rs Normal file
View File

@@ -0,0 +1,9 @@
/// Check if the response is a json response
#[cfg(feature = "into_json")]
pub async fn check_json(response: reqwest::Response) {
assert_eq!(
response.headers()[axum::http::header::CONTENT_TYPE],
axum::http::HeaderValue::from_static(mime::APPLICATION_JSON.as_ref())
);
assert!(response.json::<serde_json::Value>().await.is_ok());
}