url-parse

CI codecov crates.io Documentation

A library for parsing URLs.

Why?

No current other crate with support for i.e. special schemes. The reasoning is that schemes need to be part of the whatwg standard to be supported.

url-parse provides some missing schemes (sftp, ssh, s3) and enables the user to specify custom schemes before parsing.

Usage

Basic

Create a new parser object with Parser::new(). You can then use parser.parse(url) which will return a public Url parsed structure back.

Its fields are then directly accessible:

rust let input = "https://user:pass@www.example.co.uk:443/blog/article/search?docid=720&hl=en#dayone"; let result = Parser::new(None).parse(input).unwrap(); assert_eq!( result, Url { scheme: Some("https".to_string()), user_pass: (Some("user".to_string()), Some("pass".to_string())), subdomain: Some("www".to_string()), domain: Some("example.co.uk".to_string()), port: Some(443), path: Some(vec![ "blog".to_string(), "article".to_string(), "search".to_string(), ]), query: Some("docid=720&hl=en#dayone".to_string()), anchor: Some("dayone".to_string()), } )

Custom schemes

Passing a Some(HashMap) to Parser::new() can be used to create custom schemes.

The hashmap is a key,value pair representing the scheme name (key) to a port and description mapping (value).

rust let input = "myschema://user:pass@example.co.uk/path/to/file.txt"; let mut myport_mappings = HashMap::new(); myport_mappings.insert("myschema", (8888, "My custom schema")); let result = Parser::new(Some(myport_mappings)).parse(input).unwrap(); assert_eq!( result, Url { scheme: Some("myschema".to_string()), user_pass: (Some("user".to_string()), Some("pass".to_string())), subdomain: Some("example".to_string()), domain: Some("co.uk".to_string()), port: Some(8888), path: Some(vec![ "path".to_string(), "to".to_string(), "file.txt".to_string(), ]), query: None, anchor: None, } );