Unexpected comsuming (#48)

This commit is contained in:
ssrlive 2023-07-26 07:01:48 +08:00 committed by GitHub
parent a00f4b1a8b
commit 8d835dc96d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 19 additions and 11 deletions

View file

@ -6,7 +6,9 @@ use crate::{
},
};
use smoltcp::wire::IpProtocol;
use socks5_impl::protocol::{self, handshake, password_method, Address, AuthMethod, UserKey};
use socks5_impl::protocol::{
self, handshake, password_method, Address, AuthMethod, StreamOperation, UserKey,
};
use std::{collections::VecDeque, net::SocketAddr, rc::Rc};
#[derive(Eq, PartialEq, Debug)]
@ -132,16 +134,17 @@ impl SocksConnection {
}
fn receive_server_hello_socks5(&mut self) -> Result<(), Error> {
let response = handshake::Response::rebuild_from_stream(&mut self.server_inbuf);
let response = handshake::Response::retrieve_from_stream(&mut self.server_inbuf.clone());
if let Err(e) = &response {
if e.kind() == std::io::ErrorKind::UnexpectedEof {
log::trace!("receive_server_hello_socks5 need more data \"{}\"...", e);
log::trace!("receive_server_hello_socks5 needs more data \"{}\"...", e);
return Ok(());
} else {
return Err(e.to_string().into());
}
}
let respones = response?;
self.server_inbuf.drain(0..respones.len());
let auth_method = respones.method;
if auth_method != AuthMethod::NoAuth && self.credentials.is_none()
@ -176,17 +179,18 @@ impl SocksConnection {
}
fn receive_auth_data(&mut self) -> Result<(), Error> {
let response = password_method::Response::rebuild_from_stream(&mut self.server_inbuf);
use password_method::Response;
let response = Response::retrieve_from_stream(&mut self.server_inbuf.clone());
if let Err(e) = &response {
if e.kind() == std::io::ErrorKind::UnexpectedEof {
log::trace!("receive_auth_data need more data \"{}\"...", e);
log::trace!("receive_auth_data needs more data \"{}\"...", e);
return Ok(());
} else {
return Err(e.to_string().into());
}
}
assert!(self.server_inbuf.is_empty());
let response = response?;
self.server_inbuf.drain(0..response.len());
if response.status != password_method::Status::Succeeded {
return Err(format!("SOCKS authentication failed: {:?}", response.status).into());
}
@ -195,20 +199,20 @@ impl SocksConnection {
}
fn receive_connection_status(&mut self) -> Result<(), Error> {
let response = protocol::Response::rebuild_from_stream(&mut self.server_inbuf);
let response = protocol::Response::retrieve_from_stream(&mut self.server_inbuf.clone());
if let Err(e) = &response {
if e.kind() == std::io::ErrorKind::UnexpectedEof {
log::trace!("receive_connection_status need more data \"{}\"...", e);
log::trace!("receive_connection_status needs more data \"{}\"...", e);
return Ok(());
} else {
return Err(e.to_string().into());
}
}
let response = response?;
self.server_inbuf.drain(0..response.len());
if response.reply != protocol::Reply::Succeeded {
return Err(format!("SOCKS connection failed: {}", response.reply).into());
}
assert!(self.server_inbuf.is_empty());
self.server_outbuf.append(&mut self.data_buf);
self.data_buf.clear();