Crate socks5_proto

Crate socks5_proto 

Source
Expand description

§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

Modules§

handshake
This module contains the implementation of SOCKS5 protocol handshake.

Structs§

Request
SOCKS5 request
Response
SOCKS5 response
UdpHeader
SOCKS5 UDP packet header

Enums§

Address
SOCKS5 address
Command
SOCKS5 command
Error
Converging error types
ProtocolError
Errors may occured during protocol header parsing
Reply
SOCKS5 reply

Constants§

SOCKS_VERSION