@@ -6,10 +6,12 @@ use deno_cache_dir::file_fetcher::SendResponse;
66use deno_cache_dir:: file_fetcher:: StatusCode ;
77use deno_error:: JsErrorBox ;
88use deno_npm_cache:: NpmCacheHttpClientResponse ;
9+ use js_sys:: Array ;
910use js_sys:: Object ;
1011use js_sys:: Reflect ;
1112use serde:: Deserialize ;
1213use url:: Url ;
14+ use wasm_bindgen:: JsCast ;
1315use wasm_bindgen:: JsValue ;
1416use wasm_bindgen:: prelude:: wasm_bindgen;
1517
@@ -200,20 +202,27 @@ fn parse_response(js_value: JsValue) -> Result<Response, JsValue> {
200202
201203fn 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 }
0 commit comments