mirror of
https://github.com/servo/servo.git
synced 2025-08-03 12:40:06 +01:00
Urlmageddon: Use refcounted urls more often.
This commit is contained in:
parent
f14e7339b5
commit
913c874cb5
161 changed files with 1044 additions and 718 deletions
22
components/url/Cargo.toml
Normal file
22
components/url/Cargo.toml
Normal file
|
@ -0,0 +1,22 @@
|
|||
[package]
|
||||
name = "servo_url"
|
||||
version = "0.0.1"
|
||||
authors = ["The Servo Project Developers"]
|
||||
license = "MPL-2.0"
|
||||
publish = false
|
||||
|
||||
[lib]
|
||||
name = "servo_url"
|
||||
path = "lib.rs"
|
||||
|
||||
[features]
|
||||
servo = ["heapsize", "heapsize_derive", "serde", "serde_derive",
|
||||
"url/heap_size"]
|
||||
|
||||
|
||||
[dependencies]
|
||||
url = "1.2"
|
||||
heapsize = {version = "0.3.0", optional = true}
|
||||
heapsize_derive = {version = "0.1", optional = true}
|
||||
serde = {version = "0.8", optional = true}
|
||||
serde_derive = {version = "0.8", optional = true}
|
150
components/url/lib.rs
Normal file
150
components/url/lib.rs
Normal file
|
@ -0,0 +1,150 @@
|
|||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
#![deny(unsafe_code)]
|
||||
|
||||
#![crate_name = "servo_url"]
|
||||
#![crate_type = "rlib"]
|
||||
|
||||
#![cfg_attr(feature = "servo", feature(plugin))]
|
||||
#![cfg_attr(feature = "servo", feature(proc_macro))]
|
||||
|
||||
#[cfg(feature = "servo")] extern crate serde;
|
||||
#[cfg(feature = "servo")] #[macro_use] extern crate serde_derive;
|
||||
#[cfg(feature = "servo")] extern crate heapsize;
|
||||
#[cfg(feature = "servo")] #[macro_use] extern crate heapsize_derive;
|
||||
|
||||
extern crate url;
|
||||
|
||||
use std::fmt;
|
||||
use std::net::IpAddr;
|
||||
use std::path::Path;
|
||||
use std::sync::Arc;
|
||||
use url::{Url, Origin};
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
|
||||
#[cfg_attr(feature = "servo", derive(HeapSizeOf, Serialize, Deserialize))]
|
||||
pub struct ServoUrl(Arc<Url>);
|
||||
|
||||
impl ServoUrl {
|
||||
pub fn from_url(url: Url) -> Self {
|
||||
ServoUrl(Arc::new(url))
|
||||
}
|
||||
|
||||
pub fn parse_with_base(base: Option<&Self>, input: &str) -> Result<Self, url::ParseError> {
|
||||
Url::options().base_url(base.map(|b| &*b.0)).parse(input).map(Self::from_url)
|
||||
}
|
||||
|
||||
pub fn into_string(self) -> String {
|
||||
Arc::try_unwrap(self.0).unwrap_or_else(|s| (*s).clone()).into_string()
|
||||
}
|
||||
|
||||
// NOTE: These methods return options that are always true temporarily until
|
||||
// we special-case some urls to avoid going through rust-url.
|
||||
pub fn into_url(self) -> Option<Url> {
|
||||
Some(Arc::try_unwrap(self.0).unwrap_or_else(|s| (*s).clone()))
|
||||
}
|
||||
|
||||
pub fn as_url(&self) -> Option<&Arc<Url>> {
|
||||
Some(&self.0)
|
||||
}
|
||||
|
||||
pub fn parse(input: &str) -> Result<Self, url::ParseError> {
|
||||
Url::parse(input).map(Self::from_url)
|
||||
}
|
||||
|
||||
pub fn cannot_be_a_base(&self) -> bool {
|
||||
self.0.cannot_be_a_base()
|
||||
}
|
||||
|
||||
pub fn domain(&self) -> Option<&str> {
|
||||
self.0.domain()
|
||||
}
|
||||
|
||||
pub fn fragment(&self) -> Option<&str> {
|
||||
self.0.fragment()
|
||||
}
|
||||
|
||||
pub fn path(&self) -> &str {
|
||||
self.0.path()
|
||||
}
|
||||
|
||||
pub fn origin(&self) -> Origin {
|
||||
self.0.origin()
|
||||
}
|
||||
|
||||
pub fn scheme(&self) -> &str {
|
||||
self.0.scheme()
|
||||
}
|
||||
|
||||
pub fn as_str(&self) -> &str {
|
||||
self.0.as_str()
|
||||
}
|
||||
|
||||
pub fn as_mut_url(&mut self) -> Option<&mut Url> {
|
||||
Some(Arc::make_mut(&mut self.0))
|
||||
}
|
||||
|
||||
pub fn set_username(&mut self, user: &str) -> Result<(), ()> {
|
||||
Arc::make_mut(&mut self.0).set_username(user)
|
||||
}
|
||||
|
||||
pub fn set_ip_host(&mut self, addr: IpAddr) -> Result<(), ()> {
|
||||
Arc::make_mut(&mut self.0).set_ip_host(addr)
|
||||
}
|
||||
|
||||
pub fn set_password(&mut self, pass: Option<&str>) -> Result<(), ()> {
|
||||
Arc::make_mut(&mut self.0).set_password(pass)
|
||||
}
|
||||
|
||||
pub fn username(&self) -> &str {
|
||||
self.0.username()
|
||||
}
|
||||
|
||||
pub fn password(&self) -> Option<&str> {
|
||||
self.0.password()
|
||||
}
|
||||
|
||||
pub fn to_file_path(&self) -> Result<::std::path::PathBuf, ()> {
|
||||
self.0.to_file_path()
|
||||
}
|
||||
|
||||
pub fn host(&self) -> Option<url::Host<&str>> {
|
||||
self.0.host()
|
||||
}
|
||||
|
||||
pub fn host_str(&self) -> Option<&str> {
|
||||
self.0.host_str()
|
||||
}
|
||||
|
||||
pub fn port(&self) -> Option<u16> {
|
||||
self.0.port()
|
||||
}
|
||||
|
||||
pub fn port_or_known_default(&self) -> Option<u16> {
|
||||
self.0.port_or_known_default()
|
||||
}
|
||||
|
||||
pub fn join(&self, input: &str) -> Result<ServoUrl, url::ParseError> {
|
||||
self.0.join(input).map(Self::from_url)
|
||||
}
|
||||
|
||||
pub fn path_segments(&self) -> Option<::std::str::Split<char>> {
|
||||
self.0.path_segments()
|
||||
}
|
||||
|
||||
pub fn query(&self) -> Option<&str> {
|
||||
self.0.query()
|
||||
}
|
||||
|
||||
pub fn from_file_path<P: AsRef<Path>>(path: P) -> Result<Self, ()> {
|
||||
Ok(Self::from_url(try!(Url::from_file_path(path))))
|
||||
}
|
||||
}
|
||||
|
||||
impl fmt::Display for ServoUrl {
|
||||
fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
|
||||
self.0.fmt(formatter)
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue