2024-01-01 14:58:21 -05:00
|
|
|
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
|
2021-11-01 00:29:46 -04:00
|
|
|
|
|
|
|
use crate::CancelHandle;
|
|
|
|
use crate::CancelableResponseFuture;
|
|
|
|
use crate::FetchHandler;
|
|
|
|
|
|
|
|
use deno_core::error::type_error;
|
|
|
|
use deno_core::futures::FutureExt;
|
|
|
|
use deno_core::futures::TryFutureExt;
|
2024-07-17 19:37:31 -04:00
|
|
|
use deno_core::futures::TryStreamExt;
|
2021-11-01 00:29:46 -04:00
|
|
|
use deno_core::url::Url;
|
|
|
|
use deno_core::CancelFuture;
|
2021-12-03 08:25:16 -05:00
|
|
|
use deno_core::OpState;
|
2024-07-17 19:37:31 -04:00
|
|
|
use http::StatusCode;
|
|
|
|
use http_body_util::BodyExt;
|
2021-11-01 00:29:46 -04:00
|
|
|
use std::rc::Rc;
|
|
|
|
use tokio_util::io::ReaderStream;
|
|
|
|
|
|
|
|
/// An implementation which tries to read file URLs from the file system via
|
|
|
|
/// tokio::fs.
|
|
|
|
#[derive(Clone)]
|
|
|
|
pub struct FsFetchHandler;
|
|
|
|
|
|
|
|
impl FetchHandler for FsFetchHandler {
|
|
|
|
fn fetch_file(
|
2021-12-03 08:25:16 -05:00
|
|
|
&self,
|
|
|
|
_state: &mut OpState,
|
2024-07-17 19:37:31 -04:00
|
|
|
url: &Url,
|
2023-08-09 12:47:47 -04:00
|
|
|
) -> (CancelableResponseFuture, Option<Rc<CancelHandle>>) {
|
2021-11-01 00:29:46 -04:00
|
|
|
let cancel_handle = CancelHandle::new_rc();
|
2024-07-17 19:37:31 -04:00
|
|
|
let path_result = url.to_file_path();
|
2021-11-01 00:29:46 -04:00
|
|
|
let response_fut = async move {
|
2024-07-17 19:37:31 -04:00
|
|
|
let path = path_result?;
|
2021-11-01 00:29:46 -04:00
|
|
|
let file = tokio::fs::File::open(path).map_err(|_| ()).await?;
|
2024-07-17 19:37:31 -04:00
|
|
|
let stream = ReaderStream::new(file)
|
|
|
|
.map_ok(hyper::body::Frame::data)
|
|
|
|
.map_err(Into::into);
|
|
|
|
let body = http_body_util::StreamBody::new(stream).boxed();
|
2024-07-01 20:09:47 -04:00
|
|
|
let response = http::Response::builder()
|
2021-11-01 00:29:46 -04:00
|
|
|
.status(StatusCode::OK)
|
|
|
|
.body(body)
|
2024-07-17 19:37:31 -04:00
|
|
|
.map_err(|_| ())?;
|
2021-11-01 00:29:46 -04:00
|
|
|
Ok::<_, ()>(response)
|
|
|
|
}
|
|
|
|
.map_err(move |_| {
|
2024-09-04 03:05:29 -04:00
|
|
|
type_error("NetworkError when attempting to fetch resource")
|
2021-11-01 00:29:46 -04:00
|
|
|
})
|
|
|
|
.or_cancel(&cancel_handle)
|
|
|
|
.boxed_local();
|
|
|
|
|
2023-08-09 12:47:47 -04:00
|
|
|
(response_fut, Some(cancel_handle))
|
2021-11-01 00:29:46 -04:00
|
|
|
}
|
|
|
|
}
|