diff options
| author | David Lönnhager <david.l@mullvad.net> | 2024-02-07 17:50:24 +0100 |
|---|---|---|
| committer | David Lönnhager <david.l@mullvad.net> | 2024-02-07 17:50:24 +0100 |
| commit | 0d4ee241b523a7d024cb2aebfcbbf3924a8f3bb5 (patch) | |
| tree | c095e7b898d4d736322d267965948b30fde3bf50 /test/socks-server | |
| parent | 20d9c98f5ec44166b461730fec9ca292b622265f (diff) | |
| parent | eed7234599253f3d742be8bb4b6b1ecbf1299dc3 (diff) | |
| download | mullvadvpn-0d4ee241b523a7d024cb2aebfcbbf3924a8f3bb5.tar.xz mullvadvpn-0d4ee241b523a7d024cb2aebfcbbf3924a8f3bb5.zip | |
Merge branch 'testing-add-socks-server'
Diffstat (limited to 'test/socks-server')
| -rw-r--r-- | test/socks-server/Cargo.toml | 18 | ||||
| -rw-r--r-- | test/socks-server/src/lib.rs | 58 |
2 files changed, 76 insertions, 0 deletions
diff --git a/test/socks-server/Cargo.toml b/test/socks-server/Cargo.toml new file mode 100644 index 0000000000..ba6d1ba4f8 --- /dev/null +++ b/test/socks-server/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "socks-server" +description = "Contains a simple SOCKS5 server" +authors.workspace = true +repository.workspace = true +license.workspace = true +edition.workspace = true +rust-version.workspace = true + +[lints] +workspace = true + +[dependencies] +fast-socks5 = "0.9.5" +err-derive = { workspace = true } +tokio = { workspace = true } +log = { workspace = true } +futures = { workspace = true } diff --git a/test/socks-server/src/lib.rs b/test/socks-server/src/lib.rs new file mode 100644 index 0000000000..eed676ac8e --- /dev/null +++ b/test/socks-server/src/lib.rs @@ -0,0 +1,58 @@ +use futures::StreamExt; +use std::io; +use std::net::SocketAddr; + +#[derive(err_derive::Error, Debug)] +#[error(no_from)] +pub enum Error { + #[error(display = "Failed to start SOCKS5 server")] + StartSocksServer(#[error(source)] io::Error), +} + +pub struct Handle { + handle: tokio::task::JoinHandle<()>, +} + +/// Spawn a SOCKS server bound to `bind_addr` +pub async fn spawn(bind_addr: SocketAddr) -> Result<Handle, Error> { + let socks_server: fast_socks5::server::Socks5Server = + fast_socks5::server::Socks5Server::bind(bind_addr) + .await + .map_err(Error::StartSocksServer)?; + + let handle = tokio::spawn(async move { + let mut incoming = socks_server.incoming(); + + while let Some(new_client) = incoming.next().await { + match new_client { + Ok(socket) => { + let fut = socket.upgrade_to_socks5(); + + // Act as normal SOCKS server + tokio::spawn(async move { + match fut.await { + Ok(_socket) => log::info!("socks client disconnected"), + Err(error) => log::error!("socks client failed: {error}"), + } + }); + } + Err(error) => { + log::error!("failed to accept socks client: {error}"); + } + } + } + }); + Ok(Handle { handle }) +} + +impl Handle { + pub fn close(&self) { + self.handle.abort(); + } +} + +impl Drop for Handle { + fn drop(&mut self) { + self.close(); + } +} |
