Struct tor_proto::stream::DataStream
source · [−]pub struct DataStream { /* private fields */ }Expand description
An anonymized stream over the Tor network.
For most purposes, you can think of this type as an anonymized TCP stream: it can read and write data, and get closed when it’s done.
DataStream implements [futures::io::AsyncRead] and
[futures::io::AsyncWrite], so you can use it anywhere that those
traits are expected.
Examples
Connecting to an HTTP server and sending a request, using
AsyncWriteExt::write_all:
let mut stream = tor_client.connect(("icanhazip.com", 80), None).await?;
use futures::io::AsyncWriteExt;
stream
.write_all(b"GET / HTTP/1.1\r\nHost: icanhazip.com\r\nConnection: close\r\n\r\n")
.await?;
// Flushing the stream is important; see below!
stream.flush().await?;Reading the result, using AsyncReadExt::read_to_end:
use futures::io::AsyncReadExt;
let mut buf = Vec::new();
stream.read_to_end(&mut buf).await?;
println!("{}", String::from_utf8_lossy(&buf));Usage with Tokio
If the tokio crate feature is enabled, this type also implements
tokio::io::AsyncRead and
tokio::io::AsyncWrite for easier integration
with code that expects those traits.
Remember to call flush!
DataStream buffers data internally, in order to write as few cells
as possible onto the network. In order to make sure that your
data has actually been sent, you need to make sure that
[AsyncWrite::poll_flush] runs to completion: probably via
AsyncWriteExt::flush.
Splitting the type
This type is internally composed of a DataReader and a DataWriter; the
DataStream::split method can be used to split it into those two parts, for more
convenient usage with e.g. stream combinators.
Implementations
sourceimpl DataStream
impl DataStream
sourcepub fn split(self) -> (DataReader, DataWriter)
pub fn split(self) -> (DataReader, DataWriter)
Divide this DataStream into its constituent parts.
Trait Implementations
sourceimpl AsyncRead for DataStream
impl AsyncRead for DataStream
sourceimpl AsyncRead for DataStream
Available on crate feature tokio only.
impl AsyncRead for DataStream
tokio only.sourceimpl AsyncWrite for DataStream
impl AsyncWrite for DataStream
sourcefn poll_write(
self: Pin<&mut Self>,
cx: &mut Context<'_>,
buf: &[u8]
) -> Poll<IoResult<usize>>
fn poll_write(
self: Pin<&mut Self>,
cx: &mut Context<'_>,
buf: &[u8]
) -> Poll<IoResult<usize>>
buf into the object. Read moresourcefn poll_flush(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<IoResult<()>>
fn poll_flush(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<IoResult<()>>
sourceimpl AsyncWrite for DataStream
Available on crate feature tokio only.
impl AsyncWrite for DataStream
tokio only.sourcefn poll_write(
self: Pin<&mut Self>,
cx: &mut Context<'_>,
buf: &[u8]
) -> Poll<IoResult<usize>>
fn poll_write(
self: Pin<&mut Self>,
cx: &mut Context<'_>,
buf: &[u8]
) -> Poll<IoResult<usize>>
buf into the object. Read moresourcefn poll_flush(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<IoResult<()>>
fn poll_flush(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<IoResult<()>>
sourcefn poll_shutdown(
self: Pin<&mut Self>,
cx: &mut Context<'_>
) -> Poll<IoResult<()>>
fn poll_shutdown(
self: Pin<&mut Self>,
cx: &mut Context<'_>
) -> Poll<IoResult<()>>
sourcefn poll_write_vectored(
self: Pin<&mut Self>,
cx: &mut Context<'_>,
bufs: &[IoSlice<'_>]
) -> Poll<Result<usize, Error>>
fn poll_write_vectored(
self: Pin<&mut Self>,
cx: &mut Context<'_>,
bufs: &[IoSlice<'_>]
) -> Poll<Result<usize, Error>>
poll_write, except that it writes from a slice of buffers. Read moresourcefn is_write_vectored(&self) -> bool
fn is_write_vectored(&self) -> bool
poll_write_vectored
implementation. Read moreAuto Trait Implementations
impl !RefUnwindSafe for DataStream
impl Send for DataStream
impl !Sync for DataStream
impl Unpin for DataStream
impl !UnwindSafe for DataStream
Blanket Implementations
impl<R> AsyncReadExt for Rwhere
R: AsyncRead + ?Sized,
impl<R> AsyncReadExt for Rwhere
R: AsyncRead + ?Sized,
fn chain<R>(self, next: R) -> Chain<Self, R>where
R: AsyncRead,
fn chain<R>(self, next: R) -> Chain<Self, R>where
R: AsyncRead,
fn read(&'a mut self, buf: &'a mut [u8]) -> Read<'a, Self>where
Self: Unpin,
fn read(&'a mut self, buf: &'a mut [u8]) -> Read<'a, Self>where
Self: Unpin,
buf in asynchronous
manner, returning a future type. Read morefn read_vectored(
&'a mut self,
bufs: &'a mut [IoSliceMut<'a>]
) -> ReadVectored<'a, Self>where
Self: Unpin,
fn read_vectored(
&'a mut self,
bufs: &'a mut [IoSliceMut<'a>]
) -> ReadVectored<'a, Self>where
Self: Unpin,
AsyncRead into bufs using vectored
IO operations. Read morefn read_exact(&'a mut self, buf: &'a mut [u8]) -> ReadExact<'a, Self>where
Self: Unpin,
fn read_exact(&'a mut self, buf: &'a mut [u8]) -> ReadExact<'a, Self>where
Self: Unpin,
buf,
returning an error if end of file (EOF) is hit sooner. Read morefn read_to_end(&'a mut self, buf: &'a mut Vec<u8, Global>) -> ReadToEnd<'a, Self>where
Self: Unpin,
fn read_to_end(&'a mut self, buf: &'a mut Vec<u8, Global>) -> ReadToEnd<'a, Self>where
Self: Unpin,
AsyncRead. Read morefn read_to_string(&'a mut self, buf: &'a mut String) -> ReadToString<'a, Self>where
Self: Unpin,
fn read_to_string(&'a mut self, buf: &'a mut String) -> ReadToString<'a, Self>where
Self: Unpin,
AsyncRead. Read moreimpl<W> AsyncWriteExt for Wwhere
W: AsyncWrite + ?Sized,
impl<W> AsyncWriteExt for Wwhere
W: AsyncWrite + ?Sized,
fn flush(&mut self) -> Flush<'_, Self>where
Self: Unpin,
fn flush(&mut self) -> Flush<'_, Self>where
Self: Unpin,
AsyncWrite. Read morefn close(&mut self) -> Close<'_, Self>where
Self: Unpin,
fn close(&mut self) -> Close<'_, Self>where
Self: Unpin,
AsyncWrite.fn write(&'a mut self, buf: &'a [u8]) -> Write<'a, Self>where
Self: Unpin,
fn write(&'a mut self, buf: &'a [u8]) -> Write<'a, Self>where
Self: Unpin,
buf into the object. Read morefn write_vectored(
&'a mut self,
bufs: &'a [IoSlice<'a>]
) -> WriteVectored<'a, Self>where
Self: Unpin,
fn write_vectored(
&'a mut self,
bufs: &'a [IoSlice<'a>]
) -> WriteVectored<'a, Self>where
Self: Unpin,
bufs into the object using vectored
IO operations. Read more