#socks5-proxy #socks5 #async-read #async-networking #proxy #async #sock

socks5-proto

Fundamental abstractions and async read / write functions for SOCKS5 protocol

3 unstable releases

0.4.1 Apr 10, 2024
0.4.0 Jul 10, 2023
0.3.3 Jan 29, 2023
0.3.2 Jul 30, 2022
0.1.0 May 1, 2022

#19 in #socks5

Download history 1194/week @ 2024-11-17 542/week @ 2024-11-24 947/week @ 2024-12-01 812/week @ 2024-12-08 1148/week @ 2024-12-15 568/week @ 2024-12-22 367/week @ 2024-12-29 929/week @ 2025-01-05 1060/week @ 2025-01-12 1047/week @ 2025-01-19 901/week @ 2025-01-26 1001/week @ 2025-02-02 1016/week @ 2025-02-09 814/week @ 2025-02-16 918/week @ 2025-02-23 1048/week @ 2025-03-02

3,913 downloads per month
Used in 6 crates

GPL-3.0-or-later

29KB
688 lines

socks5-proto

This crate provides fundamental abstractions and async read / write functions for SOCKS5 protocol.

Version Documentation License

Check out socks5-server for a fine-grained relatively low-level asynchronized SOCKS5 server library.

Example

use socks5_proto::{
    handshake::{
        Method as HandshakeMethod, Request as HandshakeRequest, Response as HandshakeResponse,
    },
    Address, Error, ProtocolError, Reply, Request, Response,
};
use tokio::{io::AsyncWriteExt, net::TcpListener};

#[tokio::main]
async fn main() -> Result<(), Error> {
    let listener = TcpListener::bind("127.0.0.1:5000").await?;
    let (mut stream, _) = listener.accept().await?;

    let hs_req = HandshakeRequest::read_from(&mut stream).await?;

    if hs_req.methods.contains(&HandshakeMethod::NONE) {
        let hs_resp = HandshakeResponse::new(HandshakeMethod::NONE);
        hs_resp.write_to(&mut stream).await?;
    } else {
        let hs_resp = HandshakeResponse::new(HandshakeMethod::UNACCEPTABLE);
        hs_resp.write_to(&mut stream).await?;
        let _ = stream.shutdown().await;
        return Err(Error::Protocol(
            ProtocolError::NoAcceptableHandshakeMethod {
                version: socks5_proto::SOCKS_VERSION,
                chosen_method: HandshakeMethod::NONE,
                methods: hs_req.methods,
            },
        ));
    }

    let req = match Request::read_from(&mut stream).await {
        Ok(req) => req,
        Err(err) => {
            let resp = Response::new(Reply::GeneralFailure, Address::unspecified());
            resp.write_to(&mut stream).await?;
            let _ = stream.shutdown().await;
            return Err(err);
        }
    };

    match req.command {
        _ => todo!(), // process request
    }
}

License

GNU General Public License v3.0

Dependencies

~2.4–8.5MB
~66K SLoC