Struct rocket::response::stream::ReaderStream[][src]

pub struct ReaderStream<S: Stream> { /* fields omitted */ }
Expand description

An async reader that reads from a stream of async readers.

A ReaderStream can be constructed from any Stream of items of type T where T: AsyncRead, or from a single AsyncRead type using ReaderStream::one(). The AsyncRead implementation of ReaderStream progresses the stream forward, returning the contents of the inner readers. Thus, a ReaderStream can be thought of as a flattening of async readers.

ReaderStream is designed to be used as a building-block for stream-based responders by acting as the streamed_body of a Response, though it may also be used as a responder itself.

use std::io::Cursor;

use rocket::{Request, Response};
use rocket::futures::stream::{Stream, StreamExt};
use rocket::response::{self, Responder, stream::ReaderStream};
use rocket::http::ContentType;

struct MyStream<S>(S);

impl<'r, S: Stream<Item = String>> Responder<'r, 'r> for MyStream<S>
    where S: Send + 'r
{
    fn respond_to(self, _: &'r Request<'_>) -> response::Result<'r> {
        Response::build()
            .header(ContentType::Text)
            .streamed_body(ReaderStream::from(self.0.map(Cursor::new)))
            .ok()
    }
}

Responder

ReaderStream is a (potentially infinite) responder. No Content-Type is set. The body is unsized, and values are sent as soon as they are yielded by the internal stream.

Example

use rocket::response::stream::ReaderStream;
use rocket::futures::stream::{repeat, StreamExt};
use rocket::tokio::time::{self, Duration};
use rocket::tokio::fs::File;

// Stream the contents of `safe/path` followed by `another/safe/path`.
#[get("/reader/stream")]
fn stream() -> ReaderStream![File] {
    ReaderStream! {
        let paths = &["safe/path", "another/safe/path"];
        for path in paths {
            if let Ok(file) = File::open(path).await {
                yield file;
            }
        }
    }
}

// Stream the contents of the file `safe/path`. This is identical to
// returning `File` directly; Rocket responders stream and never buffer.
#[get("/reader/stream/one")]
async fn stream_one() -> std::io::Result<ReaderStream![File]> {
    let file = File::open("safe/path").await?;
    Ok(ReaderStream::one(file))
}

The syntax of ReaderStream! as an expression is identical to that of stream!.

Implementations

impl<R: Unpin> ReaderStream<One<R>>[src]

pub fn one(reader: R) -> Self[src]

Create a ReaderStream that yields exactly one reader, streaming the contents of the reader itself.

Example

Stream the bytes from a remote TCP connection:

use std::io;
use std::net::SocketAddr;

use rocket::tokio::net::TcpStream;
use rocket::response::stream::ReaderStream;

#[get("/stream")]
async fn stream() -> io::Result<ReaderStream![TcpStream]> {
    let addr = SocketAddr::from(([127, 0, 0, 1], 9999));
    let stream = TcpStream::connect(addr).await?;
    Ok(ReaderStream::one(stream))
}

Trait Implementations

impl<S: Stream> AsyncRead for ReaderStream<S> where
    S::Item: AsyncRead + Send
[src]

fn poll_read(
    self: Pin<&mut Self>,
    cx: &mut Context<'_>,
    buf: &mut ReadBuf<'_>
) -> Poll<Result<()>>
[src]

Attempts to read from the AsyncRead into buf. Read more

impl<S: Stream + Debug> Debug for ReaderStream<S> where
    S::Item: Debug
[src]

