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§
source§impl DataStream
impl DataStream
sourcepub fn split(self) -> (DataReader, DataWriter)
pub fn split(self) -> (DataReader, DataWriter)
Divide this DataStream into its constituent parts.
sourcepub fn circuit(&self) -> &ClientCirc
Available on crate feature experimental-api only.
pub fn circuit(&self) -> &ClientCirc
experimental-api only.Return a reference to this stream’s circuit?
This is an experimental API; it is not covered by semver guarantee. It is likely to change or disappear in a future release.
TODO: Should there be an AttachedToCircuit trait that we use for all client stream types? Should this return an Option<&ClientCirc>?
Trait Implementations§
source§impl AsyncRead for DataStream
Available on crate feature tokio only.
impl AsyncRead for DataStream
tokio only.source§impl AsyncRead for DataStream
impl AsyncRead for DataStream
source§impl AsyncWrite for DataStream
Available on crate feature tokio only.
impl AsyncWrite for DataStream
tokio only.source§fn 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 moresource§fn poll_flush(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<IoResult<()>>
fn poll_flush(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<IoResult<()>>
source§fn poll_shutdown(
self: Pin<&mut Self>,
cx: &mut Context<'_>
) -> Poll<IoResult<()>>
fn poll_shutdown( self: Pin<&mut Self>, cx: &mut Context<'_> ) -> Poll<IoResult<()>>
source§fn 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 moresource§fn is_write_vectored(&self) -> bool
fn is_write_vectored(&self) -> bool
poll_write_vectored
implementation. Read moresource§impl AsyncWrite for DataStream
impl AsyncWrite for DataStream
source§fn 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 moresource§fn poll_flush(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<IoResult<()>>
fn poll_flush(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<IoResult<()>>
Auto 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
Self: Sized,
R: AsyncRead,
fn chain<R>(self, next: R) -> Chain<Self, R>where Self: Sized, R: AsyncRead,
§fn read<'a>(&'a mut self, buf: &'a mut [u8]) -> Read<'a, Self>where
Self: Unpin,
fn read<'a>(&'a mut self, buf: &'a mut [u8]) -> Read<'a, Self>where Self: Unpin,
buf in asynchronous
manner, returning a future type. Read more§fn read_vectored<'a>(
&'a mut self,
bufs: &'a mut [IoSliceMut<'a>]
) -> ReadVectored<'a, Self>where
Self: Unpin,
fn read_vectored<'a>( &'a mut self, bufs: &'a mut [IoSliceMut<'a>] ) -> ReadVectored<'a, Self>where Self: Unpin,
AsyncRead into bufs using vectored
IO operations. Read more§fn read_exact<'a>(&'a mut self, buf: &'a mut [u8]) -> ReadExact<'a, Self>where
Self: Unpin,
fn read_exact<'a>(&'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 more§fn read_to_end<'a>(
&'a mut self,
buf: &'a mut Vec<u8, Global>
) -> ReadToEnd<'a, Self>where
Self: Unpin,
fn read_to_end<'a>( &'a mut self, buf: &'a mut Vec<u8, Global> ) -> ReadToEnd<'a, Self>where Self: Unpin,
AsyncRead. Read more§fn read_to_string<'a>(
&'a mut self,
buf: &'a mut String
) -> ReadToString<'a, Self>where
Self: Unpin,
fn read_to_string<'a>( &'a mut self, buf: &'a mut String ) -> ReadToString<'a, Self>where Self: Unpin,
AsyncRead. Read more§impl<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 more§fn close(&mut self) -> Close<'_, Self>where
Self: Unpin,
fn close(&mut self) -> Close<'_, Self>where Self: Unpin,
AsyncWrite.§fn write<'a>(&'a mut self, buf: &'a [u8]) -> Write<'a, Self>where
Self: Unpin,
fn write<'a>(&'a mut self, buf: &'a [u8]) -> Write<'a, Self>where Self: Unpin,
buf into the object. Read more§fn write_vectored<'a>(
&'a mut self,
bufs: &'a [IoSlice<'a>]
) -> WriteVectored<'a, Self>where
Self: Unpin,
fn write_vectored<'a>( &'a mut self, bufs: &'a [IoSlice<'a>] ) -> WriteVectored<'a, Self>where Self: Unpin,
bufs into the object using vectored
IO operations. Read moresource§impl<T> FuturesAsyncReadCompatExt for Twhere
T: AsyncRead,
impl<T> FuturesAsyncReadCompatExt for Twhere T: AsyncRead,
source§impl<T> FuturesAsyncWriteCompatExt for Twhere
T: AsyncWrite,
impl<T> FuturesAsyncWriteCompatExt for Twhere T: AsyncWrite,
source§fn compat_write(self) -> Compat<Self>where
Self: Sized,
fn compat_write(self) -> Compat<Self>where Self: Sized,
self with a compatibility layer that implements
tokio::io::AsyncWrite.source§impl<T> Instrument for T
impl<T> Instrument for T
source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<T> TokioAsyncReadCompatExt for Twhere
T: AsyncRead,
impl<T> TokioAsyncReadCompatExt for Twhere T: AsyncRead,
source§impl<T> TokioAsyncWriteCompatExt for Twhere
T: AsyncWrite,
impl<T> TokioAsyncWriteCompatExt for Twhere T: AsyncWrite,
source§fn compat_write(self) -> Compat<Self>where
Self: Sized,
fn compat_write(self) -> Compat<Self>where Self: Sized,
self with a compatibility layer that implements
futures_io::AsyncWrite.