@@ -472,7 +472,12 @@ export default {
472
472
} ) ;
473
473
}
474
474
} else {
475
- if ( fakePage ) url . hostname = 'hub.docker.com' ;
475
+ // 新增逻辑:/v1/ 路径特殊处理
476
+ if ( url . pathname . startsWith ( '/v1/' ) ) {
477
+ url . hostname = 'index.docker.io' ;
478
+ } else if ( fakePage ) {
479
+ url . hostname = 'hub.docker.com' ;
480
+ }
476
481
if ( url . searchParams . get ( 'q' ) ?. includes ( 'library/' ) && url . searchParams . get ( 'q' ) != 'library/' ) {
477
482
const search = url . searchParams . get ( 'q' ) ;
478
483
url . searchParams . set ( 'q' , search . replace ( 'library/' , '' ) ) ;
@@ -513,6 +518,76 @@ export default {
513
518
console . log ( `modified_url: ${ url . pathname } ` ) ;
514
519
}
515
520
521
+ // 新增:/v2/、/manifests/、/blobs/、/tags/ 先获取token再请求
522
+ if (
523
+ url . pathname . startsWith ( '/v2/' ) &&
524
+ (
525
+ url . pathname . includes ( '/manifests/' ) ||
526
+ url . pathname . includes ( '/blobs/' ) ||
527
+ url . pathname . includes ( '/tags/' )
528
+ || url . pathname . endsWith ( '/tags/list' )
529
+ )
530
+ ) {
531
+ // 提取镜像名
532
+ let repo = '' ;
533
+ const v2Match = url . pathname . match ( / ^ \/ v 2 \/ ( .+ ?) (?: \/ ( m a n i f e s t s | b l o b s | t a g s ) \/ ) / ) ;
534
+ if ( v2Match ) {
535
+ repo = v2Match [ 1 ] ;
536
+ }
537
+ if ( repo ) {
538
+ const tokenUrl = `${ auth_url } /token?service=registry.docker.io&scope=repository:${ repo } :pull` ;
539
+ const tokenRes = await fetch ( tokenUrl , {
540
+ headers : {
541
+ 'User-Agent' : getReqHeader ( "User-Agent" ) ,
542
+ 'Accept' : getReqHeader ( "Accept" ) ,
543
+ 'Accept-Language' : getReqHeader ( "Accept-Language" ) ,
544
+ 'Accept-Encoding' : getReqHeader ( "Accept-Encoding" ) ,
545
+ 'Connection' : 'keep-alive' ,
546
+ 'Cache-Control' : 'max-age=0'
547
+ }
548
+ } ) ;
549
+ const tokenData = await tokenRes . json ( ) ;
550
+ const token = tokenData . token ;
551
+ let parameter = {
552
+ headers : {
553
+ 'Host' : hub_host ,
554
+ 'User-Agent' : getReqHeader ( "User-Agent" ) ,
555
+ 'Accept' : getReqHeader ( "Accept" ) ,
556
+ 'Accept-Language' : getReqHeader ( "Accept-Language" ) ,
557
+ 'Accept-Encoding' : getReqHeader ( "Accept-Encoding" ) ,
558
+ 'Connection' : 'keep-alive' ,
559
+ 'Cache-Control' : 'max-age=0' ,
560
+ 'Authorization' : `Bearer ${ token } `
561
+ } ,
562
+ cacheTtl : 3600
563
+ } ;
564
+ if ( request . headers . has ( "X-Amz-Content-Sha256" ) ) {
565
+ parameter . headers [ 'X-Amz-Content-Sha256' ] = getReqHeader ( "X-Amz-Content-Sha256" ) ;
566
+ }
567
+ let original_response = await fetch ( new Request ( url , request ) , parameter ) ;
568
+ let original_response_clone = original_response . clone ( ) ;
569
+ let original_text = original_response_clone . body ;
570
+ let response_headers = original_response . headers ;
571
+ let new_response_headers = new Headers ( response_headers ) ;
572
+ let status = original_response . status ;
573
+ if ( new_response_headers . get ( "Www-Authenticate" ) ) {
574
+ let auth = new_response_headers . get ( "Www-Authenticate" ) ;
575
+ let re = new RegExp ( auth_url , 'g' ) ;
576
+ new_response_headers . set ( "Www-Authenticate" , response_headers . get ( "Www-Authenticate" ) . replace ( re , workers_url ) ) ;
577
+ }
578
+ if ( new_response_headers . get ( "Location" ) ) {
579
+ const location = new_response_headers . get ( "Location" ) ;
580
+ console . info ( `Found redirection location, redirecting to ${ location } ` ) ;
581
+ return httpHandler ( request , location , hub_host ) ;
582
+ }
583
+ let response = new Response ( original_text , {
584
+ status,
585
+ headers : new_response_headers
586
+ } ) ;
587
+ return response ;
588
+ }
589
+ }
590
+
516
591
// 构造请求参数
517
592
let parameter = {
518
593
headers : {
0 commit comments