mirror of https://github.com/rwf2/Rocket.git
parent
db96f670b7
commit
03433c10ea
|
@ -112,7 +112,7 @@ macro_rules! media_types {
|
||||||
docify!([
|
docify!([
|
||||||
Returns @code{true} if the @[top-level] and sublevel types of
|
Returns @code{true} if the @[top-level] and sublevel types of
|
||||||
@code{self} are the same as those of @{"`MediaType::"}! $name
|
@code{self} are the same as those of @{"`MediaType::"}! $name
|
||||||
@{"`"}!.
|
@{"`"}!, i.e @{"`"} @{$t}! @[/]! @{$s}! $(; @{$k}! @[=]! @{$v}!)* @{"`"}!.
|
||||||
];
|
];
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pub fn $check(&self) -> bool {
|
pub fn $check(&self) -> bool {
|
||||||
|
|
|
@ -160,6 +160,7 @@ pub struct Error<'v> {
|
||||||
/// * [`AddrParseError`] => [`ErrorKind::Addr`]
|
/// * [`AddrParseError`] => [`ErrorKind::Addr`]
|
||||||
/// * [`io::Error`] => [`ErrorKind::Io`]
|
/// * [`io::Error`] => [`ErrorKind::Io`]
|
||||||
/// * `Box<dyn std::error::Error + Send` => [`ErrorKind::Custom`]
|
/// * `Box<dyn std::error::Error + Send` => [`ErrorKind::Custom`]
|
||||||
|
/// * `(Status, Box<dyn std::error::Error + Send)` => [`ErrorKind::Custom`]
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
#[non_exhaustive]
|
#[non_exhaustive]
|
||||||
pub enum ErrorKind<'v> {
|
pub enum ErrorKind<'v> {
|
||||||
|
@ -192,8 +193,9 @@ pub enum ErrorKind<'v> {
|
||||||
Unexpected,
|
Unexpected,
|
||||||
/// An unknown entity was received.
|
/// An unknown entity was received.
|
||||||
Unknown,
|
Unknown,
|
||||||
/// A custom error occurred.
|
/// A custom error occurred. Status defaults to
|
||||||
Custom(Box<dyn std::error::Error + Send>),
|
/// [`Status::UnprocessableEntity`] if one is not directly specified.
|
||||||
|
Custom(Status, Box<dyn std::error::Error + Send>),
|
||||||
/// An error while parsing a multipart form occurred.
|
/// An error while parsing a multipart form occurred.
|
||||||
Multipart(multer::Error),
|
Multipart(multer::Error),
|
||||||
/// A string was invalid UTF-8.
|
/// A string was invalid UTF-8.
|
||||||
|
@ -350,6 +352,9 @@ impl<'v> Errors<'v> {
|
||||||
/// status that is set by the [`Form`](crate::form::Form) data guard on
|
/// status that is set by the [`Form`](crate::form::Form) data guard on
|
||||||
/// failure.
|
/// failure.
|
||||||
///
|
///
|
||||||
|
/// See [`Error::status()`] for the corresponding status code of each
|
||||||
|
/// [`Error`] variant.
|
||||||
|
///
|
||||||
/// # Example
|
/// # Example
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust
|
||||||
|
@ -677,17 +682,19 @@ impl<'v> Error<'v> {
|
||||||
.unwrap_or(false)
|
.unwrap_or(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the most reasonable `Status` associated with this error. These
|
/// Returns the most reasonable [`Status`] associated with this error.
|
||||||
/// are:
|
|
||||||
///
|
///
|
||||||
/// * **`PayloadTooLarge`** if the error kind is:
|
/// For an [`ErrorKind::Custom`], this is the variant's `Status`, which
|
||||||
|
/// defaults to [`Status::UnprocessableEntity`]. For all others, it is:
|
||||||
|
///
|
||||||
|
/// * **`PayloadTooLarge`** if the [error kind](ErrorKind) is:
|
||||||
/// - `InvalidLength` with min of `None`
|
/// - `InvalidLength` with min of `None`
|
||||||
/// - `Multpart(FieldSizeExceeded | StreamSizeExceeded)`
|
/// - `Multipart(FieldSizeExceeded)` or `Multipart(StreamSizeExceeded)`
|
||||||
/// * **`InternalServerError`** if the error kind is:
|
/// * **`InternalServerError`** if the [error kind](ErrorKind) is:
|
||||||
/// - `Unknown`
|
/// - `Unknown`
|
||||||
/// * **`BadRequest`** if the error kind is:
|
/// * **`BadRequest`** if the [error kind](ErrorKind) is:
|
||||||
/// - `Io` with an `entity` of `Form`
|
/// - `Io` with an `entity` of `Form`
|
||||||
/// * **`UnprocessableEntity`** otherwise
|
/// * **`UnprocessableEntity`** for all other variants
|
||||||
///
|
///
|
||||||
/// # Example
|
/// # Example
|
||||||
///
|
///
|
||||||
|
@ -716,11 +723,12 @@ impl<'v> Error<'v> {
|
||||||
use multer::Error::*;
|
use multer::Error::*;
|
||||||
|
|
||||||
match self.kind {
|
match self.kind {
|
||||||
InvalidLength { min: None, .. }
|
| InvalidLength { min: None, .. }
|
||||||
| Multipart(FieldSizeExceeded { .. })
|
| Multipart(FieldSizeExceeded { .. })
|
||||||
| Multipart(StreamSizeExceeded { .. }) => Status::PayloadTooLarge,
|
| Multipart(StreamSizeExceeded { .. }) => Status::PayloadTooLarge,
|
||||||
Unknown => Status::InternalServerError,
|
Unknown => Status::InternalServerError,
|
||||||
Io(_) | _ if self.entity == Entity::Form => Status::BadRequest,
|
Io(_) | _ if self.entity == Entity::Form => Status::BadRequest,
|
||||||
|
Custom(status, _) => status,
|
||||||
_ => Status::UnprocessableEntity
|
_ => Status::UnprocessableEntity
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -846,7 +854,7 @@ impl fmt::Display for ErrorKind<'_> {
|
||||||
ErrorKind::Missing => "missing".fmt(f)?,
|
ErrorKind::Missing => "missing".fmt(f)?,
|
||||||
ErrorKind::Unexpected => "unexpected".fmt(f)?,
|
ErrorKind::Unexpected => "unexpected".fmt(f)?,
|
||||||
ErrorKind::Unknown => "unknown internal error".fmt(f)?,
|
ErrorKind::Unknown => "unknown internal error".fmt(f)?,
|
||||||
ErrorKind::Custom(e) => e.fmt(f)?,
|
ErrorKind::Custom(_, e) => e.fmt(f)?,
|
||||||
ErrorKind::Multipart(e) => write!(f, "invalid multipart: {}", e)?,
|
ErrorKind::Multipart(e) => write!(f, "invalid multipart: {}", e)?,
|
||||||
ErrorKind::Utf8(e) => write!(f, "invalid UTF-8: {}", e)?,
|
ErrorKind::Utf8(e) => write!(f, "invalid UTF-8: {}", e)?,
|
||||||
ErrorKind::Int(e) => write!(f, "invalid integer: {}", e)?,
|
ErrorKind::Int(e) => write!(f, "invalid integer: {}", e)?,
|
||||||
|
@ -874,7 +882,7 @@ impl crate::http::ext::IntoOwned for ErrorKind<'_> {
|
||||||
Missing => Missing,
|
Missing => Missing,
|
||||||
Unexpected => Unexpected,
|
Unexpected => Unexpected,
|
||||||
Unknown => Unknown,
|
Unknown => Unknown,
|
||||||
Custom(e) => Custom(e),
|
Custom(s, e) => Custom(s, e),
|
||||||
Multipart(e) => Multipart(e),
|
Multipart(e) => Multipart(e),
|
||||||
Utf8(e) => Utf8(e),
|
Utf8(e) => Utf8(e),
|
||||||
Int(e) => Int(e),
|
Int(e) => Int(e),
|
||||||
|
@ -892,7 +900,6 @@ impl crate::http::ext::IntoOwned for ErrorKind<'_> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
impl<'a, 'b> PartialEq<ErrorKind<'b>> for ErrorKind<'a> {
|
impl<'a, 'b> PartialEq<ErrorKind<'b>> for ErrorKind<'a> {
|
||||||
fn eq(&self, other: &ErrorKind<'b>) -> bool {
|
fn eq(&self, other: &ErrorKind<'b>) -> bool {
|
||||||
use ErrorKind::*;
|
use ErrorKind::*;
|
||||||
|
@ -904,7 +911,7 @@ impl<'a, 'b> PartialEq<ErrorKind<'b>> for ErrorKind<'a> {
|
||||||
(Duplicate, Duplicate) => true,
|
(Duplicate, Duplicate) => true,
|
||||||
(Missing, Missing) => true,
|
(Missing, Missing) => true,
|
||||||
(Unexpected, Unexpected) => true,
|
(Unexpected, Unexpected) => true,
|
||||||
(Custom(_), Custom(_)) => true,
|
(Custom(a, _), Custom(b, _)) => a == b,
|
||||||
(Multipart(a), Multipart(b)) => a == b,
|
(Multipart(a), Multipart(b)) => a == b,
|
||||||
(Utf8(a), Utf8(b)) => a == b,
|
(Utf8(a), Utf8(b)) => a == b,
|
||||||
(Int(a), Int(b)) => a == b,
|
(Int(a), Int(b)) => a == b,
|
||||||
|
@ -954,6 +961,17 @@ impl<'a, 'v: 'a, const N: usize> From<&'static [Cow<'v, str>; N]> for ErrorKind<
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<'a> From<Box<dyn std::error::Error + Send>> for ErrorKind<'a> {
|
||||||
|
fn from(e: Box<dyn std::error::Error + Send>) -> Self {
|
||||||
|
ErrorKind::Custom(Status::UnprocessableEntity, e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> From<(Status, Box<dyn std::error::Error + Send>)> for ErrorKind<'a> {
|
||||||
|
fn from((status, e): (Status, Box<dyn std::error::Error + Send>)) -> Self {
|
||||||
|
ErrorKind::Custom(status, e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
macro_rules! impl_from_for {
|
macro_rules! impl_from_for {
|
||||||
(<$l:lifetime> $T:ty => $V:ty as $variant:ident) => (
|
(<$l:lifetime> $T:ty => $V:ty as $variant:ident) => (
|
||||||
|
@ -971,7 +989,6 @@ impl_from_for!(<'a> ParseFloatError => ErrorKind<'a> as Float);
|
||||||
impl_from_for!(<'a> ParseBoolError => ErrorKind<'a> as Bool);
|
impl_from_for!(<'a> ParseBoolError => ErrorKind<'a> as Bool);
|
||||||
impl_from_for!(<'a> AddrParseError => ErrorKind<'a> as Addr);
|
impl_from_for!(<'a> AddrParseError => ErrorKind<'a> as Addr);
|
||||||
impl_from_for!(<'a> io::Error => ErrorKind<'a> as Io);
|
impl_from_for!(<'a> io::Error => ErrorKind<'a> as Io);
|
||||||
impl_from_for!(<'a> Box<dyn std::error::Error + Send> => ErrorKind<'a> as Custom);
|
|
||||||
|
|
||||||
impl fmt::Display for Entity {
|
impl fmt::Display for Entity {
|
||||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
|
@ -1010,7 +1027,7 @@ impl Entity {
|
||||||
| ErrorKind::Int(_)
|
| ErrorKind::Int(_)
|
||||||
| ErrorKind::Float(_)
|
| ErrorKind::Float(_)
|
||||||
| ErrorKind::Bool(_)
|
| ErrorKind::Bool(_)
|
||||||
| ErrorKind::Custom(_)
|
| ErrorKind::Custom(..)
|
||||||
| ErrorKind::Addr(_) => Entity::Value,
|
| ErrorKind::Addr(_) => Entity::Value,
|
||||||
|
|
||||||
| ErrorKind::Duplicate
|
| ErrorKind::Duplicate
|
||||||
|
|
|
@ -56,6 +56,26 @@ use crate::form::prelude::*;
|
||||||
/// can access fields of `T` transparently through a `Form<T>`, as seen above
|
/// can access fields of `T` transparently through a `Form<T>`, as seen above
|
||||||
/// with `user_input.value`.
|
/// with `user_input.value`.
|
||||||
///
|
///
|
||||||
|
/// ## Errors
|
||||||
|
///
|
||||||
|
/// A `Form<T>` data guard may fail, forward, or succeed.
|
||||||
|
///
|
||||||
|
/// If a request's content-type is neither [`ContentType::Form`] nor
|
||||||
|
/// [`ContentType::FormData`], the guard **forwards**.
|
||||||
|
///
|
||||||
|
/// If the request `ContentType` _does_ identify as a form but the form data
|
||||||
|
/// does not parse as `T`, according to `T`'s [`FromForm`] implementation, the
|
||||||
|
/// guard **fails**. The `Failure` variant contains of the [`Errors`] emitted by
|
||||||
|
/// `T`'s `FromForm` parser. If the error is not caught by a
|
||||||
|
/// [`form::Result<T>`](Result) or `Option<Form<T>>` data guard, the status code
|
||||||
|
/// is set to [`Errors::status()`], and the corresponding error catcher is
|
||||||
|
/// called.
|
||||||
|
///
|
||||||
|
/// Otherwise the guard **succeeds**.
|
||||||
|
///
|
||||||
|
/// [`ContentType::Form`]: crate::http::ContentType::Form
|
||||||
|
/// [`ContentType::FormData`]: crate::http::ContentType::FormData
|
||||||
|
///
|
||||||
/// ## Data Limits
|
/// ## Data Limits
|
||||||
///
|
///
|
||||||
/// The total amount of data accepted by the `Form` data guard is limited by the
|
/// The total amount of data accepted by the `Form` data guard is limited by the
|
||||||
|
|
|
@ -45,7 +45,8 @@
|
||||||
//! * `map[k:1]=Bob`
|
//! * `map[k:1]=Bob`
|
||||||
//! * `people[bob]nickname=Stan`
|
//! * `people[bob]nickname=Stan`
|
||||||
//!
|
//!
|
||||||
//! See [`FromForm`] for full details on push-parsing and complete examples.
|
//! See [`FromForm`] for full details on push-parsing and complete examples, and
|
||||||
|
//! [`Form`] for how to accept forms in a request handler.
|
||||||
|
|
||||||
// ## Maps w/named Fields (`struct`)
|
// ## Maps w/named Fields (`struct`)
|
||||||
//
|
//
|
||||||
|
|
Loading…
Reference in New Issue