diff --git a/source/extensions/filters/http/grpc_json_transcoder/json_transcoder_filter.cc b/source/extensions/filters/http/grpc_json_transcoder/json_transcoder_filter.cc index fe6e3f90b3e40..3c15a46891aee 100644 --- a/source/extensions/filters/http/grpc_json_transcoder/json_transcoder_filter.cc +++ b/source/extensions/filters/http/grpc_json_transcoder/json_transcoder_filter.cc @@ -711,7 +711,7 @@ Http::FilterHeadersStatus JsonTranscoderFilter::encodeHeaders(Http::ResponseHead return Http::FilterHeadersStatus::Continue; } - if (per_route_config_->isStreamSSEStyleDelimited()) { + if (method_->descriptor_->server_streaming() && per_route_config_->isStreamSSEStyleDelimited()) { headers.setContentType(Http::Headers::get().ContentTypeValues.TextEventStream); } else { headers.setReferenceContentType(Http::Headers::get().ContentTypeValues.Json); diff --git a/test/extensions/filters/http/grpc_json_transcoder/json_transcoder_filter_test.cc b/test/extensions/filters/http/grpc_json_transcoder/json_transcoder_filter_test.cc index 25807762f5dad..7e1fcedfb033c 100644 --- a/test/extensions/filters/http/grpc_json_transcoder/json_transcoder_filter_test.cc +++ b/test/extensions/filters/http/grpc_json_transcoder/json_transcoder_filter_test.cc @@ -1395,6 +1395,30 @@ TEST_F(GrpcJsonTranscoderFilterTest, TranscodingStreamSSE) { } } +TEST_F(GrpcJsonTranscoderFilterTest, TranscodingStreamSSEUnary) { + envoy::extensions::filters::http::grpc_json_transcoder::v3::GrpcJsonTranscoder proto_config = + bookstoreProtoConfig(); + proto_config.mutable_print_options()->set_stream_newline_delimited(true); + proto_config.mutable_print_options()->set_stream_sse_style_delimited(true); + + auto config = std::make_shared(proto_config, *api_); + auto filter = JsonTranscoderFilter(config, stats_); + filter.setDecoderFilterCallbacks(decoder_callbacks_); + filter.setEncoderFilterCallbacks(encoder_callbacks_); + + Http::TestRequestHeaderMapImpl request_headers{{":method", "GET"}, + {":path", "/shelves/1/books:unary"}}; + + EXPECT_CALL(decoder_callbacks_.downstream_callbacks_, clearRouteCache()); + + EXPECT_EQ(Http::FilterHeadersStatus::Continue, filter.decodeHeaders(request_headers, false)); + Http::TestResponseHeaderMapImpl response_headers{{"content-type", "application/grpc"}, + {":status", "200"}}; + EXPECT_EQ(Http::FilterHeadersStatus::StopIteration, + filter.encodeHeaders(response_headers, false)); + EXPECT_EQ("application/json", response_headers.get_("content-type")); +} + // Streaming requests with HTTP bodies do not internally buffer any data. // The configured buffer limits will not apply. TEST_F(GrpcJsonTranscoderFilterTest, TranscodingStreamPostWithHttpBodyNoBuffer) {