axum/extract/
rejection.rs

1//! Rejection response types.
2
3use axum_core::__composite_rejection as composite_rejection;
4use axum_core::__define_rejection as define_rejection;
5
6pub use crate::extract::path::{FailedToDeserializePathParams, InvalidUtf8InPathParam};
7pub use axum_core::extract::rejection::*;
8
9#[cfg(feature = "json")]
10define_rejection! {
11    #[status = UNPROCESSABLE_ENTITY]
12    #[body = "Failed to deserialize the JSON body into the target type"]
13    #[cfg_attr(docsrs, doc(cfg(feature = "json")))]
14    /// Rejection type for [`Json`](super::Json).
15    ///
16    /// This rejection is used if the request body is syntactically valid JSON but couldn't be
17    /// deserialized into the target type.
18    pub struct JsonDataError(Error);
19}
20
21#[cfg(feature = "json")]
22define_rejection! {
23    #[status = BAD_REQUEST]
24    #[body = "Failed to parse the request body as JSON"]
25    #[cfg_attr(docsrs, doc(cfg(feature = "json")))]
26    /// Rejection type for [`Json`](super::Json).
27    ///
28    /// This rejection is used if the request body didn't contain syntactically valid JSON.
29    pub struct JsonSyntaxError(Error);
30}
31
32#[cfg(feature = "json")]
33define_rejection! {
34    #[status = UNSUPPORTED_MEDIA_TYPE]
35    #[body = "Expected request with `Content-Type: application/json`"]
36    #[cfg_attr(docsrs, doc(cfg(feature = "json")))]
37    /// Rejection type for [`Json`](super::Json) used if the `Content-Type`
38    /// header is missing.
39    pub struct MissingJsonContentType;
40}
41
42define_rejection! {
43    #[status = INTERNAL_SERVER_ERROR]
44    #[body = "Missing request extension"]
45    /// Rejection type for [`Extension`](super::Extension) if an expected
46    /// request extension was not found.
47    pub struct MissingExtension(Error);
48}
49
50define_rejection! {
51    #[status = INTERNAL_SERVER_ERROR]
52    #[body = "No paths parameters found for matched route"]
53    /// Rejection type used if axum's internal representation of path parameters
54    /// is missing. This is commonly caused by extracting `Request<_>`. `Path`
55    /// must be extracted first.
56    pub struct MissingPathParams;
57}
58
59define_rejection! {
60    #[status = UNSUPPORTED_MEDIA_TYPE]
61    #[body = "Form requests must have `Content-Type: application/x-www-form-urlencoded`"]
62    /// Rejection type for [`Form`](super::Form) or [`RawForm`](super::RawForm)
63    /// used if the `Content-Type` header is missing
64    /// or its value is not `application/x-www-form-urlencoded`.
65    pub struct InvalidFormContentType;
66}
67
68define_rejection! {
69    #[status = BAD_REQUEST]
70    #[body = "No host found in request"]
71    /// Rejection type used if the [`Host`](super::Host) extractor is unable to
72    /// resolve a host.
73    pub struct FailedToResolveHost;
74}
75
76define_rejection! {
77    #[status = BAD_REQUEST]
78    #[body = "Failed to deserialize form"]
79    /// Rejection type used if the [`Form`](super::Form) extractor is unable to
80    /// deserialize the form into the target type.
81    pub struct FailedToDeserializeForm(Error);
82}
83
84define_rejection! {
85    #[status = UNPROCESSABLE_ENTITY]
86    #[body = "Failed to deserialize form body"]
87    /// Rejection type used if the [`Form`](super::Form) extractor is unable to
88    /// deserialize the form body into the target type.
89    pub struct FailedToDeserializeFormBody(Error);
90}
91
92define_rejection! {
93    #[status = BAD_REQUEST]
94    #[body = "Failed to deserialize query string"]
95    /// Rejection type used if the [`Query`](super::Query) extractor is unable to
96    /// deserialize the query string into the target type.
97    pub struct FailedToDeserializeQueryString(Error);
98}
99
100composite_rejection! {
101    /// Rejection used for [`Query`](super::Query).
102    ///
103    /// Contains one variant for each way the [`Query`](super::Query) extractor
104    /// can fail.
105    pub enum QueryRejection {
106        FailedToDeserializeQueryString,
107    }
108}
109
110composite_rejection! {
111    /// Rejection used for [`Form`](super::Form).
112    ///
113    /// Contains one variant for each way the [`Form`](super::Form) extractor
114    /// can fail.
115    pub enum FormRejection {
116        InvalidFormContentType,
117        FailedToDeserializeForm,
118        FailedToDeserializeFormBody,
119        BytesRejection,
120    }
121}
122
123composite_rejection! {
124    /// Rejection used for [`RawForm`](super::RawForm).
125    ///
126    /// Contains one variant for each way the [`RawForm`](super::RawForm) extractor
127    /// can fail.
128    pub enum RawFormRejection {
129        InvalidFormContentType,
130        BytesRejection,
131    }
132}
133
134#[cfg(feature = "json")]
135composite_rejection! {
136    /// Rejection used for [`Json`](super::Json).
137    ///
138    /// Contains one variant for each way the [`Json`](super::Json) extractor
139    /// can fail.
140    #[cfg_attr(docsrs, doc(cfg(feature = "json")))]
141    pub enum JsonRejection {
142        JsonDataError,
143        JsonSyntaxError,
144        MissingJsonContentType,
145        BytesRejection,
146    }
147}
148
149composite_rejection! {
150    /// Rejection used for [`Extension`](super::Extension).
151    ///
152    /// Contains one variant for each way the [`Extension`](super::Extension) extractor
153    /// can fail.
154    pub enum ExtensionRejection {
155        MissingExtension,
156    }
157}
158
159composite_rejection! {
160    /// Rejection used for [`Path`](super::Path).
161    ///
162    /// Contains one variant for each way the [`Path`](super::Path) extractor
163    /// can fail.
164    pub enum PathRejection {
165        FailedToDeserializePathParams,
166        MissingPathParams,
167    }
168}
169
170composite_rejection! {
171    /// Rejection used for [`RawPathParams`](super::RawPathParams).
172    ///
173    /// Contains one variant for each way the [`RawPathParams`](super::RawPathParams) extractor
174    /// can fail.
175    pub enum RawPathParamsRejection {
176        InvalidUtf8InPathParam,
177        MissingPathParams,
178    }
179}
180
181composite_rejection! {
182    /// Rejection used for [`Host`](super::Host).
183    ///
184    /// Contains one variant for each way the [`Host`](super::Host) extractor
185    /// can fail.
186    pub enum HostRejection {
187        FailedToResolveHost,
188    }
189}
190
191#[cfg(feature = "matched-path")]
192define_rejection! {
193    #[status = INTERNAL_SERVER_ERROR]
194    #[body = "No matched path found"]
195    /// Rejection if no matched path could be found.
196    ///
197    /// See [`MatchedPath`](super::MatchedPath) for more details.
198    #[cfg_attr(docsrs, doc(cfg(feature = "matched-path")))]
199    pub struct MatchedPathMissing;
200}
201
202#[cfg(feature = "matched-path")]
203composite_rejection! {
204    /// Rejection used for [`MatchedPath`](super::MatchedPath).
205    #[cfg_attr(docsrs, doc(cfg(feature = "matched-path")))]
206    pub enum MatchedPathRejection {
207        MatchedPathMissing,
208    }
209}
210
211define_rejection! {
212    #[status = INTERNAL_SERVER_ERROR]
213    #[body = "The matched route is not nested"]
214    /// Rejection type for [`NestedPath`](super::NestedPath).
215    ///
216    /// This rejection is used if the matched route wasn't nested.
217    pub struct NestedPathRejection;
218}