欢迎访问宙启技术站
智能推送

使用BaseHTTPServer实现HTTP代理服务器

发布时间:2023-12-25 10:37:37

使用BaseHTTPServer模块可以轻松地实现一个HTTP代理服务器。下面是一个使用例子:

# 导入必要的模块
from http.server import BaseHTTPRequestHandler, HTTPServer
import urllib.request

# 定义代理服务器的地址和端口
proxy_address = "localhost"
proxy_port = 8080

# 创建一个自定义的请求处理类,继承自BaseHTTPRequestHandler
class ProxyHandler(BaseHTTPRequestHandler):
    
    # 处理GET请求方法
    def do_GET(self):
        # 构造目标URL
        url = self.path
        if self.headers.get('Host'):
            url = "http://" + self.headers.get('Host') + url

        # 发起实际的HTTP请求
        req = urllib.request.Request(url)
        req.add_header('Host', self.headers.get('Host'))
        req.add_header('User-Agent', self.headers.get('User-Agent'))
        req.add_header('Accept', self.headers.get('Accept'))
        req.add_header('Accept-Encoding', self.headers.get('Accept-Encoding'))
        req.add_header('Accept-Language', self.headers.get('Accept-Language'))
        req.add_header('Connection', 'close')
        
        try:
            response = urllib.request.urlopen(req)
            self.send_response(response.getcode())
            for header, value in response.headers.items():
                self.send_header(header, value)
            self.end_headers()
            self.wfile.write(response.read())
        except urllib.error.HTTPError as e:
            self.send_response(e.code)
            self.send_header('Content-Type', 'text/html')
            self.end_headers()
            self.wfile.write(e.read())

# 创建HTTP服务器实例,绑定代理地址和端口,同时使用自定义的请求处理类
httpd = HTTPServer((proxy_address, proxy_port), ProxyHandler)
print('Starting proxy server on {}:{}'.format(proxy_address, proxy_port))

# 启动HTTP服务器并保持监听
httpd.serve_forever()

这个例子中,我们创建了一个自定义的请求处理类ProxyHandler,它继承自BaseHTTPRequestHandler。在do_GET方法中,我们首先解析客户端发送的请求URL,然后构造目标URL。接着,我们通过urllib.request.urlopen()函数发起实际的HTTP请求,并将目标服务器返回的响应发送给客户端。

注意,在发送请求的过程中,也需要传递一些必要的请求头信息,如HostUser-AgentAccept-Encoding等。此外,如果目标服务器返回的响应是HTTPError,我们也需要将其返回给客户端。

最后,我们使用HTTPServer创建了一个HTTP服务器实例,并将代理服务器的地址和端口绑定。通过调用serve_forever方法启动HTTP服务器并保持监听。

使用这个代理服务器时,你可以将浏览器的代理设置为localhost:8080,从而将浏览器的HTTP请求通过代理服务器转发到目标服务器。你也可以根据实际需求,修改代理服务器的地址和端口,使其适应你的代理需求。