HTTP response headers

I tested it with duplicate keys now. It iterates over both keys, but the lookup by key does not magically find the right values of course.

from socketserver import TCPServer, StreamRequestHandler
from threading import Thread
from http.client import HTTPConnection

def main():
    server = TCPServer(("localhost", 0), RequestHandler)
    thread = Thread(target=server.serve_forever)
    thread.start()
    try:
        demo_request(server, "Normal request", "GET", "/")
    finally:
        server.shutdown()
        server.server_close()

def demo_request(server, desc, *pos, **kw):
    client = HTTPConnection(*server.server_address)
    try:
        client.request("GET", "/drop-connection")
        response = client.getresponse()
        print("for name in response.headers:")
        for name in response.headers:
            print("    Header", name, response.headers[name])
        print("for name, value in response.headers.items():")
        for name, value in response.headers.items():
            print("    Header", name, value)
        response.read()
    finally:
        client.close()

class RequestHandler(StreamRequestHandler):
    def handle(self):
        assert self.rfile.readline().startswith(b"GET ")
        while self.rfile.readline().rstrip(b"\r\n"):
            pass
        self.wfile.write(
            b"HTTP/1.1 200 Dropping connection\r\n"
            b"Content-Length: 0\r\n"
            b"MyHeader: Hello\r\n"
            b"MyHeader: World\r\n"
            b"\r\n"
        )

if __name__ == "__main__":
    main()

(Based on this demo I found on bpo.)

for name in response.headers:
    Header Content-Length 0
    Header MyHeader Hello
    Header MyHeader Hello
for name, value in response.headers.items():
    Header Content-Length 0
    Header MyHeader Hello
    Header MyHeader World

(The “Hello” is repeated and the “World” is missing.)

1 Like