URL parser for Rust
docs.rs/url/

Simon Sapin 175f250cf4 Require an UrlParser for UrlUtils. Remove encoding_override from Url. 12 år sedan
src 175f250cf4 Require an UrlParser for UrlUtils. Remove encoding_override from Url. 12 år sedan
.gitignore c63b03a779 Switch to Cargo. 12 år sedan
Cargo.toml 589e7d6221 Upgrade to rustc 459ffc2adc74f5e8b64a76f5670edb419b9f65da 2014-07-17 12 år sedan
LICENSE-APACHE 0339bc2d9a Start with an empty crate. 13 år sedan
LICENSE-MIT 0339bc2d9a Start with an empty crate. 13 år sedan
README.md e7de04ed43 Remove done items from the README’s To Do list. 12 år sedan
make_encode_sets.py da7f23905b Refactor some repeating/redundant code. 12 år sedan

README.md

rust-url

Rust implementation of the URL Standard.

See Rust bug #10707.

This depends on rust-encoding.

API

pub struct URL {
    scheme: String,
    scheme_data: SchemeData,
    query: Option<String>,  // See form_urlencoded::parse_str() to get name/value pairs.
    fragment: Option<String>,
}

pub enum SchemeData {
    RelativeSchemeData(SchemeRelativeURL),
    OtherSchemeData(String),  // data: URLs, mailto: URLs, etc.
}

pub struct SchemeRelativeURL {
    username: String,
    password: Option<String>,
    host: Host,
    port: String,
    path: Vec<String>,
}

pub enum Host {
    Domain(String),  // Can only be empty in the file scheme
    IPv6(IPv6Address)
}

pub struct IPv6Address {
    pieces: [u16, ..8]
}


pub type ParseResult<T> = Result<T, &'static str>;

impl URL {
    // base_url is used to resolve relative URLs.
    // Relative URLs without a base return an error.
    pub fn parse(input: &str, base_url: Option<&URL>) -> ParseResult<URL>
    pub fn serialize(&self) -> String
    pub fn serialize_no_fragment(&self) -> String
}

impl Host {
    pub fn parse(input: &str) -> ParseResult<Host>
    pub fn serialize(&self) -> String
}

impl IPv6Address {
    pub fn parse(input: &str) -> ParseResult<IPv6Address>
    pub fn serialize(&self) -> String
}


/// application/x-www-form-urlencoded
/// Converts between a query string and name/value pairs.
pub mod form_urlencoded {
    pub fn parse_str(input: &str) -> Vec<(String, String)>
    pub fn parse_bytes(input: &[u8], encoding_override: Option<encoding::EncodingRef>,
                       use_charset: bool, isindex: bool) -> Option<Vec<(String, String)>>
    pub fn serialize(pairs: Vec<(String, String)>],
                     encoding_override: Option<encoding::EncodingRef>) -> String
}

To do

Not necessarily in the given order:

  • Add proper documentation
  • Add data: URL parsing.
  • Port rust-http and Servo.
  • Add IDNA support. Non-ASCII domains are a parse error for now. Punycode is done, Nameprep is the other big part.
  • Add lots of tests. Contribute them to web-platform-tests.
  • Consider switching the spec from a state machine to functional style, like this code.