|
Packit |
f0b94e |
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
Packit |
f0b94e |
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
Packit |
f0b94e |
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
#![deny(unsafe_code)]
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
#![crate_name = "servo_url"]
|
|
Packit |
f0b94e |
#![crate_type = "rlib"]
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
#[macro_use] extern crate malloc_size_of;
|
|
Packit |
f0b94e |
#[macro_use] extern crate malloc_size_of_derive;
|
|
Packit |
f0b94e |
#[macro_use] extern crate serde;
|
|
Packit |
f0b94e |
extern crate servo_rand;
|
|
Packit |
f0b94e |
extern crate url;
|
|
Packit |
f0b94e |
extern crate url_serde;
|
|
Packit |
f0b94e |
extern crate uuid;
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
pub mod origin;
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
pub use origin::{OpaqueOrigin, ImmutableOrigin, MutableOrigin};
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
use std::fmt;
|
|
Packit |
f0b94e |
use std::net::IpAddr;
|
|
Packit |
f0b94e |
use std::ops::{Range, RangeFrom, RangeTo, RangeFull, Index};
|
|
Packit |
f0b94e |
use std::path::Path;
|
|
Packit |
f0b94e |
use std::sync::Arc;
|
|
Packit |
f0b94e |
use url::{Url, Position};
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
pub use url::Host;
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
#[derive(Clone, Eq, Hash, MallocSizeOf, Ord, PartialEq, PartialOrd)]
|
|
Packit |
f0b94e |
pub struct ServoUrl(
|
|
Packit |
f0b94e |
#[ignore_malloc_size_of = "Arc"]
|
|
Packit |
f0b94e |
Arc<Url>
|
|
Packit |
f0b94e |
);
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
impl ServoUrl {
|
|
Packit |
f0b94e |
pub fn from_url(url: Url) -> Self {
|
|
Packit |
f0b94e |
ServoUrl(Arc::new(url))
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
pub fn parse_with_base(base: Option<&Self>, input: &str) -> Result<Self, url::ParseError> {
|
|
Packit |
f0b94e |
Url::options().base_url(base.map(|b| &*b.0)).parse(input).map(Self::from_url)
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
pub fn into_string(self) -> String {
|
|
Packit |
f0b94e |
Arc::try_unwrap(self.0).unwrap_or_else(|s| (*s).clone()).into_string()
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
pub fn into_url(self) -> Url {
|
|
Packit |
f0b94e |
Arc::try_unwrap(self.0).unwrap_or_else(|s| (*s).clone())
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
pub fn as_url(&self) -> &Url {
|
|
Packit |
f0b94e |
&self.0
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
pub fn parse(input: &str) -> Result<Self, url::ParseError> {
|
|
Packit |
f0b94e |
Url::parse(input).map(Self::from_url)
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
pub fn cannot_be_a_base(&self) -> bool {
|
|
Packit |
f0b94e |
self.0.cannot_be_a_base()
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
pub fn domain(&self) -> Option<&str> {
|
|
Packit |
f0b94e |
self.0.domain()
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
pub fn fragment(&self) -> Option<&str> {
|
|
Packit |
f0b94e |
self.0.fragment()
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
pub fn path(&self) -> &str {
|
|
Packit |
f0b94e |
self.0.path()
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
pub fn origin(&self) -> ImmutableOrigin {
|
|
Packit |
f0b94e |
ImmutableOrigin::new(self.0.origin())
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
pub fn scheme(&self) -> &str {
|
|
Packit |
f0b94e |
self.0.scheme()
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
pub fn is_secure_scheme(&self) -> bool {
|
|
Packit |
f0b94e |
let scheme = self.scheme();
|
|
Packit |
f0b94e |
scheme == "https" || scheme == "wss"
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
pub fn is_chrome(&self) -> bool {
|
|
Packit |
f0b94e |
self.scheme() == "chrome"
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
pub fn as_str(&self) -> &str {
|
|
Packit |
f0b94e |
self.0.as_str()
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
pub fn as_mut_url(&mut self) -> &mut Url {
|
|
Packit |
f0b94e |
Arc::make_mut(&mut self.0)
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
pub fn set_username(&mut self, user: &str) -> Result<(), ()> {
|
|
Packit |
f0b94e |
self.as_mut_url().set_username(user)
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
pub fn set_ip_host(&mut self, addr: IpAddr) -> Result<(), ()> {
|
|
Packit |
f0b94e |
self.as_mut_url().set_ip_host(addr)
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
pub fn set_password(&mut self, pass: Option<&str>) -> Result<(), ()> {
|
|
Packit |
f0b94e |
self.as_mut_url().set_password(pass)
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
pub fn set_fragment(&mut self, fragment: Option<&str>) {
|
|
Packit |
f0b94e |
self.as_mut_url().set_fragment(fragment)
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
pub fn username(&self) -> &str {
|
|
Packit |
f0b94e |
self.0.username()
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
pub fn password(&self) -> Option<&str> {
|
|
Packit |
f0b94e |
self.0.password()
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
pub fn to_file_path(&self) -> Result<::std::path::PathBuf, ()> {
|
|
Packit |
f0b94e |
self.0.to_file_path()
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
pub fn host(&self) -> Option<url::Host<&str>> {
|
|
Packit |
f0b94e |
self.0.host()
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
pub fn host_str(&self) -> Option<&str> {
|
|
Packit |
f0b94e |
self.0.host_str()
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
pub fn port(&self) -> Option<u16> {
|
|
Packit |
f0b94e |
self.0.port()
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
pub fn port_or_known_default(&self) -> Option<u16> {
|
|
Packit |
f0b94e |
self.0.port_or_known_default()
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
pub fn join(&self, input: &str) -> Result<ServoUrl, url::ParseError> {
|
|
Packit |
f0b94e |
self.0.join(input).map(Self::from_url)
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
pub fn path_segments(&self) -> Option<::std::str::Split<char>> {
|
|
Packit |
f0b94e |
self.0.path_segments()
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
pub fn query(&self) -> Option<&str> {
|
|
Packit |
f0b94e |
self.0.query()
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
pub fn from_file_path<P: AsRef<Path>>(path: P) -> Result<Self, ()> {
|
|
Packit |
f0b94e |
Ok(Self::from_url(Url::from_file_path(path)?))
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
impl fmt::Display for ServoUrl {
|
|
Packit |
f0b94e |
fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
|
|
Packit |
f0b94e |
self.0.fmt(formatter)
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
impl fmt::Debug for ServoUrl {
|
|
Packit |
f0b94e |
fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
|
|
Packit |
f0b94e |
self.0.fmt(formatter)
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
impl Index<RangeFull> for ServoUrl {
|
|
Packit |
f0b94e |
type Output = str;
|
|
Packit |
f0b94e |
fn index(&self, _: RangeFull) -> &str {
|
|
Packit |
f0b94e |
&self.0[..]
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
impl Index<RangeFrom<Position>> for ServoUrl {
|
|
Packit |
f0b94e |
type Output = str;
|
|
Packit |
f0b94e |
fn index(&self, range: RangeFrom<Position>) -> &str {
|
|
Packit |
f0b94e |
&self.0[range]
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
impl Index<RangeTo<Position>> for ServoUrl {
|
|
Packit |
f0b94e |
type Output = str;
|
|
Packit |
f0b94e |
fn index(&self, range: RangeTo<Position>) -> &str {
|
|
Packit |
f0b94e |
&self.0[range]
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
impl Index<Range<Position>> for ServoUrl {
|
|
Packit |
f0b94e |
type Output = str;
|
|
Packit |
f0b94e |
fn index(&self, range: Range<Position>) -> &str {
|
|
Packit |
f0b94e |
&self.0[range]
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
impl From<Url> for ServoUrl {
|
|
Packit |
f0b94e |
fn from(url: Url) -> Self {
|
|
Packit |
f0b94e |
ServoUrl::from_url(url)
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
impl serde::Serialize for ServoUrl {
|
|
Packit |
f0b94e |
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
|
Packit |
f0b94e |
where S: serde::Serializer,
|
|
Packit |
f0b94e |
{
|
|
Packit |
f0b94e |
url_serde::serialize(&*self.0, serializer)
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
impl<'de> serde::Deserialize<'de> for ServoUrl {
|
|
Packit |
f0b94e |
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
|
Packit |
f0b94e |
where D: serde::Deserializer<'de>,
|
|
Packit |
f0b94e |
{
|
|
Packit |
f0b94e |
url_serde::deserialize(deserializer).map(Self::from_url)
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
}
|