Struct http_serve::ChunkedReadFile
source · [−]pub struct ChunkedReadFile<D: 'static + Send + Buf + From<Vec<u8>> + From<&'static [u8]>, E: 'static + Send + Into<Box<dyn StdError + Send + Sync>> + From<Box<dyn StdError + Send + Sync>>> { /* private fields */ }
Expand description
HTTP entity created from a std::fs::File
which reads the file chunk-by-chunk within
a tokio::task::block_in_place
closure.
ChunkedReadFile
is cheap to clone and reuse for many requests.
Expects to be served from a tokio threadpool.
type BoxedError = Box<dyn std::error::Error + 'static + Send + Sync>;
async fn serve_dictionary(req: Request<Body>) -> Result<Response<Body>, BoxedError> {
let f = tokio::task::block_in_place::<_, Result<_, BoxedError>>(
move || {
let f = std::fs::File::open("/usr/share/dict/words")?;
let mut headers = http::header::HeaderMap::new();
headers.insert(header::CONTENT_TYPE, HeaderValue::from_static("text/plain"));
Ok(http_serve::ChunkedReadFile::new(f, headers)?)
},
)?;
Ok(http_serve::serve(f, &req))
}
Implementations
sourceimpl<D, E> ChunkedReadFile<D, E> where
D: 'static + Send + Sync + Buf + From<Vec<u8>> + From<&'static [u8]>,
E: 'static + Send + Sync + Into<Box<dyn StdError + Send + Sync>> + From<Box<dyn StdError + Send + Sync>>,
impl<D, E> ChunkedReadFile<D, E> where
D: 'static + Send + Sync + Buf + From<Vec<u8>> + From<&'static [u8]>,
E: 'static + Send + Sync + Into<Box<dyn StdError + Send + Sync>> + From<Box<dyn StdError + Send + Sync>>,
sourcepub fn new(file: File, headers: HeaderMap) -> Result<Self, Error>
pub fn new(file: File, headers: HeaderMap) -> Result<Self, Error>
Creates a new ChunkedReadFile.
read(2)
calls will be wrapped in tokio::task::block_in_place
calls so that they don’t
block the tokio reactor thread on local disk I/O. Note that std::fs::File::open
and
this constructor (specifically, its call to fstat(2)
) may also block, so they typically
should be wrapped in tokio::task::block_in_place
as well.
sourcepub fn new_with_metadata(
file: File,
metadata: &Metadata,
headers: HeaderMap
) -> Result<Self, Error>
pub fn new_with_metadata(
file: File,
metadata: &Metadata,
headers: HeaderMap
) -> Result<Self, Error>
Creates a new ChunkedReadFile, with presupplied metadata.
This is an optimization for the case where the caller has already called fstat(2)
.
Note that on Windows, this still may perform a blocking file operation, so it should
still be wrapped in tokio::task::block_in_place
.
Trait Implementations
sourceimpl<D: Clone + 'static + Send + Buf + From<Vec<u8>> + From<&'static [u8]>, E: Clone + 'static + Send + Into<Box<dyn StdError + Send + Sync>> + From<Box<dyn StdError + Send + Sync>>> Clone for ChunkedReadFile<D, E>
impl<D: Clone + 'static + Send + Buf + From<Vec<u8>> + From<&'static [u8]>, E: Clone + 'static + Send + Into<Box<dyn StdError + Send + Sync>> + From<Box<dyn StdError + Send + Sync>>> Clone for ChunkedReadFile<D, E>
sourcefn clone(&self) -> ChunkedReadFile<D, E>
fn clone(&self) -> ChunkedReadFile<D, E>
Returns a copy of the value. Read more
1.0.0 · sourcefn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from source
. Read more
sourceimpl<D, E> Entity for ChunkedReadFile<D, E> where
D: 'static + Send + Sync + Buf + From<Vec<u8>> + From<&'static [u8]>,
E: 'static + Send + Sync + Into<Box<dyn StdError + Send + Sync>> + From<Box<dyn StdError + Send + Sync>>,
impl<D, E> Entity for ChunkedReadFile<D, E> where
D: 'static + Send + Sync + Buf + From<Vec<u8>> + From<&'static [u8]>,
E: 'static + Send + Sync + Into<Box<dyn StdError + Send + Sync>> + From<Box<dyn StdError + Send + Sync>>,
type Error = E
sourcefn get_range(
&self,
range: Range<u64>
) -> Box<dyn Stream<Item = Result<Self::Data, Self::Error>> + Send + Sync>
fn get_range(
&self,
range: Range<u64>
) -> Box<dyn Stream<Item = Result<Self::Data, Self::Error>> + Send + Sync>
Gets the body bytes indicated by range
.
sourcefn add_headers(&self, h: &mut HeaderMap)
fn add_headers(&self, h: &mut HeaderMap)
Adds entity headers such as Content-Type
to the supplied Headers
object.
In particular, these headers are the “other representation header fields” described by RFC
7233 section 4.1; they should exclude
Content-Range
, Date
, Cache-Control
, ETag
, Expires
, Content-Location
, and Vary
. Read more
sourcefn etag(&self) -> Option<HeaderValue>
fn etag(&self) -> Option<HeaderValue>
Returns an etag for this entity, if available. Implementations are encouraged to provide a strong etag. RFC 7232 section 2.1 notes that only strong etags are usable for sub-range retrieval. Read more
sourcefn last_modified(&self) -> Option<SystemTime>
fn last_modified(&self) -> Option<SystemTime>
Returns the last modified time of this entity, if available.
Note that serve
may serve an earlier Last-Modified:
date than the one returned here if
this time is in the future, as required by RFC 7232 section
2.2.1. Read more
Auto Trait Implementations
impl<D, E> RefUnwindSafe for ChunkedReadFile<D, E> where
D: RefUnwindSafe,
E: RefUnwindSafe,
impl<D, E> Send for ChunkedReadFile<D, E>
impl<D, E> Sync for ChunkedReadFile<D, E> where
D: Sync,
E: Sync,
impl<D, E> Unpin for ChunkedReadFile<D, E> where
D: Unpin,
E: Unpin,
impl<D, E> UnwindSafe for ChunkedReadFile<D, E> where
D: UnwindSafe,
E: UnwindSafe,
Blanket Implementations
sourceimpl<T> BorrowMut<T> for T where
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
const: unstable · sourcefn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
sourceimpl<T> ToOwned for T where
T: Clone,
impl<T> ToOwned for T where
T: Clone,
type Owned = T
type Owned = T
The resulting type after obtaining ownership.
sourcefn clone_into(&self, target: &mut T)
fn clone_into(&self, target: &mut T)
toowned_clone_into
)Uses borrowed data to replace owned data, usually by cloning. Read more