Struct rocket_http::uri::Reference

source ·
pub struct Reference<'a> { /* private fields */ }
Expand description

A URI-reference with optional scheme, authority, relative path, query, and fragment parts.

Structure

The following diagram illustrates the syntactic structure of a URI reference with all optional parts:

 http://user:pass@domain.com:4444/foo/bar?some=query#and-fragment
 |--|  |------------------------||------| |--------| |----------|
scheme          authority          path      query     fragment

All parts are optional. When a scheme and authority are not present, the path may be relative: foo/bar?baz#cat.

Conversion

All other URI types (Origin, Absolute, and so on) are valid URI references. As such, conversion between the types is lossless:

use rocket::http::uri::Reference;

let absolute = uri!("http://rocket.rs");
let reference: Reference = absolute.into();
assert_eq!(reference.scheme(), Some("http"));
assert_eq!(reference.authority().unwrap().host(), "rocket.rs");

let origin = uri!("/foo/bar");
let reference: Reference = origin.into();
assert_eq!(reference.path(), "/foo/bar");

Note that uri!() macro always prefers the more specific URI variant to Reference when possible, as is demonstrated above for absolute and origin.

(De)serialization

Reference is both Serialize and Deserialize:

use serde::{Serialize, Deserialize};
use rocket::http::uri::Reference;

#[derive(Deserialize, Serialize)]
struct UriOwned {
    uri: Reference<'static>,
}

#[derive(Deserialize, Serialize)]
struct UriBorrowed<'a> {
    uri: Reference<'a>,
}

Implementations§

source§

impl<'a> Reference<'a>

source

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

Parses the string string into an Reference. Parsing will never allocate. Returns an Error if string is not a valid origin URI.

Example
use rocket::http::uri::Reference;

// Parse a valid URI reference.
let uri = Reference::parse("/a/b/c?query").expect("valid URI");
assert_eq!(uri.path(), "/a/b/c");
assert_eq!(uri.query().unwrap(), "query");

// Invalid URIs fail to parse.
Reference::parse("foo bar").expect_err("invalid URI");

// Prefer to use `uri!()` when the input is statically known:
let uri = uri!("/a/b/c?query#fragment");
assert_eq!(uri.path(), "/a/b/c");
assert_eq!(uri.query().unwrap(), "query");
assert_eq!(uri.fragment().unwrap(), "fragment");
source

pub fn parse_owned(string: String) -> Result<Reference<'static>, Error<'static>>

Parses the string string into a Reference. Allocates minimally on success and error.

This method should be used instead of Reference::parse() when the source URI is already a String. Returns an Error if string is not a valid URI reference.

Example
use rocket::http::uri::Reference;

let source = format!("/foo?{}#3", 2);
let uri = Reference::parse_owned(source).unwrap();
assert_eq!(uri.path(), "/foo");
assert_eq!(uri.query().unwrap(), "2");
assert_eq!(uri.fragment().unwrap(), "3");
source

pub fn scheme(&self) -> Option<&str>

Returns the scheme. If Some, is non-empty.

Example
let uri = uri!("http://rocket.rs?foo#bar");
assert_eq!(uri.scheme(), Some("http"));

let uri = uri!("ftp:/?foo#bar");
assert_eq!(uri.scheme(), Some("ftp"));

let uri = uri!("?foo#bar");
assert_eq!(uri.scheme(), None);
source

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

Returns the authority part.

Example
let uri = uri!("http://rocket.rs:4444?foo#bar");
let auth = uri!("rocket.rs:4444");
assert_eq!(uri.authority().unwrap(), &auth);

let uri = uri!("?foo#bar");
assert_eq!(uri.authority(), None);
source

pub fn path(&self) -> Path<'_>

Returns the path part. May be empty.

Example
let uri = uri!("http://rocket.rs/guide?foo#bar");
assert_eq!(uri.path(), "/guide");
source

pub fn query(&self) -> Option<Query<'_>>

Returns the query part. May be empty.

Example
let uri = uri!("http://rocket.rs/guide?foo#bar");
assert_eq!(uri.query().unwrap(), "foo");

let uri = uri!("http://rocket.rs/guide?q=bar");
assert_eq!(uri.query().unwrap(), "q=bar");

// Empty query parts are normalized away by `uri!()`.
let uri = uri!("http://rocket.rs/guide?#bar");
assert!(uri.query().is_none());
source

pub fn fragment(&self) -> Option<&RawStr>

Returns the fragment part, if any.

Example
let uri = uri!("http://rocket.rs/guide?foo#bar");
assert_eq!(uri.fragment().unwrap(), "bar");

// Fragment parts aren't normalized away, unlike query parts.
let uri = uri!("http://rocket.rs/guide?foo#");
assert_eq!(uri.fragment().unwrap(), "");
source

pub fn is_normalized(&self) -> bool

Returns true if self is normalized. Otherwise, returns false.

Normalization for a URI reference is equivalent to normalization for an absolute URI. See Absolute for more information on what it means for an absolute URI to be normalized.

Example
use rocket::http::uri::Reference;

assert!(Reference::parse("foo/bar").unwrap().is_normalized());
assert!(Reference::parse("foo/bar#").unwrap().is_normalized());
assert!(Reference::parse("http://").unwrap().is_normalized());
assert!(Reference::parse("http://foo.rs/foo/bar").unwrap().is_normalized());
assert!(Reference::parse("foo:bar#baz").unwrap().is_normalized());
assert!(Reference::parse("http://rocket.rs#foo").unwrap().is_normalized());

