Skip to content

Instantly share code, notes, and snippets.

@PriNova
Created December 17, 2024 10:54
Show Gist options
  • Select an option

  • Save PriNova/f385d8690ca23726e393312f1ac841e9 to your computer and use it in GitHub Desktop.

Select an option

Save PriNova/f385d8690ca23726e393312f1ac841e9 to your computer and use it in GitHub Desktop.
A simple proxy server
import http.server
import socketserver
import logging
import requests
import json
from urllib.parse import urlparse
PORT = 8000
class ProxyHandler(http.server.SimpleHTTPRequestHandler):
def do_GET(self):
self.proxy_request()
def do_POST(self):
self.proxy_request()
def proxy_request(self):
url = self.path
parsed_url = urlparse(url)
target_url = "https://api.venice.ai/api/v1/chat/completions"
# Log the request
self.log_request(url, target_url)
# Forward the request
try:
if parsed_url.scheme and parsed_url.netloc:
full_url = url
else:
full_url = target_url
self.send_proxy_request(full_url)
except Exception as e:
self.send_error(500, f"Error forwarding request: {e}")
def log_request(self, url, target_url):
# Log request method, headers, and data
logging.info(f"Request URL: {url}")
logging.info(f"Target URL: {target_url}")
logging.info(f"Request Method: {self.command}")
logging.info(f"Request Headers:\n{self.headers}")
if 'Content-Length' in self.headers:
content_length = int(self.headers['Content-Length'])
data = self.rfile.read(content_length)
try:
logging.info(f"Request Data:\n{json.dumps(json.loads(data.decode('utf-8')), indent=2)}")
except:
logging.info(f"Request Data:\n{data.decode('utf-8')}")
else:
logging.info("Request Data: None")
def send_proxy_request(self, url):
try:
# Forward the request to the target URL
if self.command == "GET":
response = requests.get(url, headers=dict(self.headers))
elif self.command == "POST":
content_length = int(self.headers['Content-Length'])
data = self.rfile.read(content_length)
response = requests.post(url, headers=dict(self.headers), data=data)
else:
self.send_error(501, f"Unsupported method: {self.command}")
return
# Send response back to client
self.send_response(response.status_code)
for key, value in response.headers.items():
self.send_header(key, value)
self.end_headers()
self.wfile.write(response.content)
except Exception as e:
self.send_error(500, f"Error forwarding request: {e}")
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
with socketserver.TCPServer(("", PORT), ProxyHandler) as httpd:
logging.info(f"Serving at port: {PORT}")
httpd.serve_forever()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment