6个版本 (破坏性更新)

0.5.0 2023年2月3日
0.4.1 2022年8月9日
0.3.0 2022年7月25日
0.2.0 2022年7月23日
0.1.0 2022年7月17日

#38 in #named


2 个crate中使用 (通过 dominion)

MPL-2.0 许可证

60KB
1K SLoC

Domion解析器

以类型系统的使用为重点的DNS解析器,旨在在解析或序列化DNS数据包时提供声明性体验。它允许解析和序列化整个数据包或单个元素,如头部或不同的查询和资源记录。并非所有资源记录都已实现,如果缺少与您的用例相关的某些资源记录,请提交问题

解析

use dominion_parser::DnsPacket;
const REQ: &'static [u8; 33] = include_bytes!("../assets/dns_request.bin");
fn main() {
    let packet = DnsPacket::try_from(&REQ[..]).unwrap();
    println!("The request was:");
    println!("{:#?}", packet);
}

序列化

use dominion_parser::body::{RecordData, RecordPreamble, ResourceRecord};
use dominion_parser::header::{AuthenticData, QueryResponse, RecursionAvailable};
use dominion_parser::DnsPacket;
const REQ: &'static [u8; 33] = include_bytes!("../assets/dns_request.bin");
fn main() {
    let mut res = DnsPacket::try_from(&REQ[..]).unwrap();
    // Change some flags
    res.header.flags.qr = QueryResponse::Response;
    res.header.flags.ra = RecursionAvailable::Available;
    res.header.flags.ad = AuthenticData::NotAuthentic;
    // Add answer
    let preamble = RecordPreamble {
        name: res.questions[0].name.clone(),
        rrtype: res.questions[0]
            .qtype
            .try_into()
            .expect("QType is not a valid Type"),
        class: res.questions[0].class,
        ttl: 300,
        rdlen: 4,
    };
    let data = RecordData::A("204.74.99.100".parse().unwrap());
    let answer = ResourceRecord { preamble, data };
    res.header.answers = 1;
    res.answers.push(answer);
    let res = Vec::<u8>::from(&res);
    println!("=================== My Response ===================");
    println!("{:?}", res);
}

依赖项

~275–730KB
~17K SLoC