summaryrefslogtreecommitdiff
path: root/ext/fetch/fs_fetch_handler.rs
diff options
context:
space:
mode:
authorSean McArthur <sean@seanmonstar.com>2024-07-12 15:51:37 -0700
committerGitHub <noreply@github.com>2024-07-13 00:51:37 +0200
commitf6fd6619e708a515831f707438368d81b0c9aa56 (patch)
tree9c65c76613330a22c5a88c017752a9aa7e0951ac /ext/fetch/fs_fetch_handler.rs
parent2fca4f11fe22a5d49326b6bf5b3ef039403eb0df (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.rs18
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 |_| {