Created
December 17, 2024 10:54
-
-
Save PriNova/f385d8690ca23726e393312f1ac841e9 to your computer and use it in GitHub Desktop.
A simple proxy server
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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