예제 #1
0
    def request_received(self, event):
        """ Receive a GRPC request and pass it to the GrpcServer to fire any
        appropriate entrypoint.

        Establish a `ReceiveStream` to receive the request payload and `SendStream`
        for sending the eventual response.
        """
        super().request_received(event)

        stream_id = event.stream_id

        request_stream = ReceiveStream(stream_id)
        response_stream = SendStream(stream_id)
        self.receive_streams[stream_id] = request_stream
        self.send_streams[stream_id] = response_stream

        request_stream.headers.set(*event.headers, from_wire=True)

        compression = select_algorithm(
            request_stream.headers.get("grpc-accept-encoding"),
            request_stream.headers.get("grpc-encoding"),
        )

        try:
            response_stream.headers.set(
                (":status", "200"),
                ("content-type", "application/grpc+proto"),
                ("grpc-accept-encoding", ",".join(SUPPORTED_ENCODINGS)),
                # TODO support server changing compression later
                ("grpc-encoding", compression),
            )
            response_stream.trailers.set(("grpc-status", "0"))
            self.handle_request(request_stream, response_stream)

        except GrpcError as error:
            response_stream.trailers.set((":status", "200"),
                                         *error.as_headers())
            self.end_stream(stream_id)
예제 #2
0
 def test_no_supported_algo(self):
     acceptable = "minify"
     preferred = "minify"
     with pytest.raises(UnsupportedEncoding):
         select_algorithm(acceptable, preferred)
예제 #3
0
 def test_fallback_to_identity(self):
     acceptable = "minify,identity"
     preferred = "minify"
     expected = "identity"
     assert select_algorithm(acceptable, preferred) == expected
예제 #4
0
 def test_fallback_to_supported_algorithm(self):
     acceptable = "minify,gzip,identity"
     preferred = "minify"
     expected = "gzip"
     assert select_algorithm(acceptable, preferred) == expected
예제 #5
0
 def test_preferred_algorithm_is_null(self):
     acceptable = "deflate,gzip,identity"
     preferred = None
     expected = "deflate"
     assert select_algorithm(acceptable, preferred) == expected
예제 #6
0
 def test_preferred_algorithm_available(self, preferred):
     acceptable = "deflate,gzip,identity"
     expected = preferred
     assert select_algorithm(acceptable, preferred) == expected