diff options
author | Sean McArthur <sean@seanmonstar.com> | 2024-07-12 15:51:37 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-07-13 00:51:37 +0200 |
commit | f6fd6619e708a515831f707438368d81b0c9aa56 (patch) | |
tree | 9c65c76613330a22c5a88c017752a9aa7e0951ac /ext/fetch/fs_fetch_handler.rs | |
parent | 2fca4f11fe22a5d49326b6bf5b3ef039403eb0df (diff) |
refactor(fetch): reimplement fetch with hyper instead of reqwest (#24237)
This commit re-implements `ext/fetch` and all dependent crates
using `hyper` and `hyper-util`, instead of `reqwest`.
The reasoning is that we want to have greater control and access
to low level `hyper` APIs when implementing `fetch` API as well
as `node:http` module.
---------
Co-authored-by: Bartek IwaĆczuk <biwanczuk@gmail.com>
Diffstat (limited to 'ext/fetch/fs_fetch_handler.rs')
-rw-r--r-- | ext/fetch/fs_fetch_handler.rs | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/ext/fetch/fs_fetch_handler.rs b/ext/fetch/fs_fetch_handler.rs index 29bad5992..6f45ee664 100644 --- a/ext/fetch/fs_fetch_handler.rs +++ b/ext/fetch/fs_fetch_handler.rs @@ -7,10 +7,12 @@ use crate::FetchHandler; use deno_core::error::type_error; use deno_core::futures::FutureExt; use deno_core::futures::TryFutureExt; +use deno_core::futures::TryStreamExt; use deno_core::url::Url; use deno_core::CancelFuture; use deno_core::OpState; -use reqwest::StatusCode; +use http::StatusCode; +use http_body_util::BodyExt; use std::rc::Rc; use tokio_util::io::ReaderStream; @@ -23,19 +25,21 @@ impl FetchHandler for FsFetchHandler { fn fetch_file( &self, _state: &mut OpState, - url: Url, + url: &Url, ) -> (CancelableResponseFuture, Option<Rc<CancelHandle>>) { let cancel_handle = CancelHandle::new_rc(); + let path_result = url.to_file_path(); let response_fut = async move { - let path = url.to_file_path()?; + let path = path_result?; let file = tokio::fs::File::open(path).map_err(|_| ()).await?; - let stream = ReaderStream::new(file); - let body = reqwest::Body::wrap_stream(stream); + let stream = ReaderStream::new(file) + .map_ok(hyper::body::Frame::data) + .map_err(Into::into); + let body = http_body_util::StreamBody::new(stream).boxed(); let response = http::Response::builder() .status(StatusCode::OK) .body(body) - .map_err(|_| ())? - .into(); + .map_err(|_| ())?; Ok::<_, ()>(response) } .map_err(move |_| { |