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)
def test_no_supported_algo(self): acceptable = "minify" preferred = "minify" with pytest.raises(UnsupportedEncoding): select_algorithm(acceptable, preferred)
def test_fallback_to_identity(self): acceptable = "minify,identity" preferred = "minify" expected = "identity" assert select_algorithm(acceptable, preferred) == expected
def test_fallback_to_supported_algorithm(self): acceptable = "minify,gzip,identity" preferred = "minify" expected = "gzip" assert select_algorithm(acceptable, preferred) == expected
def test_preferred_algorithm_is_null(self): acceptable = "deflate,gzip,identity" preferred = None expected = "deflate" assert select_algorithm(acceptable, preferred) == expected
def test_preferred_algorithm_available(self, preferred): acceptable = "deflate,gzip,identity" expected = preferred assert select_algorithm(acceptable, preferred) == expected