@@ -24,6 +24,7 @@ use deno_graph::source::LoaderChecksum;
24
24
use deno_path_util:: url_to_file_path;
25
25
use deno_runtime:: deno_permissions:: PermissionsContainer ;
26
26
use deno_runtime:: deno_web:: BlobStore ;
27
+ use http:: header;
27
28
use log:: debug;
28
29
use std:: borrow:: Cow ;
29
30
use std:: collections:: HashMap ;
@@ -181,6 +182,7 @@ pub enum FetchPermissionsOptionRef<'a> {
181
182
pub struct FetchOptions < ' a > {
182
183
pub specifier : & ' a ModuleSpecifier ,
183
184
pub permissions : FetchPermissionsOptionRef < ' a > ,
185
+ pub maybe_auth : Option < ( header:: HeaderName , header:: HeaderValue ) > ,
184
186
pub maybe_accept : Option < & ' a str > ,
185
187
pub maybe_cache_setting : Option < & ' a CacheSetting > ,
186
188
}
@@ -350,6 +352,7 @@ impl FileFetcher {
350
352
maybe_accept : Option < & str > ,
351
353
cache_setting : & CacheSetting ,
352
354
maybe_checksum : Option < & LoaderChecksum > ,
355
+ maybe_auth : Option < ( header:: HeaderName , header:: HeaderValue ) > ,
353
356
) -> Result < FileOrRedirect , AnyError > {
354
357
debug ! (
355
358
"FileFetcher::fetch_remote_no_follow - specifier: {}" ,
@@ -442,6 +445,7 @@ impl FileFetcher {
442
445
. as_ref ( )
443
446
. map ( |( _, etag) | etag. clone ( ) ) ,
444
447
maybe_auth_token : maybe_auth_token. clone ( ) ,
448
+ maybe_auth : maybe_auth. clone ( ) ,
445
449
maybe_progress_guard : maybe_progress_guard. as_ref ( ) ,
446
450
} )
447
451
. await ?
@@ -538,7 +542,18 @@ impl FileFetcher {
538
542
specifier : & ModuleSpecifier ,
539
543
) -> Result < File , AnyError > {
540
544
self
541
- . fetch_inner ( specifier, FetchPermissionsOptionRef :: AllowAll )
545
+ . fetch_inner ( specifier, None , FetchPermissionsOptionRef :: AllowAll )
546
+ . await
547
+ }
548
+
549
+ #[ inline( always) ]
550
+ pub async fn fetch_bypass_permissions_with_maybe_auth (
551
+ & self ,
552
+ specifier : & ModuleSpecifier ,
553
+ maybe_auth : Option < ( header:: HeaderName , header:: HeaderValue ) > ,
554
+ ) -> Result < File , AnyError > {
555
+ self
556
+ . fetch_inner ( specifier, maybe_auth, FetchPermissionsOptionRef :: AllowAll )
542
557
. await
543
558
}
544
559
@@ -552,6 +567,7 @@ impl FileFetcher {
552
567
self
553
568
. fetch_inner (
554
569
specifier,
570
+ None ,
555
571
FetchPermissionsOptionRef :: StaticContainer ( permissions) ,
556
572
)
557
573
. await
@@ -560,12 +576,14 @@ impl FileFetcher {
560
576
async fn fetch_inner (
561
577
& self ,
562
578
specifier : & ModuleSpecifier ,
579
+ maybe_auth : Option < ( header:: HeaderName , header:: HeaderValue ) > ,
563
580
permissions : FetchPermissionsOptionRef < ' _ > ,
564
581
) -> Result < File , AnyError > {
565
582
self
566
583
. fetch_with_options ( FetchOptions {
567
584
specifier,
568
585
permissions,
586
+ maybe_auth,
569
587
maybe_accept : None ,
570
588
maybe_cache_setting : None ,
571
589
} )
@@ -585,12 +603,14 @@ impl FileFetcher {
585
603
max_redirect : usize ,
586
604
) -> Result < File , AnyError > {
587
605
let mut specifier = Cow :: Borrowed ( options. specifier ) ;
606
+ let mut maybe_auth = options. maybe_auth . clone ( ) ;
588
607
for _ in 0 ..=max_redirect {
589
608
match self
590
609
. fetch_no_follow_with_options ( FetchNoFollowOptions {
591
610
fetch_options : FetchOptions {
592
611
specifier : & specifier,
593
612
permissions : options. permissions ,
613
+ maybe_auth : maybe_auth. clone ( ) ,
594
614
maybe_accept : options. maybe_accept ,
595
615
maybe_cache_setting : options. maybe_cache_setting ,
596
616
} ,
@@ -602,6 +622,10 @@ impl FileFetcher {
602
622
return Ok ( file) ;
603
623
}
604
624
FileOrRedirect :: Redirect ( redirect_specifier) => {
625
+ // If we were redirected to another origin, don't send the auth header anymore.
626
+ if redirect_specifier. origin ( ) != specifier. origin ( ) {
627
+ maybe_auth = None ;
628
+ }
605
629
specifier = Cow :: Owned ( redirect_specifier) ;
606
630
}
607
631
}
@@ -666,6 +690,7 @@ impl FileFetcher {
666
690
options. maybe_accept ,
667
691
options. maybe_cache_setting . unwrap_or ( & self . cache_setting ) ,
668
692
maybe_checksum,
693
+ options. maybe_auth ,
669
694
)
670
695
. await
671
696
}
@@ -756,6 +781,7 @@ mod tests {
756
781
FetchOptions {
757
782
specifier,
758
783
permissions : FetchPermissionsOptionRef :: AllowAll ,
784
+ maybe_auth : None ,
759
785
maybe_accept : None ,
760
786
maybe_cache_setting : Some ( & file_fetcher. cache_setting ) ,
761
787
} ,
@@ -1255,6 +1281,7 @@ mod tests {
1255
1281
FetchOptions {
1256
1282
specifier : & specifier,
1257
1283
permissions : FetchPermissionsOptionRef :: AllowAll ,
1284
+ maybe_auth : None ,
1258
1285
maybe_accept : None ,
1259
1286
maybe_cache_setting : Some ( & file_fetcher. cache_setting ) ,
1260
1287
} ,
@@ -1268,6 +1295,7 @@ mod tests {
1268
1295
FetchOptions {
1269
1296
specifier : & specifier,
1270
1297
permissions : FetchPermissionsOptionRef :: AllowAll ,
1298
+ maybe_auth : None ,
1271
1299
maybe_accept : None ,
1272
1300
maybe_cache_setting : Some ( & file_fetcher. cache_setting ) ,
1273
1301
} ,
0 commit comments