Function http_serve::streaming_body [−][src]
pub fn streaming_body<T>(req: &Request<T>) -> StreamingBodyBuilder
Expand description
Creates a response and streaming body writer for the given request.
The streaming body writer is currently Some(writer)
for GET
requests and
None
for HEAD
requests. In the future, streaming_body
may also support
conditional GET
requests.
use std::io::Write as _;
fn respond(req: Request<hyper::Body>) -> std::io::Result<Response<hyper::Body>> {
let (mut resp, stream) = http_serve::streaming_body(&req).build();
if let Some(mut w) = stream {
write!(&mut w, "hello world")?;
}
resp.headers_mut().insert(header::CONTENT_TYPE, HeaderValue::from_static("text/plain"));
Ok(resp)
}
The caller may also continue appending to stream
after returning the response to hyper
.
The response will end when stream
is dropped. The only disadvantage to writing to the stream
after the fact is that there’s no way to report mid-response errors other than abruptly closing
the TCP connection (BodyWriter::abort).
use std::io::Write as _;
fn respond(req: Request<hyper::Body>) -> std::io::Result<Response<hyper::Body>> {
let (mut resp, stream) = http_serve::streaming_body(&req).build();
if let Some(mut w) = stream {
tokio::spawn(async move {
for i in 0..10 {
tokio::time::sleep(std::time::Duration::from_secs(1)).await;
write!(&mut w, "write {}\n", i)?;
}
Ok::<_, std::io::Error>(())
});
}
resp.headers_mut().insert(header::CONTENT_TYPE, HeaderValue::from_static("text/plain"));
Ok(resp)
}