Enum rocket::http::uri::Uri[]

pub enum Uri<'a> {
    Asterisk(Asterisk),
    Origin(Origin<'a>),
    Authority(Authority<'a>),
    Absolute(Absolute<'a>),
    Reference(Reference<'a>),
}
Expand description

An enum encapsulating any of the possible URI variants.

Usage

In Rocket, this type will rarely be used directly. Instead, you will typically encounter URIs via the Origin type. This is because all incoming requests accepred by Rocket contain URIs in origin-form.

Parsing

The Uri type implements a full, zero-allocation, zero-copy RFC 7230 compliant “request target” parser with limited liberties for real-world deviations. In particular, the parser deviates as follows:

  • It accepts % characters without two trailing hex-digits.

  • It accepts the following additional unencoded characters in query parts, to match real-world browser behavior:

    {, }, [, ], \, ^, `, |

To parse an &str into a Uri, use Uri::parse(). Alternatively, you may also use the TryFrom<&str> and TryFrom<String> trait implementation. To inspect the parsed type, match on the resulting enum and use the methods of the internal structure.

Variants

Asterisk(Asterisk)

An asterisk: exactly *.

Origin(Origin<'a>)

An origin URI.

Authority(Authority<'a>)

An authority URI.

Absolute(Absolute<'a>)

An absolute URI.

Reference(Reference<'a>)

A URI reference.

Implementations

impl<'a> Uri<'a>

pub fn parse<T>(string: &'a str) -> Result<Uri<'a>, Error<'a>> where
    T: Into<Uri<'a>> + TryFrom<&'a str, Error = Error<'a>>, 

Parses the string string into a Uri of kind T.

This is identical to T::parse(string).map(Uri::from).

T is typically one of Asterisk, Origin, Authority, Absolute, or Reference. Parsing never allocates. Returns an Error if string is not a valid URI of kind T.

To perform an ambgiuous parse into any valid URI type, use Uri::parse_any().

Example

use rocket::http::uri::{Uri, Origin};

// Parse a valid origin URI (note: in practice, use `Origin::parse()`).
let uri = Uri::parse::<Origin>("/a/b/c?query").expect("valid URI");
let origin = uri.origin().expect("origin URI");
assert_eq!(origin.path(), "/a/b/c");
assert_eq!(origin.query().unwrap(), "query");

// Prefer to use the `uri!()` macro for static inputs. The return value
// is of the specific type, not `Uri`.
let origin = uri!("/a/b/c?query");
assert_eq!(origin.path(), "/a/b/c");
assert_eq!(origin.query().unwrap(), "query");

// Invalid URIs fail to parse.
Uri::parse::<Origin>("foo bar").expect_err("invalid URI");

pub fn parse_any(string: &'a str) -> Result<Uri<'a>, Error<'a>>

Parse string into a the “best fit” URI type.

Always prefer to use uri!() for statically known inputs.

Because URI parsing is ambgious (that is, there isn’t a one-to-one mapping between strings and a URI type), the internal type returned by this method may not be the desired type. This method chooses the “best fit” type for a given string by preferring to parse in the following order:

  • Asterisk
  • Origin
  • Authority
  • Absolute
  • Reference

Thus, even though * is a valid Asterisk and Reference URI, it will parse as an Asterisk.

Example

use rocket::http::uri::{Uri, Origin, Reference};

// An absolute path is an origin _unless_ it contains a fragment.
let uri = Uri::parse_any("/a/b/c?query").expect("valid URI");
let origin = uri.origin().expect("origin URI");
assert_eq!(origin.path(), "/a/b/c");
assert_eq!(origin.query().unwrap(), "query");

let uri = Uri::parse_any("/a/b/c?query#fragment").expect("valid URI");
let reference = uri.reference().expect("reference URI");
assert_eq!(reference.path(), "/a/b/c");
assert_eq!(reference.query().unwrap(), "query");
assert_eq!(reference.fragment().unwrap(), "fragment");

// Prefer to use the `uri!()` macro for static inputs. The return type
// is the internal type, not `Uri`. The explicit type is not required.
let uri: Origin = uri!("/a/b/c?query");
let uri: Reference = uri!("/a/b/c?query#fragment");

pub fn origin(&self) -> Option<&Origin<'a>>

Returns the internal instance of Origin if self is a Uri::Origin. Otherwise, returns None.

Example

use rocket::http::uri::{Uri, Absolute, Origin};

let uri = Uri::parse::<Origin>("/a/b/c?query").expect("valid URI");
assert!(uri.origin().is_some());

let uri = Uri::from(uri!("/a/b/c?query"));
assert!(uri.origin().is_some());

let uri = Uri::parse::<Absolute>("https://rocket.rs").expect("valid URI");
assert!(uri.origin().is_none());

let uri = Uri::from(uri!("https://rocket.rs"));
assert!(uri.origin().is_none());

pub fn authority(&self) -> Option<&Authority<'a>>

Returns the internal instance of Authority if self is a Uri::Authority. Otherwise, returns None.

Example

use rocket::http::uri::{Uri, Absolute, Authority};

let uri = Uri::parse::<Authority>("user:pass@domain.com").expect("valid URI");
assert!(uri.authority().is_some());

let uri = Uri::from(uri!("user:pass@domain.com"));
assert!(uri.authority().is_some());

let uri = Uri::parse::<Absolute>("https://rocket.rs").expect("valid URI");
assert!(uri.authority().is_none());

let uri = Uri::from(uri!("https://rocket.rs"));
assert!(uri.authority().is_none());

pub fn absolute(&self) -> Option<&Absolute<'a>>

Returns the internal instance of Absolute if self is a Uri::Absolute. Otherwise, returns None.

Example

use rocket::http::uri::{Uri, Absolute, Origin};

let uri = Uri::parse::<Absolute>("http://rocket.rs").expect("valid URI");
assert!(uri.absolute().is_some());

let uri = Uri::from(uri!("http://rocket.rs"));
assert!(uri.absolute().is_some());

let uri = Uri::parse::<Origin>("/path").expect("valid URI");
assert!(uri.absolute().is_none());

let uri = Uri::from(uri!("/path"));
assert!(uri.absolute().is_none());

pub fn reference(&self) -> Option<&Reference<'a>>

Returns the internal instance of Reference if self is a Uri::Reference. Otherwise, returns None.

Example

use rocket::http::uri::{Uri, Absolute, Reference};

let uri = Uri::parse::<Reference>("foo/bar").expect("valid URI");
assert!(uri.reference().is_some());

let uri = Uri::from(uri!("foo/bar"));
assert!(uri.reference().is_some());

let uri = Uri::parse::<Absolute>("https://rocket.rs").expect("valid URI");
assert!(uri.reference().is_none());

let uri = Uri::from(uri!("https://rocket.rs"));
assert!(uri.reference().is_none());

Trait Implementations

impl<'a> Clone for Uri<'a>

pub fn clone(&self) -> Uri<'a>

Returns a copy of the value. Read more

fn clone_from(&mut self, source: &Self)1.0.0[src]

Performs copy-assignment from source. Read more

impl<'a> Debug for Uri<'a>

pub fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more

impl<'_> Display for Uri<'_>

pub fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more

impl<'a> From<Absolute<'a>> for Uri<'a>

pub fn from(other: Absolute<'a>) -> Uri<'a>

Performs the conversion.

impl<'a> From<Asterisk> for Uri<'a>

pub fn from(other: Asterisk) -> Uri<'a>

Performs the conversion.

impl<'a> From<Authority<'a>> for Uri<'a>

pub fn from(other: Authority<'a>) -> Uri<'a>

Performs the conversion.

impl<'a> From<Origin<'a>> for Uri<'a>

pub fn from(other: Origin<'a>) -> Uri<'a>

Performs the conversion.

impl<'a> From<Reference<'a>> for Uri<'a>

pub fn from(other: Reference<'a>) -> Uri<'a>

Performs the conversion.

impl<'_> IntoOwned for Uri<'_>

type Owned = Uri<'static>

The owned version of the type.

pub fn into_owned(self) -> Uri<'static>

Converts self into an owned version of itself.

impl<'b, 'a> PartialEq<Absolute<'a>> for Uri<'b>

pub fn eq(&self, other: &Absolute<'a>) -> bool

This method tests for self and other values to be equal, and is used by ==. Read more

#[must_use]
fn ne(&self, other: &Rhs) -> bool
1.0.0[src]

This method tests for !=.

impl<'b> PartialEq<Asterisk> for Uri<'b>

pub fn eq(&self, other: &Asterisk) -> bool

This method tests for self and other values to be equal, and is used by ==. Read more

#[must_use]
fn ne(&self, other: &Rhs) -> bool
1.0.0[src]

This method tests for !=.

impl<'b, 'a> PartialEq<Authority<'a>> for Uri<'b>

pub fn eq(&self, other: &Authority<'a>) -> bool

This method tests for self and other values to be equal, and is used by ==. Read more

#[must_use]
fn ne(&self, other: &Rhs) -> bool
1.0.0[src]

This method tests for !=.

impl<'b, 'a> PartialEq<Origin<'a>> for Uri<'b>

pub fn eq(&self, other: &Origin<'a>) -> bool

This method tests for self and other values to be equal, and is used by ==. Read more

#[must_use]
fn ne(&self, other: &Rhs) -> bool
1.0.0[src]

This method tests for !=.

impl<'b, 'a> PartialEq<Reference<'a>> for Uri<'b>

pub fn eq(&self, other: &Reference<'a>) -> bool

This method tests for self and other values to be equal, and is used by ==. Read more

#[must_use]
fn ne(&self, other: &Rhs) -> bool
1.0.0[src]

This method tests for !=.

impl<'a> PartialEq<Uri<'a>> for Uri<'a>

pub fn eq(&self, other: &Uri<'a>) -> bool

This method tests for self and other values to be equal, and is used by ==. Read more

pub fn ne(&self, other: &Uri<'a>) -> bool

This method tests for !=.

impl<'b> PartialEq<Uri<'b>> for Asterisk

pub fn eq(&self, other: &Uri<'b>) -> bool

This method tests for self and other values to be equal, and is used by ==. Read more

#[must_use]
fn ne(&self, other: &Rhs) -> bool
1.0.0[src]

This method tests for !=.

impl<'b, 'a> PartialEq<Uri<'b>> for Absolute<'a>

pub fn eq(&self, other: &Uri<'b>) -> bool

This method tests for self and other values to be equal, and is used by ==. Read more

#[must_use]
fn ne(&self, other: &Rhs) -> bool
1.0.0[src]

This method tests for !=.

impl<'b, 'a> PartialEq<Uri<'b>> for Reference<'a>

pub fn eq(&self, other: &Uri<'b>) -> bool

This method tests for self and other values to be equal, and is used by ==. Read more

#[must_use]
fn ne(&self, other: &Rhs) -> bool
1.0.0[src]

This method tests for !=.

impl<'b, 'a> PartialEq<Uri<'b>> for Origin<'a>

pub fn eq(&self, other: &Uri<'b>) -> bool

This method tests for self and other values to be equal, and is used by ==. Read more

#[must_use]
fn ne(&self, other: &Rhs) -> bool
1.0.0[src]

This method tests for !=.

impl<'b, 'a> PartialEq<Uri<'b>> for Authority<'a>

pub fn eq(&self, other: &Uri<'b>) -> bool

This method tests for self and other values to be equal, and is used by ==. Read more

#[must_use]
fn ne(&self, other: &Rhs) -> bool
1.0.0[src]

This method tests for !=.

impl<'a> TryFrom<Uri<'a>> for Origin<'a>

type Error = TryFromUriError

The type returned in the event of a conversion error.

pub fn try_from(
    uri: Uri<'a>
) -> Result<Origin<'a>, <Origin<'a> as TryFrom<Uri<'a>>>::Error>

Performs the conversion.

impl<'a> TryFrom<Uri<'a>> for Reference<'a>

type Error = TryFromUriError

The type returned in the event of a conversion error.

pub fn try_from(
    uri: Uri<'a>
) -> Result<Reference<'a>, <Reference<'a> as TryFrom<Uri<'a>>>::Error>

Performs the conversion.

impl<'a> TryFrom<Uri<'a>> for Authority<'a>

type Error = TryFromUriError

The type returned in the event of a conversion error.

pub fn try_from(
    uri: Uri<'a>
) -> Result<Authority<'a>, <Authority<'a> as TryFrom<Uri<'a>>>::Error>

Performs the conversion.

impl<'a> TryFrom<Uri<'a>> for Absolute<'a>

type Error = TryFromUriError

The type returned in the event of a conversion error.

pub fn try_from(
    uri: Uri<'a>
) -> Result<Absolute<'a>, <Absolute<'a> as TryFrom<Uri<'a>>>::Error>

Performs the conversion.

impl<'a> TryFrom<Uri<'a>> for Asterisk

type Error = TryFromUriError

The type returned in the event of a conversion error.

pub fn try_from(
    uri: Uri<'a>
) -> Result<Asterisk, <Asterisk as TryFrom<Uri<'a>>>::Error>

Performs the conversion.

impl<'a> StructuralPartialEq for Uri<'a>

Auto Trait Implementations

impl<'a> !RefUnwindSafe for Uri<'a>

impl<'a> Send for Uri<'a>

impl<'a> Sync for Uri<'a>

impl<'a> Unpin for Uri<'a>

impl<'a> UnwindSafe for Uri<'a>

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

pub fn type_id(&self) -> TypeId[src]

Gets the TypeId of self. Read more

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

pub fn borrow(&self) -> &T[src]

Immutably borrows from an owned value. Read more

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

pub fn borrow_mut(&mut self) -> &mut T[src]

Mutably borrows from an owned value. Read more

impl<T> From<T> for T[src]

pub fn from(t: T) -> T[src]

Performs the conversion.

impl<T> Instrument for T[src]

fn instrument(self, span: Span) -> Instrumented<Self>[src]

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more

fn in_current_span(self) -> Instrumented<Self>[src]

Instruments this type with the current Span, returning an Instrumented wrapper. Read more

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

pub fn into(self) -> U[src]

Performs the conversion.

impl<T> IntoCollection<T> for T

pub fn into_collection<A>(self) -> SmallVec<A> where
    A: Array<Item = T>, 

Converts self into a collection.

pub fn mapped<U, F, A>(self, f: F) -> SmallVec<A> where
    F: FnMut(T) -> U,
    A: Array<Item = U>, 

impl<T> Same<T> for T

type Output = T

Should always be Self

impl<T> ToOwned for T where
    T: Clone
[src]

type Owned = T

The resulting type after obtaining ownership.

pub fn to_owned(&self) -> T[src]

Creates owned data from borrowed data, usually by cloning. Read more

pub fn clone_into(&self, target: &mut T)[src]

🔬 This is a nightly-only experimental API. (toowned_clone_into)

recently added

Uses borrowed data to replace owned data, usually by cloning. Read more

impl<T> ToString for T where
    T: Display + ?Sized
[src]

pub default fn to_string(&self) -> String[src]

Converts the given value to a String. Read more

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

pub fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>[src]

Performs the conversion.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

pub fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>[src]

Performs the conversion.

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

pub fn vzip(self) -> V