assert!(!Reference::parse("http://?").unwrap().is_normalized());
assert!(!Reference::parse("git://rocket.rs/").unwrap().is_normalized());
assert!(!Reference::parse("http:/foo//bar").unwrap().is_normalized());
assert!(!Reference::parse("foo:bar?baz&&bop#c").unwrap().is_normalized());
assert!(!Reference::parse("http://rocket.rs?#foo").unwrap().is_normalized());

// Recall that `uri!()` normalizes static input.
assert!(uri!("http://rocket.rs#foo").is_normalized());
assert!(uri!("http://rocket.rs///foo////bar#cat").is_normalized());
source

pub fn normalize(&mut self)

Normalizes self in-place. Does nothing if self is already normalized.

Example
use rocket::http::uri::Reference;

let mut uri = Reference::parse("git://rocket.rs/").unwrap();
assert!(!uri.is_normalized());
uri.normalize();
assert!(uri.is_normalized());

let mut uri = Reference::parse("http:/foo//bar?baz&&#cat").unwrap();
assert!(!uri.is_normalized());
uri.normalize();
assert!(uri.is_normalized());

let mut uri = Reference::parse("foo:bar?baz&&bop").unwrap();
assert!(!uri.is_normalized());
uri.normalize();
assert!(uri.is_normalized());
source

pub fn into_normalized(self) -> Self

Normalizes self. This is a no-op if self is already normalized.

Example
use rocket::http::uri::Reference;

let mut uri = Reference::parse("git://rocket.rs/").unwrap();
assert!(!uri.is_normalized());
assert!(uri.into_normalized().is_normalized());

let mut uri = Reference::parse("http:/foo//bar?baz&&#cat").unwrap();
assert!(!uri.is_normalized());
assert!(uri.into_normalized().is_normalized());

let mut uri = Reference::parse("foo:bar?baz&&bop").unwrap();
assert!(!uri.is_normalized());
assert!(uri.into_normalized().is_normalized());

Trait Implementations§

source§

impl<'a> Clone for Reference<'a>

source§

fn clone(&self) -> Reference<'a>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<'a> Debug for Reference<'a>

source§

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

Formats the value using the given formatter. Read more
source§

impl Display for Reference<'_>

source§

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

Formats the value using the given formatter. Read more
source§

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

source§

fn from(absolute: Absolute<'a>) -> Self

Converts to this type from the input type.
source§

impl From<Asterisk> for Reference<'_>

source§

fn from(_: Asterisk) -> Self

Converts to this type from the input type.
source§

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

source§

fn from(authority: Authority<'a>) -> Self

Converts to this type from the input type.
source§

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

source§

fn from(origin: Origin<'a>) -> Self

Converts to this type from the input type.
source§

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

source§

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

Converts to this type from the input type.
source§

impl Hash for Reference<'_>

source§

fn hash<H: Hasher>(&self, state: &mut H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl IntoOwned for Reference<'_>

§

type Owned = Reference<'static>

The owned version of the type.
source§

fn into_owned(self) -> Reference<'static>

Converts self into an owned version of itself.
source§

impl PartialEq<&str> for Reference<'_>

source§

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

This method tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<Reference<'_>> for str

source§

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

This method tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

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

source§

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

This method tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

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

source§

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

This method tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

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

source§

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

This method tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<str> for Reference<'_>

source§

fn eq(&self, string: &str) -> bool

This method tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl<'a> TryFrom<&'a String> for Reference<'a>

§

type Error = Error<'a>

The type returned in the event of a conversion error.
source§

fn try_from(value: &'a String) -> Result<Self, Self::Error>

Performs the conversion.
source§

impl<'a> TryFrom<&'a str> for Reference<'a>

§

type Error = Error<'a>

The type returned in the event of a conversion error.
source§

fn try_from(value: &'a str) -> Result<Self, Self::Error>

Performs the conversion.
source§

impl TryFrom<String> for Reference<'static>

§

type Error = Error<'static>

The type returned in the event of a conversion error.
source§

fn try_from(value: String) -> Result<Self, Self::Error>

Performs the conversion.
source§

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

§

type Error = TryFromUriError

The type returned in the event of a conversion error.
source§

fn try_from(uri: Uri<'a>) -> Result<Self, Self::Error>

Performs the conversion.
source§

impl Eq for Reference<'_>

Auto Trait Implementations§

§

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

§

impl<'a> Send for Reference<'a>

§

impl<'a> Sync for Reference<'a>

§

impl<'a> Unpin for Reference<'a>

§

impl<'a> UnwindSafe for Reference<'a>

Blanket Implementations§

source§

impl<T> Any for Twhere T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere T: ?Sized,

const: unstable · source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere T: ?Sized,

const: unstable · source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<Q, K> Equivalent<K> for Qwhere Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
source§

impl<T> From<T> for T

const: unstable · source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T> Instrument for T

source§

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

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

fn in_current_span(self) -> Instrumented<Self>

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

impl<T, U> Into<U> for Twhere U: From<T>,

const: unstable · source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> IntoCollection<T> for T

source§

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

Converts self into a collection.
source§

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

source§

impl<T> ToOwned for Twhere T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

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

fn clone_into(&self, target: &mut T)

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

impl<T> ToString for Twhere T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for Twhere U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
const: unstable · source§

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

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere U: TryFrom<T>,

§

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

The type returned in the event of a conversion error.
const: unstable · source§

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

Performs the conversion.
source§

impl<T> WithSubscriber for T

source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more