|
|
|
|
|
|
|
|
|
import logging |
|
import json |
|
from flask import Flask, request, Response |
|
import requests |
|
|
|
app = Flask(__name__) |
|
|
|
|
|
app.logger.setLevel(logging.INFO) |
|
|
|
@app.route('/', defaults={'path': ''}) |
|
@app.route('/<path:path>', methods=['GET', 'POST', 'PUT', 'PATCH', 'DELETE']) |
|
def relay_request(path): |
|
|
|
base_url = 'https://claude.ai' |
|
|
|
|
|
relay_url = base_url + '/' + path |
|
|
|
app.logger.info(request.headers) |
|
|
|
|
|
if request.headers.get('Content-Type') == 'text/event-stream': |
|
response = requests.request( |
|
method=request.method, |
|
url=relay_url, |
|
headers=request.headers, |
|
allow_redirects=False, |
|
stream=True |
|
) |
|
headers = [(name, value) for name, value in response.raw.headers.items()] |
|
|
|
def generate(): |
|
for chunk in response.iter_content(chunk_size=8192): |
|
yield chunk |
|
|
|
return Response(generate(), response.status_code, headers) |
|
|
|
|
|
headers = {k: v for k, v in request.headers.items() if k != 'X-Forwarded-For'} |
|
|
|
|
|
if 'application/json' in request.headers.get('Content-Type', ''): |
|
data = request.get_json() |
|
response = requests.request( |
|
method=request.method, |
|
url=relay_url, |
|
headers=headers, |
|
json=data, |
|
allow_redirects=False |
|
) |
|
else: |
|
response = requests.request( |
|
method=request.method, |
|
url=relay_url, |
|
headers=headers, |
|
data=request.data, |
|
allow_redirects=False |
|
) |
|
|
|
|
|
headers = [(name, value) for name, value in response.headers.items() if name != 'Transfer-Encoding'] |
|
return Response(response.content, response.status_code, headers) |
|
|
|
if __name__ == '__main__': |
|
app.run(host='0.0.0.0', port=7860) |
|
|