File: chainproxy.rs

package info (click to toggle)
rust-tokio-socks 0.5.2-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 288 kB
  • sloc: sh: 26; makefile: 2
file content (33 lines) | stat: -rw-r--r-- 1,073 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
//! Test the proxy chaining capabilities
//!
//! This example make uses of several public proxy.

use tokio::{
    io::{AsyncReadExt, AsyncWriteExt},
    net::TcpStream,
    runtime::Runtime,
};
use tokio_socks::{tcp::socks5::Socks5Stream, Error};

const PROXY_ADDR: [&str; 2] = ["184.176.166.20:4145", "90.89.205.248:1080"]; // public proxies found here : http://spys.one/en/socks-proxy-list/
const DEST_ADDR: &str = "duckduckgo.com:80";

async fn connect_chained_proxy() -> Result<(), Error> {
    let proxy_stream = TcpStream::connect(PROXY_ADDR[0]).await?;
    let chained_proxy_stream = Socks5Stream::connect_with_socket(proxy_stream, PROXY_ADDR[1]).await?;
    let mut stream = Socks5Stream::connect_with_socket(chained_proxy_stream, DEST_ADDR).await?;

    stream.write_all(b"GET /\n\n").await?;

    let mut buf = Vec::new();
    let n = stream.read_to_end(&mut buf).await?;

    println!("{} bytes read\n\n{}", n, String::from_utf8_lossy(&buf));

    Ok(())
}

fn main() {
    let rt = Runtime::new().unwrap();
    rt.block_on(connect_chained_proxy()).unwrap();
}