In #6778 we found that AWS forwards HTTP headers to Lambdas from clients without modifying their casing. Since users are relying on this behavior, it effectively renders a web server that lowercases headers unusable as proxy for localstack. In general, I think there is a case to be made that web servers should not manipulate the casing of request headers, so that they can function as application-layer proxy to backends that make assumptions about header casing.

The issue of header casing for HTTP/1.1 in hypercorn was addressed with https://github.com/pgjones/hypercorn/issues/66, but later reverted with https://github.com/pgjones/hypercorn/issues/77. Apparently the relevant ASGI spec is being discussed here https://github.com/django/asgiref/issues/246 where I think we should make that case.

If this is a fundamental limitation of ASGI and we cannot get this into hypercorn, then we will be forced to either
- apologize to lambda users and tell them that they need to re-write their lambda code in a way that treats headers in a case-insensitive way
- fork hypercorn and maintain our own version
- use another webserver that does not manipulate HTTP headers, or at least allows access to the raw headers in some way
def echo_request_headers(chain: HandlerChain, context: RequestContext, response: Response):
        response.set_json({"headers": [(k, v) for k, v in context.request.headers.items()]})
        chain.stop()
    gateway = Gateway()
    gateway.request_handlers.append(echo_request_headers)
    server = serve_gateway_hypercorn(gateway=gateway)
    response = requests.get(
        server.url,
        headers={
            "x-my-header": "value1",
            "Some-Title-Case-Header": "value2",
            "X-UPPER": "value3",
            "KEEPS__underscores_-": "value4",
        },
    )
    headers = response.json()["headers"]
    assert ["x-my-header", "value1"] in headers
    assert ["Some-Title-Case-Header", "value2"] in headers
    assert ["X-UPPER", "value3"] in headers
    assert ["KEEPS__underscores_-", "value4"] in headers