mirror of https://github.com/hunshcn/gh-proxy
hunshnet
5 years ago
5 changed files with 155 additions and 9 deletions
@ -0,0 +1,27 @@ |
|||||||
|
FROM tiangolo/uwsgi-nginx:python3.7 |
||||||
|
|
||||||
|
LABEL maintainer="Sebastian Ramirez <tiangolo@gmail.com>" |
||||||
|
|
||||||
|
RUN pip install flask requests |
||||||
|
|
||||||
|
COPY ./app /app |
||||||
|
WORKDIR /app |
||||||
|
|
||||||
|
# Make /app/* available to be imported by Python globally to better support several use cases like Alembic migrations. |
||||||
|
ENV PYTHONPATH=/app |
||||||
|
|
||||||
|
# Move the base entrypoint to reuse it |
||||||
|
RUN mv /entrypoint.sh /uwsgi-nginx-entrypoint.sh |
||||||
|
# Copy the entrypoint that will generate Nginx additional configs |
||||||
|
COPY entrypoint.sh /entrypoint.sh |
||||||
|
RUN chmod +x /entrypoint.sh |
||||||
|
|
||||||
|
ENTRYPOINT ["/entrypoint.sh"] |
||||||
|
|
||||||
|
# Run the start script provided by the parent image tiangolo/uwsgi-nginx. |
||||||
|
# It will check for an /app/prestart.sh script (e.g. for migrations) |
||||||
|
# And then will start Supervisor, which in turn will start Nginx and uWSGI |
||||||
|
|
||||||
|
EXPOSE 80 |
||||||
|
|
||||||
|
CMD ["/start.sh"] |
@ -0,0 +1,69 @@ |
|||||||
|
# -*- coding: utf-8 -*- |
||||||
|
import re |
||||||
|
|
||||||
|
import requests |
||||||
|
from flask import Flask, Response, redirect, request |
||||||
|
|
||||||
|
# config |
||||||
|
# git使用cnpmjs镜像、分支文件使用jsDelivr镜像的开关,0为关闭,默认开启 |
||||||
|
jsdelivr = 1 |
||||||
|
cnpmjs = 1 |
||||||
|
HOST = '127.0.0.1' # 监听地址,建议监听本地然后由web服务器反代 |
||||||
|
PORT = 80 # 监听端口 |
||||||
|
ASSET_URL = 'https://hunshcn.github.io/gh-proxy' # 主页 |
||||||
|
|
||||||
|
app = Flask(__name__) |
||||||
|
app.debug = True |
||||||
|
CHUNK_SIZE = 1024 * 10 |
||||||
|
index_html = requests.get(ASSET_URL, timeout=10).text |
||||||
|
exp1 = re.compile(r'^(?:https?:\/\/)?github\.com\/.+?\/.+?\/(?:releases|archive)\/.*$') |
||||||
|
exp2 = re.compile(r'^(?:https?:\/\/)?github\.com\/.+?\/.+?\/(?:blob)\/.*$') |
||||||
|
exp3 = re.compile(r'^(?:https?:\/\/)?github\.com\/.+?\/.+?\/(?:info|git-upload-pack).*$') |
||||||
|
|
||||||
|
|
||||||
|
@app.route('/') |
||||||
|
def index(): |
||||||
|
if 'q' in request.args: |
||||||
|
return redirect('/' + request.args.get('q')) |
||||||
|
return index_html |
||||||
|
|
||||||
|
|
||||||
|
@app.route('/<path:u>') |
||||||
|
def proxy(u): |
||||||
|
u = u if u.startswith('http') else 'https://' + u |
||||||
|
u = u.replace(':/g', '://g', 1) # uwsgi会将//传递为/ |
||||||
|
if jsdelivr and exp2.match(u): |
||||||
|
u = u.replace('/blob/', '@').replace('github.com', 'cdn.jsdelivr.net/gh') |
||||||
|
return redirect(u) |
||||||
|
elif cnpmjs and exp3.match(u): |
||||||
|
u = u.replace('github.com', 'github.com.cnpmjs.org') + request.url.replace(request.base_url, '') |
||||||
|
return redirect(u) |
||||||
|
# elif exp1.match(u): |
||||||
|
else: |
||||||
|
headers = {} |
||||||
|
r_headers = {} |
||||||
|
for i in ['Range', 'User-Agent']: |
||||||
|
if i in request.headers: |
||||||
|
r_headers[i] = request.headers.get(i) |
||||||
|
try: |
||||||
|
r = requests.get(u, headers=r_headers, stream=True) |
||||||
|
for i in ['Content-Type']: |
||||||
|
if i in r.headers: |
||||||
|
headers[i] = r.headers.get(i) |
||||||
|
if r.status_code == 200: |
||||||
|
headers = dict(r.headers) |
||||||
|
|
||||||
|
def generate(): |
||||||
|
for chunk in r.iter_content(chunk_size=CHUNK_SIZE): |
||||||
|
yield chunk |
||||||
|
|
||||||
|
return Response(generate(), headers=headers, status=r.status_code) |
||||||
|
except Exception as e: |
||||||
|
headers['content-type'] = 'text/html; charset=UTF-8' |
||||||
|
return Response('server error' + str(e), status=500, headers=headers) |
||||||
|
# else: |
||||||
|
# return Response('Illegal input', status=403, mimetype='text/html; charset=UTF-8') |
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__': |
||||||
|
app.run(host=HOST, port=PORT) |
@ -0,0 +1,26 @@ |
|||||||
|
#! /usr/bin/env bash |
||||||
|
set -e |
||||||
|
|
||||||
|
/uwsgi-nginx-entrypoint.sh |
||||||
|
|
||||||
|
# Get the listen port for Nginx, default to 80 |
||||||
|
USE_LISTEN_PORT=${LISTEN_PORT:-80} |
||||||
|
|
||||||
|
if [ -f /app/nginx.conf ]; then |
||||||
|
cp /app/nginx.conf /etc/nginx/nginx.conf |
||||||
|
else |
||||||
|
content_server='server {\n' |
||||||
|
content_server=$content_server" listen ${USE_LISTEN_PORT};\n" |
||||||
|
content_server=$content_server' location / {\n' |
||||||
|
content_server=$content_server' try_files $uri @app;\n' |
||||||
|
content_server=$content_server' }\n' |
||||||
|
content_server=$content_server' location @app {\n' |
||||||
|
content_server=$content_server' include uwsgi_params;\n' |
||||||
|
content_server=$content_server' uwsgi_pass unix:///tmp/uwsgi.sock;\n' |
||||||
|
content_server=$content_server' }\n' |
||||||
|
content_server=$content_server'}\n' |
||||||
|
# Save generated server /etc/nginx/conf.d/nginx.conf |
||||||
|
printf "$content_server" > /etc/nginx/conf.d/nginx.conf |
||||||
|
fi |
||||||
|
|
||||||
|
exec "$@" |
Loading…
Reference in new issue