AberSheeran
Aber Sheeran

Cloudflare Workers 反代 PyPi

起笔自
共计 1532 个字符
落笔于

由于自己用服务器做的 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,
    }
  )
}
如果你觉得本文值得,不妨赏杯茶
Sentry 消息转发
没有下一篇