Skip to content

Commit ef4db4c

Browse files
committed
Bump version 0.1.6
1 parent 94818f7 commit ef4db4c

File tree

3 files changed

+20
-17
lines changed

3 files changed

+20
-17
lines changed

Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "dns2socks"
3-
version = "0.1.5"
3+
version = "0.1.6"
44
edition = "2021"
55
license = "MIT"
66
repository = "https://github.com/ssrlive/dns2socks"
@@ -17,10 +17,10 @@ clap = { version = "4", features = ["derive", "wrap_help"] }
1717
ctrlc2 = { version = "3", features = ["tokio", "termination"] }
1818
dotenvy = "0.15"
1919
env_logger = "0.11"
20+
hickory-proto = "0.24"
2021
log = "0.4"
2122
moka = { version = "0.12", default-features = false, features = ["future"] }
2223
rand = "0.8"
2324
socks5-impl = "0.5"
2425
tokio = { version = "1", features = ["full"] }
2526
tokio-util = "0.7"
26-
hickory-proto = "0.24"

src/dns.rs

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,21 @@ use hickory_proto::{
22
op::{header::MessageType, op_code::OpCode, query::Query, Message, ResponseCode},
33
rr::{record_type::RecordType, Name, RData},
44
};
5+
use std::io::{Error, ErrorKind};
56
use std::{net::IpAddr, str::FromStr};
67

78
#[allow(dead_code)]
8-
pub fn build_dns_query(domain: &str, query_type: RecordType, used_by_tcp: bool) -> Result<Vec<u8>, String> {
9+
pub fn build_dns_query(domain: &str, query_type: RecordType, used_by_tcp: bool) -> std::io::Result<Vec<u8>> {
910
use rand::{rngs::StdRng, Rng, SeedableRng};
10-
let name = Name::from_str(domain).map_err(|e| e.to_string())?;
11+
let name = Name::from_str(domain).map_err(|e| Error::new(ErrorKind::InvalidInput, e.to_string()))?;
1112
let query = Query::query(name, query_type);
1213
let mut msg = Message::new();
1314
msg.add_query(query)
1415
.set_id(StdRng::from_entropy().gen())
1516
.set_op_code(OpCode::Query)
1617
.set_message_type(MessageType::Query)
1718
.set_recursion_desired(true);
18-
let mut msg_buf = msg.to_vec().map_err(|e| e.to_string())?;
19+
let mut msg_buf = msg.to_vec().map_err(|e| Error::new(ErrorKind::InvalidInput, e.to_string()))?;
1920
if used_by_tcp {
2021
let mut buf = (msg_buf.len() as u16).to_be_bytes().to_vec();
2122
buf.append(&mut msg_buf);
@@ -25,13 +26,13 @@ pub fn build_dns_query(domain: &str, query_type: RecordType, used_by_tcp: bool)
2526
}
2627
}
2728

28-
pub fn extract_ipaddr_from_dns_message(message: &Message) -> Result<IpAddr, String> {
29+
pub fn extract_ipaddr_from_dns_message(message: &Message) -> std::io::Result<IpAddr> {
2930
if message.response_code() != ResponseCode::NoError {
30-
return Err(format!("{:?}", message.response_code()));
31+
return Err(Error::new(ErrorKind::InvalidData, format!("{:?}", message.response_code())));
3132
}
3233
let mut cname = None;
3334
for answer in message.answers() {
34-
match answer.data().ok_or("DNS response not contains answer data")? {
35+
match answer.data().ok_or(Error::new(ErrorKind::InvalidData, "No answer data"))? {
3536
RData::A(addr) => {
3637
return Ok(IpAddr::V4((*addr).into()));
3738
}
@@ -45,26 +46,28 @@ pub fn extract_ipaddr_from_dns_message(message: &Message) -> Result<IpAddr, Stri
4546
}
4647
}
4748
if let Some(cname) = cname {
48-
return Err(cname);
49+
return Err(Error::new(ErrorKind::InvalidData, format!("CNAME: {}", cname)));
4950
}
50-
Err(format!("{:?}", message.answers()))
51+
Err(Error::new(ErrorKind::InvalidData, format!("{:?}", message.answers())))
5152
}
5253

53-
pub fn extract_domain_from_dns_message(message: &Message) -> Result<String, String> {
54-
let query = message.queries().first().ok_or("DnsRequest no query body")?;
54+
pub fn extract_domain_from_dns_message(message: &Message) -> std::io::Result<String> {
55+
let err = Error::new(ErrorKind::InvalidData, "DnsRequest no query body");
56+
let query = message.queries().first().ok_or(err)?;
5557
let name = query.name().to_string();
5658
Ok(name)
5759
}
5860

59-
pub fn parse_data_to_dns_message(data: &[u8], used_by_tcp: bool) -> Result<Message, String> {
61+
pub fn parse_data_to_dns_message(data: &[u8], used_by_tcp: bool) -> std::io::Result<Message> {
6062
if used_by_tcp {
63+
let err = Error::new(ErrorKind::InvalidData, "invalid dns data");
6164
if data.len() < 2 {
62-
return Err("invalid dns data".into());
65+
return Err(err);
6366
}
6467
let len = u16::from_be_bytes([data[0], data[1]]) as usize;
65-
let data = data.get(2..len + 2).ok_or("invalid dns data")?;
68+
let data = data.get(2..len + 2).ok_or(err)?;
6669
return parse_data_to_dns_message(data, false);
6770
}
68-
let message = Message::from_vec(data).map_err(|e| e.to_string())?;
71+
let message = Message::from_vec(data).map_err(|e| Error::new(ErrorKind::InvalidData, e.to_string()))?;
6972
Ok(message)
7073
}

src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ fn log_dns_message(prefix: &str, domain: &str, message: &Message) {
218218
Ok(ipaddr) => {
219219
format!("{:?}", ipaddr)
220220
}
221-
Err(e) => e,
221+
Err(e) => e.to_string(),
222222
};
223223
log::trace!("{} {:?} <==> {:?}", prefix, domain, ipaddr);
224224
}

0 commit comments

Comments
 (0)