2个不稳定版本
使用旧的Rust 2015
0.2.0 | 2018年10月8日 |
---|---|
0.1.0 | 2017年11月12日 |
#66 在 #uri
29 每月下载量
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
限制
- 仅解析绝对URI
- 尚不支持解析IP6主机
- 不解码URL编码的字符串 (%hexa) - 因为它引用的是原始字符串
- 与格式错误的URI不兼容,仅处理非常基本的解析错误
依赖关系
~1MB
~19K SLoC