#![doc = include_str!("../docs/extract.md")] use http::header::{self, HeaderMap}; #[cfg(feature = "tokio")] pub mod connect_info; pub mod path; pub mod rejection; #[cfg(feature = "ws")] pub mod ws; mod host; mod raw_form; mod raw_query; mod request_parts; mod state; #[doc(inline)] pub use axum_core::extract::{DefaultBodyLimit, FromRef, FromRequest, FromRequestParts}; #[cfg(feature = "macros")] pub use axum_macros::{FromRef, FromRequest, FromRequestParts}; #[doc(inline)] #[allow(deprecated)] pub use self::{ host::Host, path::{Path, RawPathParams}, raw_form::RawForm, raw_query::RawQuery, request_parts::{BodyStream, RawBody}, state::State, }; #[doc(inline)] #[cfg(feature = "tokio")] pub use self::connect_info::ConnectInfo; #[doc(no_inline)] #[cfg(feature = "json")] pub use crate::Json; #[doc(no_inline)] pub use crate::Extension; #[cfg(feature = "form")] #[doc(no_inline)] pub use crate::form::Form; #[cfg(feature = "matched-path")] pub(crate) mod matched_path; #[cfg(feature = "matched-path")] #[doc(inline)] pub use self::matched_path::MatchedPath; #[cfg(feature = "multipart")] pub mod multipart; #[cfg(feature = "multipart")] #[doc(inline)] pub use self::multipart::Multipart; #[cfg(feature = "query")] mod query; #[cfg(feature = "query")] #[doc(inline)] pub use self::query::Query; #[cfg(feature = "original-uri")] #[doc(inline)] pub use self::request_parts::OriginalUri; #[cfg(feature = "ws")] #[doc(inline)] pub use self::ws::WebSocketUpgrade; #[cfg(feature = "headers")] #[doc(no_inline)] pub use crate::TypedHeader; // this is duplicated in `axum-extra/src/extract/form.rs` pub(super) fn has_content_type(headers: &HeaderMap, expected_content_type: &mime::Mime) -> bool { let content_type = if let Some(content_type) = headers.get(header::CONTENT_TYPE) { content_type } else { return false; }; let content_type = if let Ok(content_type) = content_type.to_str() { content_type } else { return false; }; content_type.starts_with(expected_content_type.as_ref()) } #[cfg(test)] mod tests { use crate::{routing::get, test_helpers::*, Router}; #[crate::test] async fn consume_body() { let app = Router::new().route("/", get(|body: String| async { body })); let client = TestClient::new(app); let res = client.get("/").body("foo").send().await; let body = res.text().await; assert_eq!(body, "foo"); } }