最近要做一个代理服务,需要测试代理功能,想快速启动一个可以原路返回请求信息的服务,这里记录一下,方便下次使用。
python3 代码
#!/usr/bin/env python3
from http.server import BaseHTTPRequestHandler, HTTPServer
class EchoHandler(BaseHTTPRequestHandler):
def _dump_request(self):
# Request line
lines = []
lines.append(f"Method: {self.command}")
lines.append(f"Path: {self.path}")
lines.append(f"Protocol: {self.request_version}")
lines.append("")
lines.append("Headers:")
for k, v in self.headers.items():
lines.append(f"{k}: {v}")
# Body
content_length = self.headers.get('Content-Length')
body = b""
if content_length:
length = int(content_length)
body = self.rfile.read(length)
lines.append("")
lines.append("Body:")
try:
lines.append(body.decode("utf-8", errors="replace"))
except Exception:
lines.append(repr(body))
return "\n".join(lines)
def do_GET(self):
self.handle_request()
def do_POST(self):
self.handle_request()
def do_PUT(self):
self.handle_request()
def do_DELETE(self):
self.handle_request()
def do_PATCH(self):
self.handle_request()
def handle_request(self):
resp = self._dump_request()
# Log to server stdout
print("=== Incoming request ===")
print(resp)
print("========================")
# Send response
self.send_response(200)
self.send_header("Content-Type", "text/plain; charset=utf-8")
self.end_headers()
self.wfile.write(resp.encode("utf-8"))
def run(host="0.0.0.0", port=8080):
server_address = (host, port)
httpd = HTTPServer(server_address, EchoHandler)
print(f"Serving HTTP echo on {host}:{port}")
httpd.serve_forever()
if __name__ == "__main__":
run()
运行
python3 echo_server.py
测试
curl -v http://127.0.0.1:8080/foo?x=1 \ -H "X-Test: hello" \ -d "hi body"