Skip to content

Commit afb4a00

Browse files
authored
fix: ensure headers are cached and loaded properly (#8)
1 parent 5cb2c22 commit afb4a00

File tree

3 files changed

+51
-11
lines changed

3 files changed

+51
-11
lines changed

src/rs_lib/http_client.rs

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,12 @@ use deno_cache_dir::file_fetcher::SendResponse;
66
use deno_cache_dir::file_fetcher::StatusCode;
77
use deno_error::JsErrorBox;
88
use deno_npm_cache::NpmCacheHttpClientResponse;
9+
use js_sys::Array;
910
use js_sys::Object;
1011
use js_sys::Reflect;
1112
use serde::Deserialize;
1213
use url::Url;
14+
use wasm_bindgen::JsCast;
1315
use wasm_bindgen::JsValue;
1416
use wasm_bindgen::prelude::wasm_bindgen;
1517

@@ -200,20 +202,27 @@ fn parse_response(js_value: JsValue) -> Result<Response, JsValue> {
200202

201203
fn response_headers_to_headermap(headers: JsValue) -> HeaderMap {
202204
let mut map = HeaderMap::new();
203-
204-
if !headers.is_object() {
205+
let entries_fn = Reflect::get(&headers, &JsValue::from_str("entries"));
206+
let Ok(entries_fn) = entries_fn else {
205207
return map;
206-
}
208+
};
207209

208-
let obj = Object::from(headers);
209-
let entries = Object::entries(&obj);
210+
let entries_iter = js_sys::Function::from(entries_fn)
211+
.call0(&headers)
212+
.ok()
213+
.and_then(|iter| iter.dyn_into::<js_sys::Iterator>().ok());
210214

211-
for i in 0..entries.length() {
212-
let entry = entries.get(i);
213-
if !entry.is_object() {
214-
continue;
215+
let Some(iter) = entries_iter else {
216+
return map;
217+
};
218+
219+
while let Ok(next) = iter.next() {
220+
if next.done() {
221+
break;
215222
}
216-
let pair = js_sys::Array::from(&entry);
223+
224+
let val = next.value();
225+
let pair = Array::from(&val);
217226
if pair.length() != 2 {
218227
continue;
219228
}

src/rs_lib/lib.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -566,7 +566,15 @@ impl DenoLoader {
566566
Cow::Borrowed(&transpile_and_emit_options.transpile)
567567
};
568568
let emit_options = EmitOptions {
569-
source_map_base: Some(self.workspace_factory.workspace_directory()?.workspace.root_dir().as_ref().clone()),
569+
source_map_base: Some(
570+
self
571+
.workspace_factory
572+
.workspace_directory()?
573+
.workspace
574+
.root_dir()
575+
.as_ref()
576+
.clone(),
577+
),
570578
..transpile_and_emit_options.emit.clone()
571579
};
572580
let transpiled_source = parsed_source
@@ -632,6 +640,7 @@ fn parse_entrypoint(
632640
) -> Result<Url, anyhow::Error> {
633641
if entrypoint.starts_with("jsr:")
634642
|| entrypoint.starts_with("https:")
643+
|| entrypoint.starts_with("http:")
635644
|| entrypoint.starts_with("file:")
636645
|| entrypoint.starts_with("npm:")
637646
{

tests/http_no_ext.test.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { assertResponseText, createLoader } from "./helpers.ts";
2+
3+
Deno.test("loads from http server", async () => {
4+
await using server = Deno.serve((_request) => {
5+
return new Response("console.log(1);", {
6+
headers: {
7+
"content-type": "application/javascript",
8+
},
9+
});
10+
});
11+
12+
const url = `http://localhost:${server.addr.port}/no-extension`;
13+
const { loader } = await createLoader({}, {
14+
entrypoints: [url],
15+
});
16+
17+
const response = await loader.load(url);
18+
assertResponseText(
19+
response,
20+
`console.log(1);`,
21+
);
22+
});

0 commit comments

Comments
 (0)