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)
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