Advertisement
Guest User

Untitled

a guest
Jul 24th, 2018
166
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 4.27 KB | None | 0 0
  1. use std::thread::{spawn, sleep};
  2. use std::net::{TcpListener, TcpStream, Shutdown, ToSocketAddrs, IpAddr, Ipv4Addr};
  3. use std::time::Duration;
  4. use std::sync::{Mutex, Arc};
  5. use std::io::ErrorKind;
  6. use std::io::{Read, Write, Error};
  7. use std::io;
  8.  
  9. enum WriteType {
  10.     Encode,
  11.     Decode
  12. }
  13.  
  14. fn resolve(host: &str) -> io::Result<Ipv4Addr> {
  15.     let addrs: Vec<IpAddr> = (host, 0).to_socket_addrs().map(|iter| iter.map(|socket_address| socket_address.ip()).collect())?;
  16.     for addr in addrs.into_iter() {
  17.         match addr {
  18.             IpAddr::V4(t) => { return Ok(t); },
  19.             IpAddr::V6(_t) => {  },
  20.         };
  21.     };
  22.     Err(Error::new(ErrorKind::NotFound, "Adress not found"))
  23. }
  24.  
  25. fn main() {
  26.     let listener = TcpListener::bind("127.0.0.1:2027").unwrap();
  27.  
  28.     for stream in listener.incoming() {
  29.         let stream = stream.unwrap();
  30.         stream.set_nonblocking(true).unwrap();
  31.  
  32.         spawn(|| {
  33.             handle_stream(stream);
  34.         });
  35.     }
  36. }
  37.  
  38. fn handle_stream(browser: TcpStream) {
  39.     let addr = "78.82.230.209:80".parse().unwrap();
  40.     let timeout = Duration::from_secs(15);
  41.     let server: TcpStream;
  42.     match TcpStream::connect_timeout(&addr, timeout) {
  43.         Ok(s) => { server = s; },
  44.         Err(e) => { panic!(e) }
  45.     }
  46.  
  47.     server.set_nonblocking(true).unwrap();
  48.  
  49.     let server_mutex = Arc::new(Mutex::new(server));
  50.     let browser_mutex = Arc::new(Mutex::new(browser));
  51.  
  52.     let server_clone = Arc::clone(&server_mutex);
  53.     let browser_clone = Arc::clone(&browser_mutex);
  54.  
  55.     let server_clone2 = Arc::clone(&server_mutex);
  56.     let browser_clone2 = Arc::clone(&browser_mutex);
  57.  
  58.     copy(server_clone, browser_clone, WriteType::Decode);
  59.     copy(browser_clone2, server_clone2, WriteType::Encode);
  60. }
  61.  
  62. fn encode(data: &[u8]) -> Vec<u8> {
  63. //    println!("<-{:?}", data);
  64.     let retval: Vec<u8>;
  65.     let mut data_vec = data.to_vec();
  66.     if data.len() > 4 && data[..4] == [5, 1, 0, 3] {
  67.         let mut new_data: Vec<u8> = [5, 1, 0, 1].to_vec();
  68.         let len = data[4] as usize;
  69.         let host = String::from_utf8_lossy(&data[5..5+len]);
  70. //        println!("Host: {:?}", host);
  71.         let ip = resolve(&host.to_string()).unwrap().octets();
  72.         let port = &data[5+len..];
  73. //        println!("Ip: {:?}", ip);
  74.         new_data.extend_from_slice(&ip);
  75.         new_data.extend_from_slice(port);
  76.         data_vec = new_data;
  77.     }
  78.     retval = data_vec.into_iter().map(|byte| {
  79.         if byte < 12u8 { byte + 244u8 } else { byte - 12u8 }
  80.     }).collect();
  81.     retval
  82. }
  83.  
  84. fn decode(data: &mut [u8]) -> Vec<u8> {
  85.     let mut retval: Vec<u8> = vec![];
  86.     for t in data {
  87.         let byte = *t;
  88.         let d = if byte > 243u8 { byte - 244u8 } else { byte + 12u8 };
  89.         retval.push(d);
  90.     }
  91. //    println!("->{:?}", retval);
  92.     retval
  93. }
  94.  
  95. fn copy(from: Arc<Mutex<TcpStream>>,
  96.         to: Arc<Mutex<TcpStream>>,
  97.         write_type: WriteType) {
  98.  
  99.     spawn(move || {
  100.         let mut buf = [0u8;4096];
  101.         let mut empty_response = 0;
  102.         loop {
  103.             let mut count = 0;
  104.             {
  105.                 let mut from_guard = from.lock().unwrap();
  106.                 match from_guard.read(&mut buf) {
  107.                     Ok(c) => { count = c },
  108.                     Err(ref e) if e.kind() == ErrorKind::WouldBlock => { },
  109.                     Err(_) => { break }
  110.                 };
  111.             }
  112.             if count > 0 {
  113.                 empty_response = 0;
  114.                 let result = match write_type {
  115.                     WriteType::Encode => encode(&mut buf[0..count]),
  116.                     WriteType::Decode => decode(&mut buf[0..count])
  117.                 };
  118.                 let mut to_guard = to.lock().unwrap();
  119.                 match to_guard.write(&result) {
  120.                     Ok(_) => to_guard.flush().unwrap(),
  121.                     Err(_) => { break }
  122.                 };
  123.             } else {
  124.                 empty_response += 1;
  125.                 if empty_response == 5000 { break };
  126.                 sleep(Duration::from_millis(1));
  127.             }
  128.         }
  129.         let from_guard = from.lock().unwrap();
  130.         let to_guard = to.lock().unwrap();
  131.         from_guard.shutdown(Shutdown::Both).unwrap_or_else(|_|{});
  132.         to_guard.shutdown(Shutdown::Both).unwrap_or_else(|_|{});
  133.     });
  134. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement