Skip to content

Commit 059ff30

Browse files
authored
Merge pull request #118 from Fengshi991/fix2
fix:群晖搜索和标签索引
2 parents b038e75 + ed3959b commit 059ff30

File tree

1 file changed

+76
-1
lines changed

1 file changed

+76
-1
lines changed

_worker.js

Lines changed: 76 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -472,7 +472,12 @@ export default {
472472
});
473473
}
474474
} 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+
}
476481
if (url.searchParams.get('q')?.includes('library/') && url.searchParams.get('q') != 'library/') {
477482
const search = url.searchParams.get('q');
478483
url.searchParams.set('q', search.replace('library/', ''));
@@ -513,6 +518,76 @@ export default {
513518
console.log(`modified_url: ${url.pathname}`);
514519
}
515520

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(/^\/v2\/(.+?)(?:\/(manifests|blobs|tags)\/)/);
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+
516591
// 构造请求参数
517592
let parameter = {
518593
headers: {

0 commit comments

Comments
 (0)