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
loop = asyncio.new_event_loop()
        return serve_asgi_app(
            ASGIAdapter(
                wsgi_app,
                event_loop=loop,
                lifespan_listener=lifespan_listener,
            ),
            event_loop=loop,
        )
    yield _create
@pytest.fixture()
def httpserver_echo_request_metadata():
    def httpserver_handler(request: WerkzeugRequest) -> Response:
        """
        Simple request handler that returns the incoming request metadata (method, path, url, headers).
        :param request: the incoming HTTP request
        :return: an HTTP response
        """
        response = Response()
        response.set_json(
            {
                "method": request.method,
                "path": request.path,
                "url": request.url,
                "headers": dict(Headers(request.headers)),
            }
        )
        return response
    return httpserver_handler