mirror of
https://github.com/shadowsocks/shadowsocks-rust.git
synced 2026-02-09 01:59:16 +08:00
add necessary improvements
This commit is contained in:
@@ -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"
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
@@ -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: Read, W: Write>(r: &mut R, w: &mut W) -> io::Result<usize> {
|
||||
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: Read, W: Write>(r: &mut R, w: &mut W) -> io::Result<usize> {
|
||||
}
|
||||
|
||||
fn copy_exact<R: Read, W: Write>(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) => {
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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 = {
|
||||
|
||||
Reference in New Issue
Block a user