URL parser for Rust
docs.rs/url/

Simon Sapin 15d0ffdb66 Tweak and document the API 12 lat temu
.gitignore 0339bc2d9a Start with an empty crate. 13 lat temu
LICENSE-APACHE 0339bc2d9a Start with an empty crate. 13 lat temu
LICENSE-MIT 0339bc2d9a Start with an empty crate. 13 lat temu
Makefile.in 9835ae3bc3 Test and fix punycode decoding. 12 lat temu
README.md 15d0ffdb66 Tweak and document the API 12 lat temu
configure 0339bc2d9a Start with an empty crate. 13 lat temu
form_urlencoded.rs 15d0ffdb66 Tweak and document the API 12 lat temu
parser.rs 3662f92224 Move application/x-www-form-urlencoded stuff into a module. 12 lat temu
punycode.rs 2bb8cf786b Turns out [Ascii] isn’t that useful. Switch to str. 12 lat temu
punycode_tests.json 9835ae3bc3 Test and fix punycode decoding. 12 lat temu
tests.rs 3662f92224 Move application/x-www-form-urlencoded stuff into a module. 12 lat temu
url.rs 15d0ffdb66 Tweak and document the API 12 lat temu
urltestdata.txt af590112c2 Fix tests. 12 lat temu

README.md

rust-url

Rust implementation of the URL Standard.

See Rust bug #10707.

This depends on rust-encoding.

API

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

pub enum SchemeData {
    RelativeSchemeData(SchemeRelativeURL),
    OtherSchemeData(~str)
}

pub struct SchemeRelativeURL {
    userinfo: Option<UserInfo>,
    host: Host,
    port: ~str,
    path: ~[~str],
}

pub struct UserInfo {
    username: ~str,
    password: Option<~str>,
}

pub enum Host {
    Domain(~[~str]),  // 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 {
    pub fn parse(input: &str, base_url: Option<&URL>) -> ParseResult<URL>
    pub fn serialize(&self) -> ~str
    pub fn serialize_no_fragment(&self) -> ~str
}

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

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


/// application/x-www-form-urlencoded
pub mod form_urlencoded {
    pub fn parse_str(input: &str) -> ~[(~str, ~str)]
    pub fn parse_bytes(input: &[u8], encoding_override: Option<encoding::EncodingRef>,
                       use_charset: bool, isindex: bool) -> Option<~[(~str, ~str)]>
    pub fn serialize(pairs: ~[(~str, ~str)],
                     encoding_override: Option<encoding::EncodingRef>) -> ~str
}

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.
  • Report know/suspected spec bugs and test suite bugs.
  • Refactor to reduce code duplication.
  • Consider switching the spec from a state machine to functional style, like this code.