use super::*;
impl ProxyTunnelStream {
pub(crate) fn new(stream: BoxAsyncReadWrite, pre_read_data: Vec<u8>) -> Self {
Self {
inner: stream,
pre_read_data,
}
}
}
impl AsyncRead for ProxyTunnelStream {
fn poll_read(
mut self: Pin<&mut Self>,
cx: &mut Context<'_>,
buf: &mut ReadBuf<'_>,
) -> Poll<std::io::Result<()>> {
if !self.get_pre_read_data().is_empty() {
let len: usize = std::cmp::min(self.get_pre_read_data().len(), buf.remaining());
buf.put_slice(&self.get_pre_read_data()[..len]);
self.get_mut_pre_read_data().drain(..len);
return Poll::Ready(Ok(()));
}
Pin::new(self.get_mut_inner()).poll_read(cx, buf)
}
}
impl AsyncWrite for ProxyTunnelStream {
fn poll_write(
mut self: Pin<&mut Self>,
cx: &mut Context<'_>,
buf: &[u8],
) -> Poll<Result<usize, std::io::Error>> {
Pin::new(self.get_mut_inner()).poll_write(cx, buf)
}
fn poll_flush(
mut self: Pin<&mut Self>,
cx: &mut Context<'_>,
) -> Poll<Result<(), std::io::Error>> {
Pin::new(self.get_mut_inner()).poll_flush(cx)
}
fn poll_shutdown(
mut self: Pin<&mut Self>,
cx: &mut Context<'_>,
) -> Poll<Result<(), std::io::Error>> {
Pin::new(self.get_mut_inner()).poll_shutdown(cx)
}
}
impl Unpin for ProxyTunnelStream {}
impl SyncProxyTunnelStream {
pub(crate) fn new(stream: BoxReadWrite, pre_read_data: Vec<u8>) -> Self {
Self {
inner: stream,
pre_read_data,
}
}
}
impl Read for SyncProxyTunnelStream {
fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
if !self.get_pre_read_data().is_empty() {
let len: usize = std::cmp::min(self.get_pre_read_data().len(), buf.len());
buf[..len].copy_from_slice(&self.get_pre_read_data()[..len]);
self.get_mut_pre_read_data().drain(..len);
return Ok(len);
}
self.get_mut_inner().read(buf)
}
}
impl Write for SyncProxyTunnelStream {
fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
self.get_mut_inner().write(buf)
}
fn flush(&mut self) -> std::io::Result<()> {
self.get_mut_inner().flush()
}
}
impl Proxy {
pub fn http<H: AsRef<str>>(host: H, port: u16) -> Self {
Self::new(ProxyType::Http, host, port)
}
pub fn https<H: AsRef<str>>(host: H, port: u16) -> Self {
Self::new(ProxyType::Https, host, port)
}
pub fn socks5<H: AsRef<str>>(host: H, port: u16) -> Self {
Self::new(ProxyType::Socks5, host, port)
}
pub fn auth<U: AsRef<str>, P: AsRef<str>>(mut self, username: U, password: P) -> Self {
self.set_username(Some(username.as_ref().to_owned()));
self.set_password(Some(password.as_ref().to_owned()));
self
}
fn new<H: AsRef<str>>(proxy_type: ProxyType, host: H, port: u16) -> Self {
Self {
proxy_type,
host: host.as_ref().to_owned(),
port,
username: None,
password: None,
}
}
}