Skip to content

Commit f5b2c0f

Browse files
feat: introduce ContextTrait for general usage
1 parent 79ad390 commit f5b2c0f

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+252
-77
lines changed

crates/shadowsocks-service/src/acl/mod.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,10 @@ use log::{trace, warn};
1919
use once_cell::sync::Lazy;
2020
use regex::bytes::{Regex, RegexBuilder, RegexSet, RegexSetBuilder};
2121

22-
use shadowsocks::{context::Context, relay::socks5::Address};
22+
use shadowsocks::{
23+
context::{Context, ContextTrait},
24+
relay::socks5::Address,
25+
};
2326

2427
use self::sub_domains_tree::SubDomainsTree;
2528

crates/shadowsocks-service/src/config.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,14 @@ use serde::{Deserialize, Serialize};
7070
use shadowsocks::relay::socks5::Address;
7171
use shadowsocks::{
7272
config::{
73-
ManagerAddr, Mode, ReplayAttackPolicy, ServerAddr, ServerConfig, ServerSource, ServerUser, ServerUserManager,
73+
ManagerAddr,
74+
Mode,
75+
ReplayAttackPolicy,
76+
ServerAddr,
77+
ServerConfig,
78+
ServerSource,
79+
ServerUser,
80+
ServerUserManager,
7481
ServerWeight,
7582
},
7683
crypto::CipherKind,

crates/shadowsocks-service/src/local/fake_dns/processor.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@ use hickory_resolver::proto::{
66
op::{header::MessageType, response_code::ResponseCode, Header, Message, OpCode},
77
rr::{
88
rdata::{A, AAAA},
9-
DNSClass, RData, Record, RecordType,
9+
DNSClass,
10+
RData,
11+
Record,
12+
RecordType,
1013
},
1114
};
1215
use log::{debug, trace, warn};

crates/shadowsocks-service/src/local/http/http_client.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ use hyper::{
1818
client::conn::{http1, http2},
1919
http::uri::Scheme,
2020
rt::{Sleep, Timer},
21-
Request, Response,
21+
Request,
22+
Response,
2223
};
2324
use log::{error, trace};
2425
use lru_time_cache::LruCache;

crates/shadowsocks-service/src/local/http/http_service.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,13 @@ use hyper::{
88
body,
99
header::{self, HeaderValue},
1010
http::uri::{Authority, Scheme},
11-
HeaderMap, Method, Request, Response, StatusCode, Uri, Version,
11+
HeaderMap,
12+
Method,
13+
Request,
14+
Response,
15+
StatusCode,
16+
Uri,
17+
Version,
1218
};
1319
use log::{debug, error, trace};
1420
use shadowsocks::relay::Address;

crates/shadowsocks-service/src/local/http/server.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@ use tokio::{
1313
};
1414

1515
use crate::local::{
16-
context::ServiceContext, loadbalancing::PingBalancer, net::tcp::listener::create_standard_tcp_listener,
16+
context::ServiceContext,
17+
loadbalancing::PingBalancer,
18+
net::tcp::listener::create_standard_tcp_listener,
1719
};
1820

1921
use super::{http_client::HttpClient, http_service::HttpService, tokio_rt::TokioIo};

crates/shadowsocks-service/src/local/http/utils.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@ use std::{
99
use hyper::{
1010
header::{self, HeaderValue},
1111
http::uri::Authority,
12-
HeaderMap, Uri, Version,
12+
HeaderMap,
13+
Uri,
14+
Version,
1315
};
1416
use log::error;
1517
use shadowsocks::relay::socks5::Address;

crates/shadowsocks-service/src/local/net/udp/association.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,9 @@ use shadowsocks::{
2828
use crate::{
2929
local::{context::ServiceContext, loadbalancing::PingBalancer},
3030
net::{
31-
packet_window::PacketWindowFilter, MonProxySocket, UDP_ASSOCIATION_KEEP_ALIVE_CHANNEL_SIZE,
31+
packet_window::PacketWindowFilter,
32+
MonProxySocket,
33+
UDP_ASSOCIATION_KEEP_ALIVE_CHANNEL_SIZE,
3234
UDP_ASSOCIATION_SEND_CHANNEL_SIZE,
3335
},
3436
};

crates/shadowsocks-service/src/local/socks/client/socks5/tcp_client.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,15 @@ use std::{
99
use log::trace;
1010
use pin_project::pin_project;
1111
use shadowsocks::relay::socks5::{
12-
self, Address, Command, Error, HandshakeRequest, HandshakeResponse, Reply, TcpRequestHeader, TcpResponseHeader,
12+
self,
13+
Address,
14+
Command,
15+
Error,
16+
HandshakeRequest,
17+
HandshakeResponse,
18+
Reply,
19+
TcpRequestHeader,
20+
TcpResponseHeader,
1321
};
1422
use tokio::{
1523
io::{AsyncRead, AsyncWrite, ReadBuf},

crates/shadowsocks-service/src/local/socks/server/server.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ use tokio::{net::TcpStream, time};
77
#[cfg(feature = "local-http")]
88
use crate::local::http::HttpConnectionHandler;
99
use crate::local::{
10-
context::ServiceContext, loadbalancing::PingBalancer, net::tcp::listener::create_standard_tcp_listener,
10+
context::ServiceContext,
11+
loadbalancing::PingBalancer,
12+
net::tcp::listener::create_standard_tcp_listener,
1113
socks::config::Socks5AuthConfig,
1214
};
1315

crates/shadowsocks-service/src/local/socks/server/socks4/tcprelay.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,12 @@ use crate::local::{
2121
};
2222

2323
use crate::local::socks::socks4::{
24-
Address, Command, Error as Socks4Error, HandshakeRequest, HandshakeResponse, ResultCode,
24+
Address,
25+
Command,
26+
Error as Socks4Error,
27+
HandshakeRequest,
28+
HandshakeResponse,
29+
ResultCode,
2530
};
2631

2732
pub struct Socks4TcpHandler {

crates/shadowsocks-service/src/local/socks/server/socks5/tcprelay.rs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,17 @@ use log::{debug, error, trace, warn};
1111
use shadowsocks::{
1212
config::Mode,
1313
relay::socks5::{
14-
self, Address, Command, Error as Socks5Error, HandshakeRequest, HandshakeResponse, PasswdAuthRequest,
15-
PasswdAuthResponse, Reply, TcpRequestHeader, TcpResponseHeader,
14+
self,
15+
Address,
16+
Command,
17+
Error as Socks5Error,
18+
HandshakeRequest,
19+
HandshakeResponse,
20+
PasswdAuthRequest,
21+
PasswdAuthResponse,
22+
Reply,
23+
TcpRequestHeader,
24+
TcpResponseHeader,
1625
},
1726
ServerAddr,
1827
};

crates/shadowsocks-service/src/manager/server.rs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,23 @@ use shadowsocks::{
1313
manager::{
1414
datagram::ManagerSocketAddr,
1515
protocol::{
16-
self, AddRequest, AddResponse, ErrorResponse, ListResponse, ManagerRequest, PingResponse, RemoveRequest,
17-
RemoveResponse, ServerUserConfig, StatRequest,
16+
self,
17+
AddRequest,
18+
AddResponse,
19+
ErrorResponse,
20+
ListResponse,
21+
ManagerRequest,
22+
PingResponse,
23+
RemoveRequest,
24+
RemoveResponse,
25+
ServerUserConfig,
26+
StatRequest,
1827
},
1928
},
2029
net::{AcceptOpts, ConnectOpts},
2130
plugin::PluginConfig,
22-
ManagerListener, ServerAddr,
31+
ManagerListener,
32+
ServerAddr,
2333
};
2434
use tokio::{sync::Mutex, task::JoinHandle};
2535

crates/shadowsocks-service/src/server/tcprelay.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ use shadowsocks::{
1313
crypto::CipherKind,
1414
net::{AcceptOpts, TcpStream as OutboundTcpStream},
1515
relay::tcprelay::{utils::copy_encrypted_bidirectional, ProxyServerStream},
16-
ProxyListener, ServerConfig,
16+
ProxyListener,
17+
ServerConfig,
1718
};
1819
use tokio::{
1920
io::{AsyncReadExt, AsyncWriteExt},

crates/shadowsocks-service/src/server/udprelay.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,10 @@ use shadowsocks::{
1818
crypto::CipherCategory,
1919
lookup_then,
2020
net::{
21-
get_ip_stack_capabilities, AcceptOpts, AddrFamily, UdpSocket as OutboundUdpSocket,
21+
get_ip_stack_capabilities,
22+
AcceptOpts,
23+
AddrFamily,
24+
UdpSocket as OutboundUdpSocket,
2225
UdpSocket as InboundUdpSocket,
2326
},
2427
relay::{
@@ -30,7 +33,10 @@ use shadowsocks::{
3033
use tokio::{runtime::Handle, sync::mpsc, task::JoinHandle, time};
3134

3235
use crate::net::{
33-
packet_window::PacketWindowFilter, utils::to_ipv4_mapped, MonProxySocket, UDP_ASSOCIATION_KEEP_ALIVE_CHANNEL_SIZE,
36+
packet_window::PacketWindowFilter,
37+
utils::to_ipv4_mapped,
38+
MonProxySocket,
39+
UDP_ASSOCIATION_KEEP_ALIVE_CHANNEL_SIZE,
3440
UDP_ASSOCIATION_SEND_CHANNEL_SIZE,
3541
};
3642

crates/shadowsocks/src/context.rs

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,32 @@ pub struct Context {
2828
ipv6_first: bool,
2929
}
3030

31+
#[allow(async_fn_in_trait)]
32+
pub trait ContextTrait {
33+
fn ipv6_first(&self) -> bool;
34+
async fn dns_resolve<'a>(&self, addr: &'a str, port: u16) -> io::Result<impl Iterator<Item = SocketAddr> + 'a>;
35+
}
36+
37+
impl<T: ContextTrait> ContextTrait for Arc<T> {
38+
fn ipv6_first(&self) -> bool {
39+
(**self).ipv6_first()
40+
}
41+
42+
async fn dns_resolve<'a>(&self, addr: &'a str, port: u16) -> io::Result<impl Iterator<Item = SocketAddr> + 'a> {
43+
(**self).dns_resolve(addr, port).await
44+
}
45+
}
46+
47+
impl ContextTrait for Context {
48+
fn ipv6_first(&self) -> bool {
49+
self.ipv6_first
50+
}
51+
52+
async fn dns_resolve<'a>(&self, addr: &'a str, port: u16) -> io::Result<impl Iterator<Item = SocketAddr> + 'a> {
53+
self.dns_resolver.resolve(addr, port).await
54+
}
55+
}
56+
3157
/// `Context` for sharing between services
3258
pub type SharedContext = Arc<Context>;
3359

@@ -132,21 +158,11 @@ impl Context {
132158
&self.dns_resolver
133159
}
134160

135-
/// Resolves DNS address to `SocketAddr`s
136-
pub async fn dns_resolve<'a>(&self, addr: &'a str, port: u16) -> io::Result<impl Iterator<Item = SocketAddr> + 'a> {
137-
self.dns_resolver.resolve(addr, port).await
138-
}
139-
140161
/// Try to connect IPv6 addresses first if hostname could be resolved to both IPv4 and IPv6
141162
pub fn set_ipv6_first(&mut self, ipv6_first: bool) {
142163
self.ipv6_first = ipv6_first;
143164
}
144165

145-
/// Try to connect IPv6 addresses first if hostname could be resolved to both IPv4 and IPv6
146-
pub fn ipv6_first(&self) -> bool {
147-
self.ipv6_first
148-
}
149-
150166
/// Set policy against replay attack
151167
pub fn set_replay_attack_policy(&mut self, replay_policy: ReplayAttackPolicy) {
152168
self.replay_policy = replay_policy;

crates/shadowsocks/src/dns_resolver/hickory_dns_resolver.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ use hickory_resolver::{
1919
runtime::{iocompat::AsyncIoTokioAsStd, RuntimeProvider, TokioHandle, TokioTime},
2020
udp::DnsUdpSocket,
2121
},
22-
ResolveError, Resolver,
22+
ResolveError,
23+
Resolver,
2324
};
2425
use log::trace;
2526
use tokio::{io::ReadBuf, net::UdpSocket};

crates/shadowsocks/src/dns_resolver/mod.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,14 @@ mod resolver;
1212
macro_rules! lookup_then {
1313
($context:expr, $addr:expr, $port:expr, |$resolved_addr:ident| $body:block) => {{
1414
use std::net::SocketAddr;
15+
use $crate::context::ContextTrait;
1516

16-
let ipv6_first = $context.ipv6_first();
17+
let ipv6_first = ContextTrait::ipv6_first($context);
1718

1819
let mut v4_addrs = Vec::new();
1920
let mut v6_addrs = Vec::new();
2021

21-
for addr in $context.dns_resolve($addr, $port).await? {
22+
for addr in ContextTrait::dns_resolve($context, $addr, $port).await? {
2223
match addr {
2324
SocketAddr::V4(..) => v4_addrs.push(addr),
2425
SocketAddr::V6(..) => v6_addrs.push(addr),

crates/shadowsocks/src/manager/client.rs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,16 @@ use super::{
88
datagram::ManagerDatagram,
99
error::Error,
1010
protocol::{
11-
AddRequest, AddResponse, ListRequest, ListResponse, ManagerProtocol, PingRequest, PingResponse, RemoveRequest,
12-
RemoveResponse, StatRequest,
11+
AddRequest,
12+
AddResponse,
13+
ListRequest,
14+
ListResponse,
15+
ManagerProtocol,
16+
PingRequest,
17+
PingResponse,
18+
RemoveRequest,
19+
RemoveResponse,
20+
StatRequest,
1321
},
1422
};
1523

crates/shadowsocks/src/net/sys/unix/bsd/freebsd.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use std::{
2-
io, mem,
2+
io,
3+
mem,
34
net::{Ipv4Addr, Ipv6Addr, SocketAddr},
45
os::unix::io::{AsRawFd, RawFd},
56
pin::Pin,
@@ -20,7 +21,9 @@ use tokio_tfo::TfoStream;
2021
use crate::net::{
2122
sys::{set_common_sockopt_after_connect, set_common_sockopt_for_connect, socket_bind_dual_stack},
2223
udp::{BatchRecvMessage, BatchSendMessage},
23-
AcceptOpts, AddrFamily, ConnectOpts,
24+
AcceptOpts,
25+
AddrFamily,
26+
ConnectOpts,
2427
};
2528

2629
/// A `TcpStream` that supports TFO (TCP Fast Open)

crates/shadowsocks/src/net/sys/unix/bsd/macos.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@ use tokio_tfo::TfoStream;
2424
use crate::net::{
2525
sys::{set_common_sockopt_after_connect, set_common_sockopt_for_connect, socket_bind_dual_stack},
2626
udp::{BatchRecvMessage, BatchSendMessage},
27-
AcceptOpts, AddrFamily, ConnectOpts,
27+
AcceptOpts,
28+
AddrFamily,
29+
ConnectOpts,
2830
};
2931

3032
/// A `TcpStream` that supports TFO (TCP Fast Open)

crates/shadowsocks/src/net/sys/unix/linux/mod.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use std::{
2-
io, mem,
2+
io,
3+
mem,
34
net::{Ipv4Addr, Ipv6Addr, SocketAddr},
45
os::unix::io::{AsRawFd, FromRawFd, IntoRawFd, RawFd},
56
pin::Pin,
@@ -21,7 +22,9 @@ use tokio_tfo::TfoStream;
2122
use crate::net::{
2223
sys::{set_common_sockopt_after_connect, set_common_sockopt_for_connect, socket_bind_dual_stack},
2324
udp::{BatchRecvMessage, BatchSendMessage},
24-
AcceptOpts, AddrFamily, ConnectOpts,
25+
AcceptOpts,
26+
AddrFamily,
27+
ConnectOpts,
2528
};
2629

2730
/// A `TcpStream` that supports TFO (TCP Fast Open)

crates/shadowsocks/src/net/sys/unix/others.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@ use tokio::{
1515

1616
use crate::net::{
1717
sys::{set_common_sockopt_after_connect, set_common_sockopt_for_connect, ErrorKind},
18-
AcceptOpts, AddrFamily, ConnectOpts,
18+
AcceptOpts,
19+
AddrFamily,
20+
ConnectOpts,
1921
};
2022

2123
/// A wrapper of `TcpStream`

0 commit comments

Comments
 (0)