pub struct Form<T>(_);
Expand description
A data guard for FromForm
types.
This type implements the FromData
trait. It provides a generic means to
parse arbitrary structures from incoming form data.
See the forms guide for general form support documentation.
Leniency
A Form<T>
will parse successfully from an incoming form if the form
contains a superset of the fields in T
. Said another way, a Form<T>
automatically discards extra fields without error. For instance, if an
incoming form contains the fields “a”, “b”, and “c” while T
only contains
“a” and “c”, the form will parse as Form<T>
. To parse strictly, use the
Strict
form guard.
Usage
This type can be used with any type that implements the FromForm
trait.
The trait can be automatically derived; see the FromForm
documentation
for more information on deriving or implementing the trait.
Because Form
implements FromData
, it can be used directly as a target of
the data = "<param>"
route parameter as long as its generic type
implements the FromForm
trait:
use rocket::form::Form;
use rocket::http::RawStr;
#[derive(FromForm)]
struct UserInput<'r> {
value: &'r str
}
#[post("/submit", data = "<user_input>")]
fn submit_task(user_input: Form<UserInput<'_>>) -> String {
format!("Your value: {}", user_input.value)
}
A type of Form<T>
automatically dereferences into an &T
or &mut T
,
though you can also transform a Form<T>
into a T
by calling
into_inner()
. Thanks to automatic dereferencing, you
can access fields of T
transparently through a Form<T>
, as seen above
with user_input.value
.
Data Limits
The total amount of data accepted by the Form
data guard is limited by the
following limits:
Limit Name | Default | Description |
---|---|---|
form | 32KiB | total limit for url-encoded forms |
data-form | 2MiB | total limit for multipart forms |
* | N/A | each field type has its own limits |
As noted above, each form field type (a form guard) typically imposes its
own limits. For example, the &str
form guard imposes a data limit of
string
when multipart data is streamed.
URL-Encoded Forms
The form
limit specifies the data limit for an entire url-encoded form
data. It defaults to 32KiB. URL-encoded form data is percent-decoded, stored
in-memory, and parsed into ValueField
s. If the incoming data exceeds
this limit, the Form
data guard fails without attempting to parse fields
with a 413: Payload Too Large
error.
Multipart Forms
The data-form
limit specifies the data limit for an entire multipart form
data stream. It defaults to 2MiB. Multipart data is streamed, and form
fields are processed into DataField
s or ValueField
s as they arrive.
If the commutative data received while streaming exceeds the limit, parsing
is aborted, an error is created and pushed via FromForm::push_error()
,
and the form is finalized.
Individual Fields
Individual fields may have data limits as well. The type of the field
determines whether there is a data limit. For instance, the &str
type
imposes the string
data limit. Consult the type’s documentation or
FromFormField
for details.
Changing Limits
To change data limits, set the limits.form
and/or limits.data-form
configuration parameters. For instance, to increase the URL-encoded forms
limit to 128KiB for all environments, you might add the following to your
Rocket.toml
:
[global.limits]
form = 128KiB
Implementations§
source§impl<T> Form<T>
impl<T> Form<T>
sourcepub fn into_inner(self) -> T
pub fn into_inner(self) -> T
Consumes self
and returns the inner value.
Note that since Form
implements Deref
and DerefMut
with
target T
, reading and writing an inner value can be accomplished
transparently.
Example
use rocket::form::Form;
#[derive(FromForm)]
struct MyForm {
field: String,
}
#[post("/submit", data = "<form>")]
fn submit(form: Form<MyForm>) -> String {
// We can read or mutate a value transparently:
let field: &str = &form.field;
// To gain ownership, however, use `into_inner()`:
form.into_inner().field
}
source§impl<'r, T: FromForm<'r>> Form<T>
impl<'r, T: FromForm<'r>> Form<T>
sourcepub fn parse(string: &'r str) -> Result<'r, T>
pub fn parse(string: &'r str) -> Result<'r, T>
Leniently parses a T
from a percent-decoded
x-www-form-urlencoded
form string. Specifically, this method
implements §5.1 of the WHATWG URL Living Standard with the exception
of steps 3.4 and 3.5, which are assumed to already be reflected in
string
, and then parses the fields as T
.
Example
use rocket::form::{Form, FromForm};
#[derive(FromForm)]
struct Pet<'r> {
name: &'r str,
wags: bool,
}
let string = "name=Benson Wagger!&wags=true";
let pet: Pet<'_> = Form::parse(string).unwrap();
assert_eq!(pet.name, "Benson Wagger!");
assert_eq!(pet.wags, true);
sourcepub fn parse_iter<I>(fields: I) -> Result<'r, T>where
I: IntoIterator<Item = ValueField<'r>>,
pub fn parse_iter<I>(fields: I) -> Result<'r, T>where I: IntoIterator<Item = ValueField<'r>>,
Leniently parses a T
from the percent-decoded fields
.
Specifically, this method implements §5.1 of the WHATWG URL Living
Standard with the exception of step 3.
Example
use rocket::form::{Form, FromForm, ValueField};
#[derive(FromForm)]
struct Pet<'r> {
name: &'r str,
wags: bool,
}
let fields = vec![
ValueField::parse("name=Bob, the cat. :)"),
ValueField::parse("wags=no"),
];
let pet: Pet<'_> = Form::parse_iter(fields).unwrap();
assert_eq!(pet.name, "Bob, the cat. :)");
assert_eq!(pet.wags, false);
source§impl<T: for<'a> FromForm<'a> + 'static> Form<T>
impl<T: for<'a> FromForm<'a> + 'static> Form<T>
sourcepub fn parse_encoded(string: &RawStr) -> Result<'static, T>
pub fn parse_encoded(string: &RawStr) -> Result<'static, T>
Leniently parses a T
from a raw, x-www-form-urlencoded
form string.
Specifically, this method implements §5.1 of the WHATWG URL Living
Standard. Because percent-decoding might modify the input string, the
output type T
must be 'static
.
Example
use rocket::http::RawStr;
use rocket::form::{Form, FromForm};
#[derive(FromForm)]
struct Pet {
name: String,
wags: bool,
}
let string = RawStr::new("name=Benson+Wagger%21&wags=true");
let pet: Pet = Form::parse_encoded(string).unwrap();
assert_eq!(pet.name, "Benson Wagger!");
assert_eq!(pet.wags, true);
source§impl Form<()>
impl Form<()>
sourcepub fn values(string: &str) -> impl Iterator<Item = ValueField<'_>>
pub fn values(string: &str) -> impl Iterator<Item = ValueField<'_>>
Returns an iterator of fields parsed from a x-www-form-urlencoded
form
string. Specifically, this method implements steps 1, 2, and 3.1 - 3.3
of §5.1 of the WHATWG URL Living Standard. Fields in the returned
iterator are not percent-decoded.
Example
use rocket::form::{Form, ValueField};
let string = "name=Bobby Brown&&&email=me@rocket.rs";
let mut values = Form::values(string);
assert_eq!(values.next().unwrap(), ValueField::parse("name=Bobby Brown"));
assert_eq!(values.next().unwrap(), ValueField::parse("email=me@rocket.rs"));
assert!(values.next().is_none());
Trait Implementations§
source§impl<'r, T: FromForm<'r>> FromData<'r> for Form<T>
impl<'r, T: FromForm<'r>> FromData<'r> for Form<T>
source§fn from_data<'life0, 'async_trait>(
req: &'r Request<'life0>,
data: Data<'r>
) -> Pin<Box<dyn Future<Output = Outcome<'r, Self>> + Send + 'async_trait>>where
Self: 'async_trait,
'r: 'async_trait,
'life0: 'async_trait,
fn from_data<'life0, 'async_trait>( req: &'r Request<'life0>, data: Data<'r> ) -> Pin<Box<dyn Future<Output = Outcome<'r, Self>> + Send + 'async_trait>>where Self: 'async_trait, 'r: 'async_trait, 'life0: 'async_trait,
Self
from the incoming request body data. Read moresource§impl<T: Ord> Ord for Form<T>
impl<T: Ord> Ord for Form<T>
source§impl<T: PartialEq> PartialEq<Form<T>> for Form<T>
impl<T: PartialEq> PartialEq<Form<T>> for Form<T>
source§impl<T: PartialOrd> PartialOrd<Form<T>> for Form<T>
impl<T: PartialOrd> PartialOrd<Form<T>> for Form<T>
1.0.0 · source§fn le(&self, other: &Rhs) -> bool
fn le(&self, other: &Rhs) -> bool
self
and other
) and is used by the <=
operator. Read moreimpl<T: Eq> Eq for Form<T>
impl<T> StructuralEq for Form<T>
impl<T> StructuralPartialEq for Form<T>
Auto Trait Implementations§
impl<T> RefUnwindSafe for Form<T>where T: RefUnwindSafe,
impl<T> Send for Form<T>where T: Send,
impl<T> Sync for Form<T>where T: Sync,
impl<T> Unpin for Form<T>where T: Unpin,
impl<T> UnwindSafe for Form<T>where T: UnwindSafe,
Blanket Implementations§
§impl<'a, T> AsTaggedExplicit<'a> for Twhere
T: 'a,
impl<'a, T> AsTaggedExplicit<'a> for Twhere T: 'a,
§impl<'a, T> AsTaggedImplicit<'a> for Twhere
T: 'a,
impl<'a, T> AsTaggedImplicit<'a> for Twhere T: 'a,
source§impl<Q, K> Equivalent<K> for Qwhere
Q: Eq + ?Sized,
K: Borrow<Q> + ?Sized,
impl<Q, K> Equivalent<K> for Qwhere Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,
source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key
and return true
if they are equal.§impl<T> FromFd for Twhere
T: From<OwnedFd>,
impl<T> FromFd for Twhere T: From<OwnedFd>,
§impl<T> FromFilelike for Twhere
T: From<OwnedFd>,
impl<T> FromFilelike for Twhere T: From<OwnedFd>,
§fn from_filelike(owned: OwnedFd) -> T
fn from_filelike(owned: OwnedFd) -> T
Self
from the given filelike object. Read more§fn from_into_filelike<Owned>(owned: Owned) -> Twhere
Owned: IntoFilelike,
fn from_into_filelike<Owned>(owned: Owned) -> Twhere Owned: IntoFilelike,
Self
from the given filelike object
converted from into_owned
. Read more§impl<T> FromSocketlike for Twhere
T: From<OwnedFd>,
impl<T> FromSocketlike for Twhere T: From<OwnedFd>,
§fn from_socketlike(owned: OwnedFd) -> T
fn from_socketlike(owned: OwnedFd) -> T
Self
from the given socketlike object.§fn from_into_socketlike<Owned>(owned: Owned) -> Twhere
Owned: IntoSocketlike,
fn from_into_socketlike<Owned>(owned: Owned) -> Twhere Owned: IntoSocketlike,
Self
from the given socketlike object
converted from into_owned
.source§impl<T> Instrument for T
impl<T> Instrument for T
source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
§impl<T> IntoCollection<T> for T
impl<T> IntoCollection<T> for T
§fn into_collection<A>(self) -> SmallVec<A>where
A: Array<Item = T>,
fn into_collection<A>(self) -> SmallVec<A>where A: Array<Item = T>,
self
into a collection.