#uri #parser #string #hyper #path #structure #nom

uri_parser

具有零复制和轻松访问所有URI部分的简单URI解析器

2个不稳定版本

使用旧的Rust 2015

0.2.0 2018年10月8日
0.1.0 2017年11月12日

#66#uri

29 每月下载量

MIT/Apache

13KB
250

基于nom组合解析器库的URI解析。

提供简单的解析器,将URI字符串解析为优化处理的结构 - 查询解析为HashTable,路径解析为Path等。

示例代码

extern crate hyper;
extern crate uri_parser;

use uri_parser::parse_uri;
use std::time::{Duration, SystemTime};

use hyper::Uri;
use std::str::FromStr;

fn dur_f64(d: Duration) -> f64 {
    d.as_secs() as f64 + d.subsec_nanos() as f64 / 1e9
}

fn main() {
    let count = 1_000_000;
    let a_uri = "http://www.example.com/root/test?kulo=sak&kde=je&help=no&usi=yes#middle";
    let start = SystemTime::now();
    for _i in 0..count {
        let u = parse_uri(a_uri).unwrap();
        let d = u.query.unwrap();
        let h=d.get("help").unwrap();
        assert_eq!(*h, "no");
    }
    let dur = start.elapsed().unwrap();
    println!("{} loops of my parse_uri took {} secs", count, dur_f64(dur));
    let start = SystemTime::now();
    for _i in 0..count {
        let u = Uri::from_str(a_uri).unwrap();
        let q = u.query().unwrap();
        for qi in q.split("&") {
            let kv: Vec<_> = qi.split("=").collect();
            if kv[0] == "help" {
                let h = kv[1];
                assert_eq!(h, "no");
            }
        }
    }
    let dur = start.elapsed().unwrap();
    println!("{} loops of hyper from_str took {} secs", count, dur_f64(dur));
}

此库将表现得更好,因为查询字符串已在HashMap中

1000000 loops of my parse_uri took 0.900562534 secs
1000000 loops of hyper from_str took 1.136823832 secs

限制

  1. 仅解析绝对URI
  2. 尚不支持解析IP6主机
  3. 不解码URL编码的字符串 (%hexa) - 因为它引用的是原始字符串
  4. 与格式错误的URI不兼容,仅处理非常基本的解析错误

依赖关系

~1MB
~19K SLoC