由于自己用服务器做的 PyPi Mirror 崩了(一开始以为是 IP 被 Ban,后面发现原来是我在垃圾机子上跑 K3s Server 把服务器卡死了),我想起来之前看到的 Cloudflare 在推它自己的 Serverless Workers,于是看了看 Cloudflare 给出的样例和文档,自己写了一个 PyPi Mirror。
其实就是把之前 Nginx 反代的逻辑用 JavaScript 重新实现了一遍,用起来还是很爽的,自己用的话一个月最多也就千把次。反正以后应该是不用担心 PyPi Mirror 再崩了,如果再被封禁……大不了我用 Python 再写一版丢腾讯云或者阿里云的函数计算上。
addEventListener("fetch", (event) => {
event.respondWith(
handleRequest(event.request).catch(
(err) => new Response(err.stack, { status: 500 })
)
);
});
async function handleRequest(request) {
const { host, pathname } = new URL(request.url)
if (pathname.startsWith("/simple")) {
const resp = await fetch(`https://pypi.org${pathname}`)
const text = await resp.text()
const replace_re = /:\/\/files.pythonhosted.org\//g
const replace_target = `://${host}/`
return new Response(
text.replace(replace_re, replace_target),
{
headers: resp.headers,
}
)
}
if (pathname.startsWith("/packages")) {
let response = await fetch(`https://files.pythonhosted.org${pathname}`)
let { readable, writable } = new TransformStream()
response.body.pipeTo(writable)
return new Response(readable, response)
}
return new Response(
`This is a <a href="https://pypi.org/simple/">PyPi</a> mirror that created by <a href="https://github.com/abersheeran">Aber</a>.`,
{
headers: { "Content-Type": "text/html" },
status: 404,
}
)
}