update hickory-proto (DNS parser)
Some checks failed
Push or PR / build_n_test (macos-latest) (push) Has been cancelled
Push or PR / build_n_test (ubuntu-latest) (push) Has been cancelled
Push or PR / build_n_test (windows-latest) (push) Has been cancelled
Push or PR / build_n_test_android (push) Has been cancelled
Push or PR / build_n_test_ios (push) Has been cancelled
Push or PR / Check semver (push) Has been cancelled
Integration Tests / Proxy Tests (push) Has been cancelled

This commit is contained in:
ssrlive 2025-03-19 08:36:29 +08:00
parent a2399c8b28
commit a380817951
3 changed files with 10 additions and 17 deletions

View file

@ -36,7 +36,7 @@ digest_auth = "0.3"
dotenvy = "0.15" dotenvy = "0.15"
env_logger = "0.11" env_logger = "0.11"
hashlink = "0.10" hashlink = "0.10"
hickory-proto = "0.24" hickory-proto = "0.25"
httparse = "1" httparse = "1"
ipstack = { version = "0.2" } ipstack = { version = "0.2" }
log = { version = "0.4", features = ["std"] } log = { version = "0.4", features = ["std"] }

View file

@ -1,21 +1,16 @@
use hickory_proto::{ use hickory_proto::{
op::{Message, MessageType, ResponseCode}, op::{Message, MessageType, ResponseCode},
rr::{Name, RData, Record, record_type::RecordType}, rr::{
Name, RData, Record,
rdata::{A, AAAA},
},
}; };
use std::{net::IpAddr, str::FromStr}; use std::{net::IpAddr, str::FromStr};
pub fn build_dns_response(mut request: Message, domain: &str, ip: IpAddr, ttl: u32) -> Result<Message, String> { pub fn build_dns_response(mut request: Message, domain: &str, ip: IpAddr, ttl: u32) -> Result<Message, String> {
let record = match ip { let record = match ip {
IpAddr::V4(ip) => { IpAddr::V4(ip) => Record::from_rdata(Name::from_str(domain)?, ttl, RData::A(A(ip))),
let mut record = Record::with(Name::from_str(domain)?, RecordType::A, ttl); IpAddr::V6(ip) => Record::from_rdata(Name::from_str(domain)?, ttl, RData::AAAA(AAAA(ip))),
record.set_data(Some(RData::A(ip.into())));
record
}
IpAddr::V6(ip) => {
let mut record = Record::with(Name::from_str(domain)?, RecordType::AAAA, ttl);
record.set_data(Some(RData::AAAA(ip.into())));
record
}
}; };
// We must indicate that this message is a response. Otherwise, implementations may not // We must indicate that this message is a response. Otherwise, implementations may not
@ -27,9 +22,7 @@ pub fn build_dns_response(mut request: Message, domain: &str, ip: IpAddr, ttl: u
} }
pub fn remove_ipv6_entries(message: &mut Message) { pub fn remove_ipv6_entries(message: &mut Message) {
message message.answers_mut().retain(|answer| !matches!(answer.data(), RData::AAAA(_)));
.answers_mut()
.retain(|answer| !matches!(answer.data(), Some(RData::AAAA(_))));
} }
pub fn extract_ipaddr_from_dns_message(message: &Message) -> Result<IpAddr, String> { pub fn extract_ipaddr_from_dns_message(message: &Message) -> Result<IpAddr, String> {
@ -38,7 +31,7 @@ pub fn extract_ipaddr_from_dns_message(message: &Message) -> Result<IpAddr, Stri
} }
let mut cname = None; let mut cname = None;
for answer in message.answers() { for answer in message.answers() {
match answer.data().ok_or("DNS response not contains answer data")? { match answer.data() {
RData::A(addr) => { RData::A(addr) => {
return Ok(IpAddr::V4((*addr).into())); return Ok(IpAddr::V4((*addr).into()));
} }

View file

@ -26,7 +26,7 @@ pub enum Error {
IpStack(#[from] ipstack::IpStackError), IpStack(#[from] ipstack::IpStackError),
#[error("DnsProtoError {0:?}")] #[error("DnsProtoError {0:?}")]
DnsProto(#[from] hickory_proto::error::ProtoError), DnsProto(#[from] hickory_proto::ProtoError),
#[error("httparse::Error {0:?}")] #[error("httparse::Error {0:?}")]
Httparse(#[from] httparse::Error), Httparse(#[from] httparse::Error),