#suffix #list #domain #parser #nom #public #cache

nom-psl

快速公共后缀列表域名解析,使用 nom 编写

4 个版本 (稳定)

1.2.0 2019 年 6 月 3 日
1.1.0 2019 年 5 月 16 日
1.0.0 2018 年 10 月 25 日
0.1.0 2018 年 10 月 25 日

#2331解析器实现

BSD-3-Clause

75KB
468

Crates.io

更快的公共后缀域名解析。

该库的作用范围限于从公共后缀列表中找到给定域名的 tld+1。

方法

  • 将公共后缀列表条目加载到内存中
  • 将待解析的域的不可变、所有者值进行匹配
  • 利用用户大小的 lru 缓存条目

目标

  • 提供(主要是)符合规范的公共后缀域名解析。
  • 避免在域名解析过程中进行分配。
  • 尽可能将工作卸载到解析阶段。
  • 避免引入可能带来不必要负担的依赖
  • 输入不被修改,输出是输入的切片

注意事项

  • 仍然依赖于 idna crate 进行 punycode 解析
  • 我们不将任何内容转换为小写(为了性能我们忽略这一点)

环境变量

PUBLIC_SUFFIX_LIST_FILE=somefile - 用文件名覆盖 public_suffix_list.dat

示例

lazy_static! {
    static ref LIST: List = {
        let list = List::parse_source_file("public_suffix_list.dat", 10_000_000);
        list.expect("unable to parse PSL file")
    };
}

...

fn foo() {
    let domain = "abc.one.two.example.co.uk";
    let tldp1 = LIST.parse_domain(domain);
    
    assert_eq!(tldp1, Some("example.co.uk"));
}

待办事项

  • 基准测试

依赖项

~2.5MB
~66K SLoC