Intercept the HTTP request and return an HTTP response if needed.

        ``request_headers`` is a :class:`~websockets.http.Headers` instance.

        If this method returns ``None``, the WebSocket handshake continues.
        If it returns a status code, headers and a response body, that HTTP
        response is sent and the connection is closed.

        The HTTP status must be a :class:`~http.HTTPStatus`.

        HTTP headers must be a :class:`~websockets.http.Headers` instance, a
        :class:`~collections.abc.Mapping`, or an iterable of ``(name, value)``
        pairs.

        The HTTP response body must be :class:`bytes`. It may be empty.

        This method may be overridden to check the request headers and set a
        different status, for example to authenticate the request and return
        ``HTTPStatus.UNAUTHORIZED`` or ``HTTPStatus.FORBIDDEN``.

        It can be declared as a function or as a coroutine because such
        authentication checks are likely to require network requests.

        It may also be overridden by passing a ``process_request`` argument to
        the :class:`WebSocketServerProtocol` constructor or the :func:`serve`
        function.

def process_request(
        self, path: str, request_headers: Headers
    ) -> Union[Optional[HTTPResponse], Awaitable[Optional[HTTPResponse]]]:
        """
        Intercept the HTTP request and return an HTTP response if needed.

        ``request_headers`` is a :class:`~websockets.http.Headers` instance.

        If this method returns ``None``, the WebSocket handshake continues.
        If it returns a status code, headers and a response body, that HTTP
        response is sent and the connection is closed.

        The HTTP status must be a :class:`~http.HTTPStatus`.

        HTTP headers must be a :class:`~websockets.http.Headers` instance, a
        :class:`~collections.abc.Mapping`, or an iterable of ``(name, value)``
        pairs.

        The HTTP response body must be :class:`bytes`. It may be empty.

        This method may be overridden to check the request headers and set a
        different status, for example to authenticate the request and return
        ``HTTPStatus.UNAUTHORIZED`` or ``HTTPStatus.FORBIDDEN``.

        It can be declared as a function or as a coroutine because such
        authentication checks are likely to require network requests.

        It may also be overridden by passing a ``process_request`` argument to
        the :class:`WebSocketServerProtocol` constructor or the :func:`serve`
        function.

        """
        if self._process_request is not None:
            return self._process_request(path, request_headers)
        return None