mirror of
https://github.com/shadowsocks/shadowsocks-rust.git
synced 2026-11-15 00:15:11 +00:00
* upgrade to tokio v1.0 - removed tokio::prelude - upgrade hyper to v0.14, tokio-rustls to v0.22 still working on migrating trust-dns-* and tokio-native-tls ref #354 * tokio v1.0 removed with_poll fix #355, ref #354 * removed CTRL-BREAK signal handler ref #354 * fixes compliation error, add missing return fixes #355 * allow setting SO_SNDBUF and SO_RCVBUF for sockets ref #352 * completely removed unix socket based DNS resolving ref shadowsocks/shadowsocks-android#2622 * fix build issue on Windows * fixed uds poll_write loop, fixed udp outbound loopback check ref #355 * disable default trust-dns resolver for andorid, macos, ios This commit also: - Optimized resolve() logging with elapsed time - updated tokio-native-tls * local-dns removed from default features * fix rustc version with rust-toolchain * Bump bytes from 0.6.0 to 1.0.0 * add dependabot badge * indirectly depend on trust_dns_proto via trust_dns_resolver * auto reconnect if udp sendto failed * recreate proxied socket if recv() returns failure * increase score precision to 0.0001 * example of log4rs configuration * PingBalancer instance shouldn't kill probing task when dropping - Probing task should be controlled by the internal shared state * switch to trust-dns main for latest tokio 1.0 support
101 lines
2.7 KiB
Rust
101 lines
2.7 KiB
Rust
#![cfg(all(feature = "local-socks4", feature = "server"))]
|
|
|
|
use std::{
|
|
net::{SocketAddr, ToSocketAddrs},
|
|
str,
|
|
};
|
|
|
|
use tokio::{
|
|
io::{AsyncReadExt, AsyncWriteExt},
|
|
time::{self, Duration},
|
|
};
|
|
|
|
use shadowsocks_service::{
|
|
config::{Config, ConfigType, ProtocolType},
|
|
local::socks::client::Socks4TcpClient,
|
|
run_local,
|
|
run_server,
|
|
shadowsocks::{
|
|
config::{ServerAddr, ServerConfig},
|
|
crypto::v1::CipherKind,
|
|
},
|
|
};
|
|
|
|
pub struct Socks4TestServer {
|
|
local_addr: SocketAddr,
|
|
svr_config: Config,
|
|
cli_config: Config,
|
|
}
|
|
|
|
impl Socks4TestServer {
|
|
pub fn new<S, L>(svr_addr: S, local_addr: L, pwd: &str, method: CipherKind) -> Socks4TestServer
|
|
where
|
|
S: ToSocketAddrs,
|
|
L: ToSocketAddrs,
|
|
{
|
|
let svr_addr = svr_addr.to_socket_addrs().unwrap().next().unwrap();
|
|
let local_addr = local_addr.to_socket_addrs().unwrap().next().unwrap();
|
|
|
|
Socks4TestServer {
|
|
local_addr,
|
|
svr_config: {
|
|
let mut cfg = Config::new(ConfigType::Server);
|
|
cfg.server = vec![ServerConfig::new(svr_addr, pwd.to_owned(), method)];
|
|
cfg
|
|
},
|
|
cli_config: {
|
|
let mut cfg = Config::new(ConfigType::Local);
|
|
cfg.local_addr = Some(ServerAddr::from(local_addr));
|
|
cfg.server = vec![ServerConfig::new(svr_addr, pwd.to_owned(), method)];
|
|
cfg.local_protocol = ProtocolType::Socks;
|
|
cfg
|
|
},
|
|
}
|
|
}
|
|
|
|
pub fn client_addr(&self) -> &SocketAddr {
|
|
&self.local_addr
|
|
}
|
|
|
|
pub async fn run(&self) {
|
|
let svr_cfg = self.svr_config.clone();
|
|
tokio::spawn(run_server(svr_cfg));
|
|
|
|
let client_cfg = self.cli_config.clone();
|
|
tokio::spawn(run_local(client_cfg));
|
|
|
|
time::sleep(Duration::from_secs(1)).await;
|
|
}
|
|
}
|
|
|
|
#[tokio::test]
|
|
async fn socks4_relay_connect() {
|
|
let _ = env_logger::try_init();
|
|
|
|
const SERVER_ADDR: &str = "127.0.0.1:7100";
|
|
const LOCAL_ADDR: &str = "127.0.0.1:7200";
|
|
|
|
const PASSWORD: &str = "test-password";
|
|
const METHOD: CipherKind = CipherKind::AES_128_GCM;
|
|
|
|
let svr = Socks4TestServer::new(SERVER_ADDR, LOCAL_ADDR, PASSWORD, METHOD);
|
|
svr.run().await;
|
|
|
|
static HTTP_REQUEST: &[u8] = b"GET / HTTP/1.0\r\nHost: www.example.com\r\nAccept: */*\r\n\r\n";
|
|
|
|
let mut c = Socks4TcpClient::connect(("www.example.com", 80), LOCAL_ADDR, Vec::new())
|
|
.await
|
|
.unwrap();
|
|
|
|
c.write_all(HTTP_REQUEST).await.unwrap();
|
|
c.flush().await.unwrap();
|
|
|
|
let mut buf = Vec::new();
|
|
c.read_to_end(&mut buf).await.unwrap();
|
|
|
|
println!("Got reply from server: {}", str::from_utf8(&buf).unwrap());
|
|
|
|
let http_status = b"HTTP/1.0 200 OK\r\n";
|
|
buf.starts_with(http_status);
|
|
}
|