From 05d3dc2f8797bd211335a9ab5c072701a23d2a23 Mon Sep 17 00:00:00 2001 From: "Y. T. Chung" Date: Fri, 21 Oct 2016 02:19:36 +0800 Subject: [PATCH] add necessary improvements --- README.md | 8 ++++---- src/relay/mod.rs | 11 ++++++++--- src/relay/tcprelay/local.rs | 4 ++-- src/relay/tcprelay/mod.rs | 6 ++---- 4 files changed, 16 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 63eadc01..459b50d1 100644 --- a/README.md +++ b/README.md @@ -55,8 +55,8 @@ Create a shadowsocks' configuration file. Example "timeout": 300, "method": "aes-256-cfb", - "http_local_port": 10240, - "http_local_address": "127.0.0.1", + "local_http_port": 10240, + "local_http_address": "127.0.0.1" } ``` @@ -84,8 +84,8 @@ In shadowsocks-rust, we also have an extended configuration file format, which i "local_port": 8388, "local_address": "127.0.0.1", - "http_local_port": 10240, - "http_local_address": "127.0.0.1", + "local_http_port": 10240, + "local_http_address": "127.0.0.1" } ``` diff --git a/src/relay/mod.rs b/src/relay/mod.rs index d160eec3..de922f21 100644 --- a/src/relay/mod.rs +++ b/src/relay/mod.rs @@ -23,6 +23,7 @@ use std::io::{self, Read, Write}; use std::net::SocketAddr; +use std::mem; pub use self::local::RelayLocal; pub use self::server::RelayServer; @@ -42,7 +43,7 @@ pub trait Relay { } fn copy_once(r: &mut R, w: &mut W) -> io::Result { - let mut buf = [0u8; 2048]; + let mut buf: [u8; 4096] = unsafe { mem::uninitialized() }; let len = match r.read(&mut buf) { Ok(0) => return Ok(0), Ok(len) => len, @@ -52,11 +53,15 @@ fn copy_once(r: &mut R, w: &mut W) -> io::Result { } fn copy_exact(r: &mut R, w: &mut W, len: usize) -> io::Result<()> { - let mut buf = [0u8; 2048]; + let mut buf: [u8; 4096] = unsafe { mem::uninitialized() }; let mut remain = len; while remain > 0 { - let bufl = if remain > buf.len() { buf.len() } else { remain }; + let bufl = if remain > buf.len() { + buf.len() + } else { + remain + }; let len = match r.read(&mut buf[..bufl]) { Ok(0) => break, Ok(len) => { diff --git a/src/relay/tcprelay/local.rs b/src/relay/tcprelay/local.rs index d6f5ed3a..f96c2f5d 100644 --- a/src/relay/tcprelay/local.rs +++ b/src/relay/tcprelay/local.rs @@ -264,7 +264,7 @@ impl TcpRelayLocal { const HANDSHAKE: &'static [u8] = b"HTTP/1.1 200 Connection Established\r\n\r\n"; - if let Err(err) = local_writer.write_all(HANDSHAKE) { + if let Err(err) = local_writer.write_all(HANDSHAKE).and_then(|_| local_writer.flush()) { error!("Failed to send handshake: {:?}", err); return Err(err); } @@ -282,7 +282,7 @@ impl TcpRelayLocal { trace!("HTTP Connect: Connected remote server"); - try!(encrypt_stream.write_all(remain)); + try!(encrypt_stream.write_all(remain).and_then(|_| encrypt_stream.flush())); let addr_cloned = addr.clone(); diff --git a/src/relay/tcprelay/mod.rs b/src/relay/tcprelay/mod.rs index f69c9f97..8f329c00 100644 --- a/src/relay/tcprelay/mod.rs +++ b/src/relay/tcprelay/mod.rs @@ -47,7 +47,6 @@ fn connect_proxy_server(server_addr: &SocketAddr, // Encrypt data to remote server - // Send initialize vector to remote and create encryptor let mut encrypt_stream = { let local_iv = encrypt_method.gen_init_vec(); @@ -73,13 +72,12 @@ fn connect_proxy_server(server_addr: &SocketAddr, // Send relay address to remote let mut addr_buf = Vec::new(); - relay_addr.write_to(&mut addr_buf).unwrap(); - if let Err(err) = encrypt_stream.write_all(&addr_buf) { + try!(relay_addr.write_to(&mut addr_buf)); + if let Err(err) = encrypt_stream.write_all(&addr_buf).and_then(|_| encrypt_stream.flush()) { error!("Error occurs while writing address: {}", err); return Err(err); } - // Decrypt data from remote server let remote_iv = {