Skip to content

Commit a6e226f

Browse files
authored
Optimize the SSE delimiting of streamed messages (#112)
1 parent 854b39a commit a6e226f

File tree

3 files changed

+17
-20
lines changed

3 files changed

+17
-20
lines changed

src/include/grpc_transcoding/response_to_json_translator.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,12 +69,12 @@ struct JsonResponseTranslateOptions {
6969
// If set to true, newline "\n" is used to separate streaming messages.
7070
// If set to false, all streaming messages are treated as a JSON array and
7171
// separated by comma.
72-
bool stream_newline_delimited;
72+
bool stream_newline_delimited = false;
7373

7474
// If true, enforces Server-Sent Events (SSE) message framing (`data: <message>\n\n`)
7575
// and, `stream_newline_delimited` is ignored.
7676
// If false, message framing is determined by `stream_newline_delimited`.
77-
bool stream_sse_style_delimited;
77+
bool stream_sse_style_delimited = false;
7878
};
7979

8080
class ResponseToJsonTranslator : public MessageStream {

src/response_to_json_translator.cc

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -128,19 +128,10 @@ bool ResponseToJsonTranslator::TranslateMessage(
128128
::google::protobuf::io::StringOutputStream json_stream(json_out);
129129

130130
if (streaming_ && options_.stream_sse_style_delimited) {
131-
if (first_) {
132-
if (!WriteString(&json_stream, "data: ")) {
133-
status_ = absl::Status(absl::StatusCode::kInternal,
134-
"Failed to build the response message.");
135-
return false;
136-
}
137-
first_ = false;
138-
} else {
139-
if (!WriteString(&json_stream, "\n\ndata: ")) {
140-
status_ = absl::Status(absl::StatusCode::kInternal,
141-
"Failed to build the response message.");
142-
return false;
143-
}
131+
if (!WriteString(&json_stream, "data: ")) {
132+
status_ = absl::Status(absl::StatusCode::kInternal,
133+
"Failed to build the response message.");
134+
return false;
144135
}
145136
} else if (streaming_ && !options_.stream_newline_delimited) {
146137
if (first_) {
@@ -174,7 +165,13 @@ bool ResponseToJsonTranslator::TranslateMessage(
174165
}
175166

176167
// Append a newline delimiter after the message if needed.
177-
if (streaming_ && options_.stream_newline_delimited && !options_.stream_sse_style_delimited) {
168+
if (streaming_ && options_.stream_sse_style_delimited) {
169+
if (!WriteString(&json_stream, "\n\n")) {
170+
status_ = absl::Status(absl::StatusCode::kInternal,
171+
"Failed to build the response message.");
172+
return false;
173+
}
174+
} else if (streaming_ && options_.stream_newline_delimited) {
178175
if (!WriteChar(&json_stream, '\n')) {
179176
status_ = absl::Status(absl::StatusCode::kInternal,
180177
"Failed to build the response message.");

test/response_to_json_translator_test.cc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -944,7 +944,7 @@ TEST_F(ResponseToJsonTranslatorTest, StreamingSSEStyleDelimitedDirectTest) {
944944

945945
// Now we should have the test_message1 translated
946946
EXPECT_TRUE(translator.NextMessage(&message));
947-
EXPECT_EQ("data: {\"name\":\"1\",\"theme\":\"Fiction\"}", message);
947+
EXPECT_EQ("data: {\"name\":\"1\",\"theme\":\"Fiction\"}\n\n", message);
948948

949949
// No more messages, but not finished yet
950950
EXPECT_FALSE(translator.NextMessage(&message));
@@ -957,10 +957,10 @@ TEST_F(ResponseToJsonTranslatorTest, StreamingSSEStyleDelimitedDirectTest) {
957957

958958
// Now we should have test_message2 & test_message3 translated
959959
EXPECT_TRUE(translator.NextMessage(&message));
960-
EXPECT_EQ("\n\ndata: {\"name\":\"2\",\"theme\":\"Fantasy\"}", message);
960+
EXPECT_EQ("data: {\"name\":\"2\",\"theme\":\"Fantasy\"}\n\n", message);
961961

962962
EXPECT_TRUE(translator.NextMessage(&message));
963-
EXPECT_EQ("\n\ndata: {\"name\":\"3\",\"theme\":\"Children\"}", message);
963+
EXPECT_EQ("data: {\"name\":\"3\",\"theme\":\"Children\"}\n\n", message);
964964

965965
// No more messages, but not finished yet
966966
EXPECT_FALSE(translator.NextMessage(&message));
@@ -971,7 +971,7 @@ TEST_F(ResponseToJsonTranslatorTest, StreamingSSEStyleDelimitedDirectTest) {
971971

972972
// Now we should have the test_message4 translated
973973
EXPECT_TRUE(translator.NextMessage(&message));
974-
EXPECT_EQ("\n\ndata: {\"name\":\"4\",\"theme\":\"Classics\"}", message);
974+
EXPECT_EQ("data: {\"name\":\"4\",\"theme\":\"Classics\"}\n\n", message);
975975

976976
// No more messages, but not finished yet
977977
EXPECT_FALSE(translator.NextMessage(&message));

0 commit comments

Comments
 (0)