#rpsl #parser #routing #policy #whois #specification-language #low-memory

rpsl-rs

符合RFC 2622的,专注于速度和正确性的路由策略规范语言(RPSL)解析器

2个稳定版本

1.0.1 2023年12月26日

#708解析器实现

MIT 许可证

380KB
1.5K SLoC

rpsl-rs


符合RFC 2622的,专注于速度和正确性的路由策略规范语言(RPSL)解析器。

⚡️ 比其他解析器快130-250倍
📰 完整实现多行RPSL值
💬 能够直接从whois服务器响应中解析对象
🧠 通过利用零拷贝降低内存占用
🧪 通过属性测试确保任何有效输入的健壮解析

Benchmark Graph

文档 | 性能

使用方法

解析RPSL对象

包含RPSL表示法的对象的字符串可以使用 parse_object 函数解析为 ObjectView

use rpsl::parse_object;

let role_acme = "
role:        ACME Company
address:     Packet Street 6
address:     128 Series of Tubes
address:     Internet
email:       [email protected]
nic-hdl:     RPSL1-RIPE
source:      RIPE

";
let parsed = parse_object(role_acme)?;

返回的 ObjectView 允许以 AttributeView 的形式访问包含在内的属性,这是一个包含其表示的数据引用的类型,这使得解析器非常内存高效且性能出色,因为解析过程中不需要进行分配。

role:           ACME Company ◀─────────────── &"role"    ───  &"ACME Company"
address:        Packet Street 6 ◀──────────── &"address" ───  &"Packet Street 6"
address:        128 Series of Tubes ◀──────── &"address" ───  &"128 Series of Tubes"
address:        Internet ◀─────────────────── &"address" ───  &"Internet"
email:          [email protected] ◀───────── &"email"   ───  &"[email protected]"
nic-hdl:        RPSL1-RIPE ◀───────────────── &"nic-hdl" ───  &"RPSL1-RIPE"
source:         RIPE ◀─────────────────────── &"source"  ───  &"RIPE"
println!("{:#?}", parsed);

ObjectView(
    [
        AttributeView {
            name: NameView("role",),
            value: SingleLine(Some("ACME Company")),
        },
        AttributeView {
            name: NameView("address"),
            value: SingleLine(Some("Packet Street 6")),
        },
        AttributeView {
            name: NameView("address"),
            value: SingleLine(Some("128 Series of Tubes")),
        },
        AttributeView {
            name: NameView("address"),
            value: SingleLine(Some("Internet")),
        },
        AttributeView {
            name: NameView("email"),
            value: SingleLine(Some("[email protected]")),
        },
        AttributeView {
            name: NameView("nic-hdl"),
            value: SingleLine(Some("RPSL1-RIPE")),
        },
        AttributeView {
            name: NameView("source"),
            value: SingleLine(Some("RIPE")),
        },
    ]
)

每个 AttributeView 都可以通过其索引访问,并具有名称和可选值。

println!("{:#?}", parsed[1]);

AttributeView {
    name: NameView("address"),
    value: SingleLine(Some("Packet Street 6")),
}

由于RPSL属性值可以是单行或多行,因此使用两种不同的类型来表示它们。有关更多信息和示例,请参阅 Attributeparse_object

ObjectView 可以转换为以及直接与它们的所有者对应物 Object 进行比较。

let owned = object! {
    "role":        "ACME Company";
    "address":     "Packet Street 6";
    "address":     "128 Series of Tubes";
    "address":     "Internet";
    "email":       "[email protected]";
    "nic-hdl":     "RPSL1-RIPE";
    "source":      "RIPE";
};

assert_eq!(role_acme, owned);
assert_eq!(role_acme.to_owned(), owned);

解析WHOIS服务器响应

WHOIS服务器通常通过返回多个相关对象来响应查询。例如,对AS32934的ARIN查询将首先返回请求的ASNumber对象,然后是相关的OrgName

$ whois -h whois.arin.net AS32934
ASNumber:       32934
ASName:         FACEBOOK
ASHandle:       AS32934
RegDate:        2004-08-24
Updated:        2012-02-24
Comment:        Please send abuse reports to [email protected]
Ref:            https://rdap.arin.net/registry/autnum/32934


OrgName:        Facebook, Inc.
OrgId:          THEFA-3
Address:        1601 Willow Rd.
City:           Menlo Park
StateProv:      CA
PostalCode:     94025
Country:        US
RegDate:        2004-08-11
Updated:        2012-04-17
Ref:            https://rdap.arin.net/registry/entity/THEFA-3


要提取每个单独的对象,可以使用parse_whois_response函数将响应解析为包含响应中所有单个ObjectViewVec。示例可以在函数文档中找到。

贡献

任何大小的贡献,只要能以任何方式改进rpsl-rs,无论是DX/UX、文档、性能还是其他方面,都将非常受赞赏。要开始,请阅读贡献指南。在开始工作于你想要贡献的、可能会影响简洁性、可靠性或性能的新功能之前,请先提出一个issue。

许可证

此项目的源代码受MIT许可证的许可。有关更多信息,请参阅LICENSE

依赖

~1–1.8MB
~36K SLoC