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
"""
    Proxy server implementation which uses the localstack.http.proxy module.
    These server instances can be spawned easily, while implementing HTTP/HTTPS multiplexing (if enabled),
    and just forward all incoming requests to a backend.
    """
    def __init__(self, forward_base_url: str, port: int, bind_address: str, use_ssl: bool = False):
        """
        Creates a new ProxyServer instance.
        :param forward_base_url: URL of the backend system all requests this server receives should be forwarded to
        :param port: defining the port of this server instance
        :param bind_address: to bind this server instance to. Can be a host string or a list of host strings.
        :param use_ssl: True if the LocalStack cert should be loaded and HTTP/HTTPS multiplexing should be enabled.
        """
        gateway = Gateway()
        gateway.request_handlers.append(ProxyHandler(forward_base_url=forward_base_url))
        super().__init__(gateway, port, bind_address, use_ssl)