python实现简单http echo服务器

25 阅读1分钟

最近要做一个代理服务,需要测试代理功能,想快速启动一个可以原路返回请求信息的服务,这里记录一下,方便下次使用。

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"