fn fmt(&self, f: &mut Formatter<'_>) -> Result[src]

Formats the value using the given formatter. Read more

impl<S: Stream> From<S> for ReaderStream<S>[src]

fn from(stream: S) -> Self[src]

Performs the conversion.

impl<'r, S: Stream> Responder<'r, 'r> for ReaderStream<S> where
    S: Send + 'r,
    S::Item: AsyncRead + Send
[src]

fn respond_to(self, _: &'r Request<'_>) -> Result<'r>[src]

Returns Ok if a Response could be generated successfully. Otherwise, returns an Err with a failing Status. Read more

impl<'__pin, S: Stream> Unpin for ReaderStream<S> where
    __Origin<'__pin, S>: Unpin
[src]

Auto Trait Implementations

impl<S> RefUnwindSafe for ReaderStream<S> where
    S: RefUnwindSafe,
    <S as Stream>::Item: RefUnwindSafe

impl<S> Send for ReaderStream<S> where
    S: Send,
    <S as Stream>::Item: Send

impl<S> Sync for ReaderStream<S> where
    S: Sync,
    <S as Stream>::Item: Sync

impl<S> UnwindSafe for ReaderStream<S> where
    S: UnwindSafe,
    <S as Stream>::Item: UnwindSafe

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

pub fn type_id(&self) -> TypeId[src]

Gets the TypeId of self. Read more

impl<R> AsyncReadExt for R where
    R: AsyncRead + ?Sized
[src]

fn chain<R>(self, next: R) -> Chain<Self, R> where
    R: AsyncRead
[src]

Creates a new AsyncRead instance that chains this stream with next. Read more

fn read(&'a mut self, buf: &'a mut [u8]) -> Read<'a, Self> where
    Self: Unpin
[src]

Pulls some bytes from this source into the specified buffer, returning how many bytes were read. Read more

fn read_buf<B>(&'a mut self, buf: &'a mut B) -> ReadBuf<'a, Self, B> where
    Self: Unpin,
    B: BufMut
[src]

Pulls some bytes from this source into the specified buffer, advancing the buffer’s internal cursor. Read more

fn read_exact(&'a mut self, buf: &'a mut [u8]) -> ReadExact<'a, Self> where
    Self: Unpin
[src]

Reads the exact number of bytes required to fill buf. Read more

fn read_u8(&'a mut self) -> ReadU8<&'a mut Self> where
    Self: Unpin
[src]

Reads an unsigned 8 bit integer from the underlying reader. Read more

fn read_i8(&'a mut self) -> ReadI8<&'a mut Self> where
    Self: Unpin
[src]

Reads a signed 8 bit integer from the underlying reader. Read more

fn read_u16(&'a mut self) -> ReadU16<&'a mut Self> where
    Self: Unpin
[src]

Reads an unsigned 16-bit integer in big-endian order from the underlying reader. Read more

fn read_i16(&'a mut self) -> ReadI16<&'a mut Self> where
    Self: Unpin
[src]

Reads a signed 16-bit integer in big-endian order from the underlying reader. Read more

fn read_u32(&'a mut self) -> ReadU32<&'a mut Self> where
    Self: Unpin
[src]

Reads an unsigned 32-bit integer in big-endian order from the underlying reader. Read more

fn read_i32(&'a mut self) -> ReadI32<&'a mut Self> where
    Self: Unpin
[src]

Reads a signed 32-bit integer in big-endian order from the underlying reader. Read more

fn read_u64(&'a mut self) -> ReadU64<&'a mut Self> where
    Self: Unpin
[src]

Reads an unsigned 64-bit integer in big-endian order from the underlying reader. Read more

fn read_i64(&'a mut self) -> ReadI64<&'a mut Self> where
    Self: Unpin
[src]

Reads an signed 64-bit integer in big-endian order from the underlying reader. Read more

fn read_u128(&'a mut self) -> ReadU128<&'a mut Self> where
    Self: Unpin
[src]

Reads an unsigned 128-bit integer in big-endian order from the underlying reader. Read more

fn read_i128(&'a mut self) -> ReadI128<&'a mut Self> where
    Self: Unpin
[src]

Reads an signed 128-bit integer in big-endian order from the underlying reader. Read more

fn read_u16_le(&'a mut self) -> ReadU16Le<&'a mut Self> where
    Self: Unpin
[src]

Reads an unsigned 16-bit integer in little-endian order from the underlying reader. Read more

fn read_i16_le(&'a mut self) -> ReadI16Le<&'a mut Self> where
    Self: Unpin
[src]

Reads a signed 16-bit integer in little-endian order from the underlying reader. Read more

fn read_u32_le(&'a mut self) -> ReadU32Le<&'a mut Self> where
    Self: Unpin
[src]

Reads an unsigned 32-bit integer in little-endian order from the underlying reader. Read more

fn read_i32_le(&'a mut self) -> ReadI32Le<&'a mut Self> where
    Self: Unpin
[src]

Reads a signed 32-bit integer in little-endian order from the underlying reader. Read more

fn read_u64_le(&'a mut self) -> ReadU64Le<&'a mut Self> where
    Self: Unpin
[src]

Reads an unsigned 64-bit integer in little-endian order from the underlying reader. Read more

fn read_i64_le(&'a mut self) -> ReadI64Le<&'a mut Self> where
    Self: Unpin
[src]

Reads an signed 64-bit integer in little-endian order from the underlying reader. Read more

fn read_u128_le(&'a mut self) -> ReadU128Le<&'a mut Self> where
    Self: Unpin
[src]

Reads an unsigned 128-bit integer in little-endian order from the underlying reader. Read more

fn read_i128_le(&'a mut self) -> ReadI128Le<&'a mut Self> where
    Self: Unpin
[src]

Reads an signed 128-bit integer in little-endian order from the underlying reader. Read more

fn read_to_end(
    &'a mut self,
    buf: &'a mut Vec<u8, Global>
) -> ReadToEnd<'a, Self> where
    Self: Unpin
[src]

Reads all bytes until EOF in this source, placing them into buf. Read more

fn read_to_string(&'a mut self, dst: &'a mut String) -> ReadToString<'a, Self> where
    Self: Unpin
[src]

Reads all bytes until EOF in this source, appending them to buf. Read more

fn take(self, limit: u64) -> Take<Self>[src]

Creates an adaptor which reads at most limit bytes from it. Read more

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

pub fn borrow(&self) -> &T[src]

Immutably borrows from an owned value. Read more

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

pub fn borrow_mut(&mut self) -> &mut T[src]

Mutably borrows from an owned value. Read more

impl<T> From<!> for T[src]

pub fn from(t: !) -> T[src]

Performs the conversion.

impl<T> From<T> for T[src]

pub fn from(t: T) -> T[src]

Performs the conversion.

impl<T> Instrument for T[src]

fn instrument(self, span: Span) -> Instrumented<Self>[src]

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more

fn in_current_span(self) -> Instrumented<Self>[src]

Instruments this type with the current Span, returning an Instrumented wrapper. Read more

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

pub fn into(self) -> U[src]

Performs the conversion.

impl<T> IntoCollection<T> for T

pub fn into_collection<A>(self) -> SmallVec<A> where
    A: Array<Item = T>, 

Converts self into a collection.

pub fn mapped<U, F, A>(self, f: F) -> SmallVec<A> where
    F: FnMut(T) -> U,
    A: Array<Item = U>, 

impl<T> Same<T> for T

type Output = T

Should always be Self

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

pub fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>[src]

Performs the conversion.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

pub fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>[src]

Performs the conversion.

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

pub fn vzip(self) -> V