mirror of
https://github.com/tun2proxy/tun2proxy.git
synced 2025-04-23 23:39:10 +00:00
socks5 respones
This commit is contained in:
parent
c61b6c74cd
commit
6e81e78dfb
1 changed files with 15 additions and 32 deletions
47
src/socks.rs
47
src/socks.rs
|
@ -6,8 +6,8 @@ use crate::{
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
use smoltcp::wire::IpProtocol;
|
use smoltcp::wire::IpProtocol;
|
||||||
use socks5_impl::protocol::{self, Address, AddressType, UserKey};
|
use socks5_impl::protocol::{self, Address, UserKey};
|
||||||
use std::{collections::VecDeque, convert::TryFrom, net::SocketAddr, rc::Rc};
|
use std::{collections::VecDeque, net::SocketAddr, rc::Rc};
|
||||||
|
|
||||||
#[derive(Eq, PartialEq, Debug)]
|
#[derive(Eq, PartialEq, Debug)]
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
|
@ -231,37 +231,20 @@ impl SocksConnection {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn receive_connection_status(&mut self) -> Result<(), Error> {
|
fn receive_connection_status(&mut self) -> Result<(), Error> {
|
||||||
if self.server_inbuf.len() < 4 {
|
let response = protocol::Response::rebuild_from_stream(&mut self.server_inbuf);
|
||||||
return Ok(());
|
if let Err(e) = &response {
|
||||||
}
|
if e.kind() == std::io::ErrorKind::UnexpectedEof {
|
||||||
let ver = self.server_inbuf[0];
|
log::trace!("Waiting for more data \"{}\"...", e);
|
||||||
let rep = self.server_inbuf[1];
|
return Ok(());
|
||||||
let _rsv = self.server_inbuf[2];
|
} else {
|
||||||
let atyp = self.server_inbuf[3];
|
return Err(e.to_string().into());
|
||||||
|
|
||||||
if ver != 5 {
|
|
||||||
return Err("SOCKS5 server replied with an unexpected version.".into());
|
|
||||||
}
|
|
||||||
|
|
||||||
if rep != 0 {
|
|
||||||
return Err("SOCKS5 connection unsuccessful.".into());
|
|
||||||
}
|
|
||||||
|
|
||||||
let message_length = match AddressType::try_from(atyp)? {
|
|
||||||
AddressType::Domain => {
|
|
||||||
if self.server_inbuf.len() < 5 {
|
|
||||||
return Ok(());
|
|
||||||
}
|
|
||||||
if self.server_inbuf.len() < 7 + (self.server_inbuf[4] as usize) {
|
|
||||||
return Ok(());
|
|
||||||
}
|
|
||||||
7 + (self.server_inbuf[4] as usize)
|
|
||||||
}
|
}
|
||||||
AddressType::IPv4 => 10,
|
}
|
||||||
AddressType::IPv6 => 22,
|
let response = response?;
|
||||||
};
|
if response.reply != protocol::Reply::Succeeded {
|
||||||
|
return Err(format!("SOCKS connection failed: {}", response.reply).into());
|
||||||
self.server_inbuf.drain(0..message_length);
|
}
|
||||||
|
assert!(self.server_inbuf.is_empty());
|
||||||
self.server_outbuf.append(&mut self.data_buf);
|
self.server_outbuf.append(&mut self.data_buf);
|
||||||
self.data_buf.clear();
|
self.data_buf.clear();
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue