mirror of
https://github.com/spring-projects/spring-framework.git
synced 2026-09-17 16:39:29 +00:00
Always process SSE "data:" line
ServerSentEventHttpMessageReader now always processes "data:" lines, including empty lines, as per SSE spec. Closes gh-35412
This commit is contained in:
+2
-2
@@ -145,15 +145,15 @@ public class ServerSentEventHttpMessageReader implements HttpMessageReader<Objec
|
||||
|
||||
for (String line : lines) {
|
||||
if (line.startsWith("data:")) {
|
||||
data = (data != null ? data : new StringBuilder());
|
||||
int length = line.length();
|
||||
if (length > 5) {
|
||||
int index = (line.charAt(5) != ' ' ? 5 : 6);
|
||||
if (length > index) {
|
||||
data = (data != null ? data : new StringBuilder());
|
||||
data.append(line, index, line.length());
|
||||
data.append('\n');
|
||||
}
|
||||
}
|
||||
data.append('\n');
|
||||
}
|
||||
else if (shouldWrap) {
|
||||
if (line.startsWith("id:")) {
|
||||
|
||||
+17
-3
@@ -67,7 +67,9 @@ class ServerSentEventHttpMessageReaderTests extends AbstractLeakCheckingTests {
|
||||
MockServerHttpRequest request = MockServerHttpRequest.post("/")
|
||||
.body(Mono.just(stringBuffer(
|
||||
"id:c42\nevent:foo\nretry:123\n:bla\n:bla bla\n:bla bla bla\ndata:bar\n\n" +
|
||||
"id:c43\nevent:bar\nretry:456\ndata:baz\n\ndata:\n\ndata: \n\n")));
|
||||
"id:c43\nevent:bar\nretry:456\ndata:baz\n\n" +
|
||||
"data:\n\n" +
|
||||
"data: \n\n")));
|
||||
|
||||
Flux<ServerSentEvent> events = this.reader
|
||||
.read(ResolvableType.forClassWithGenerics(ServerSentEvent.class, String.class),
|
||||
@@ -78,8 +80,8 @@ class ServerSentEventHttpMessageReaderTests extends AbstractLeakCheckingTests {
|
||||
.retry(Duration.ofMillis(123)).comment("bla\nbla bla\nbla bla bla").data("bar").build())
|
||||
.expectNext(ServerSentEvent.builder().id("c43").event("bar")
|
||||
.retry(Duration.ofMillis(456)).data("baz").build())
|
||||
.consumeNextWith(event -> assertThat(event.data()).isNull())
|
||||
.consumeNextWith(event -> assertThat(event.data()).isNull())
|
||||
.consumeNextWith(event -> assertThat(event.data()).isEqualTo(""))
|
||||
.consumeNextWith(event -> assertThat(event.data()).isEqualTo(""))
|
||||
.expectComplete()
|
||||
.verify();
|
||||
}
|
||||
@@ -135,6 +137,18 @@ class ServerSentEventHttpMessageReaderTests extends AbstractLeakCheckingTests {
|
||||
.verify();
|
||||
}
|
||||
|
||||
@Test // gh-35412
|
||||
void emptyLines() {
|
||||
MockServerHttpRequest request = MockServerHttpRequest.post("/")
|
||||
.body(Mono.just(stringBuffer("id:1\nevent:message\ndata:\ndata:\ndata:\n\n")));
|
||||
|
||||
Flux<String> data = new ServerSentEventHttpMessageReader()
|
||||
.read(ResolvableType.forClass(String.class), request, Collections.emptyMap())
|
||||
.cast(String.class);
|
||||
|
||||
StepVerifier.create(data).expectNext("\n\n").verifyComplete();
|
||||
}
|
||||
|
||||
@Test
|
||||
void readPojo() {
|
||||
MockServerHttpRequest request = MockServerHttpRequest.post("/")
|
||||
|
||||
Reference in New Issue
Block a user