Skip to content
This repository was archived by the owner on Mar 3, 2026. It is now read-only.

Commit 023d4e6

Browse files
committed
server-sent events, fix jooby-project#308
1 parent 839ee09 commit 023d4e6

File tree

54 files changed

+2957
-171
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+2957
-171
lines changed

coverage-report/pom.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -548,6 +548,13 @@
548548
<scope>test</scope>
549549
</dependency>
550550

551+
<dependency>
552+
<groupId>com.sun.jersey</groupId>
553+
<artifactId>jersey-client</artifactId>
554+
<version>1.19.1</version>
555+
<scope>test</scope>
556+
</dependency>
557+
551558
<dependency>
552559
<groupId>org.powermock</groupId>
553560
<artifactId>powermock-module-junit4</artifactId>
Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
package org.jooby.issues;
2+
3+
import static org.junit.Assert.assertEquals;
4+
5+
import java.nio.ByteBuffer;
6+
import java.nio.charset.StandardCharsets;
7+
import java.util.concurrent.TimeUnit;
8+
9+
import org.jooby.MediaType;
10+
import org.jooby.json.Jackson;
11+
import org.jooby.test.SseFeature;
12+
import org.junit.Test;
13+
14+
import com.google.common.collect.ImmutableMap;
15+
16+
import javaslang.control.Try;
17+
18+
public class Issue308 extends SseFeature {
19+
20+
{
21+
use(new Jackson());
22+
23+
sse("/sse", sse -> {
24+
sse.send("d1");
25+
sse.event("d2").name("e2").send();
26+
sse.event("d3").name("e3").id("i3").type("plain").send();
27+
sse.event("d4").name("e4").id("i4").retry(5000L).send();
28+
sse.event("d5").name("e5").id("i5").retry(1, TimeUnit.MINUTES).send().onSuccess(id -> {
29+
assertEquals("i5", id.get());
30+
Try.run(() -> sse.close());
31+
});
32+
}).produces(MediaType.plain);
33+
34+
sse("/sse-json-local", sse -> {
35+
sse.send(ImmutableMap.of("username", "bobby", "text", "Hi everyone."), MediaType.plain);
36+
sse.send(ImmutableMap.of("username", "bobby", "text", "Hi everyone."), "json")
37+
.onSuccess(value -> {
38+
Try.run(() -> sse.close());
39+
});
40+
});
41+
42+
sse("/sse-json-global", sse -> {
43+
sse.send(ImmutableMap.of("username", "bobby", "text", "Hi everyone."))
44+
.onSuccess(value -> {
45+
Try.run(() -> sse.close());
46+
});
47+
}).produces(MediaType.json);
48+
49+
sse("/sse-multiline", sse -> {
50+
sse.send("<html>\n<body>\n\n</body>\n</html>\n")
51+
.onSuccess(value -> {
52+
Try.run(() -> sse.close());
53+
});
54+
}).produces(MediaType.plain);
55+
56+
sse("/sse-bytebuffer", (req, sse) -> {
57+
boolean array = req.param("array").booleanValue(false);
58+
byte[] bytebuffer = "bytebuffer".getBytes(StandardCharsets.UTF_8);
59+
ByteBuffer buffer = array
60+
? ByteBuffer.wrap(bytebuffer)
61+
: ByteBuffer.allocateDirect(bytebuffer.length).put(bytebuffer);
62+
buffer.flip();
63+
sse.send(buffer)
64+
.onSuccess(value -> {
65+
Try.run(() -> sse.close());
66+
});
67+
}).produces(MediaType.plain);
68+
69+
sse("/sse-comment", sse -> {
70+
sse.keepAlive(10, TimeUnit.MILLISECONDS);
71+
sse.event("data").comment("this is a comment").send().onSuccess(value -> {
72+
Try.run(() -> sse.close());
73+
});
74+
}).produces(MediaType.plain);
75+
76+
sse("/sse-last-event-id", sse -> {
77+
sse.send(sse.lastEventId().get()).onSuccess(value -> {
78+
Try.run(() -> sse.close());
79+
});
80+
}).produces(MediaType.plain);
81+
82+
}
83+
84+
@Test
85+
public void sse() throws Exception {
86+
assertEquals("data:d1\n" +
87+
"\n" +
88+
"event:e2\n" +
89+
"data:d2\n" +
90+
"\n" +
91+
"id:i3\n" +
92+
"event:e3\n" +
93+
"data:d3\n" +
94+
"\n" +
95+
"id:i4\n" +
96+
"event:e4\n" +
97+
"retry:5000\n" +
98+
"data:d4\n" +
99+
"\n" +
100+
"id:i5\n" +
101+
"event:e5\n" +
102+
"retry:60000\n" +
103+
"data:d5\n" +
104+
"\n" +
105+
"", sse("/sse", 1));
106+
}
107+
108+
@Test
109+
public void ssejson() throws Exception {
110+
assertEquals("data:{username=bobby, text=Hi everyone.}\n\n" +
111+
"data:{\"username\":\"bobby\",\"text\":\"Hi everyone.\"}\n\n",
112+
sse("/sse-json-local", 1));
113+
assertEquals("data:{\"username\":\"bobby\",\"text\":\"Hi everyone.\"}\n\n",
114+
sse("/sse-json-global", 1));
115+
}
116+
117+
@Test
118+
public void sseml() throws Exception {
119+
assertEquals("data:<html>\n" +
120+
"data:<body>\n" +
121+
"data:</body>\n" +
122+
"data:</html>\n" +
123+
"\n", sse("/sse-multiline", 1));
124+
}
125+
126+
@Test
127+
public void bytebuffer() throws Exception {
128+
assertEquals("data:bytebuffer\n\n", sse("/sse-bytebuffer", 1));
129+
assertEquals("data:bytebuffer\n\n", sse("/sse-bytebuffer?array=true", 1));
130+
}
131+
132+
@Test
133+
public void comments() throws Exception {
134+
assertEquals(":this is a comment\n" +
135+
"data:data\n" +
136+
"\n" +
137+
"", sse("/sse-comment", 1));
138+
}
139+
140+
@Test
141+
public void lastEventId() throws Exception {
142+
assertEquals("data:1\n\n", sse("/sse-last-event-id", 1));
143+
}
144+
145+
}

coverage-report/src/test/java/org/jooby/ws/JsonOnWsFeature.java

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@
1515
import com.google.common.collect.ImmutableMap;
1616
import com.ning.http.client.AsyncHttpClient;
1717
import com.ning.http.client.AsyncHttpClientConfig;
18-
import com.ning.http.client.websocket.WebSocket;
19-
import com.ning.http.client.websocket.WebSocketTextListener;
20-
import com.ning.http.client.websocket.WebSocketUpgradeHandler;
18+
import com.ning.http.client.ws.WebSocket;
19+
import com.ning.http.client.ws.WebSocketTextListener;
20+
import com.ning.http.client.ws.WebSocketUpgradeHandler;
2121

2222
public class JsonOnWsFeature extends ServerFeature {
2323

@@ -53,10 +53,6 @@ public void json() throws Exception {
5353
.execute(new WebSocketUpgradeHandler.Builder().addWebSocketListener(
5454
new WebSocketTextListener() {
5555

56-
@Override
57-
public void onFragment(final String fragment, final boolean last) {
58-
}
59-
6056
@Override
6157
public void onMessage(final String message) {
6258
messages.add(message);

coverage-report/src/test/java/org/jooby/ws/OnBadRequestErrFeature.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,12 @@
1212

1313
import com.ning.http.client.AsyncHttpClient;
1414
import com.ning.http.client.AsyncHttpClientConfig;
15-
import com.ning.http.client.websocket.WebSocket;
16-
import com.ning.http.client.websocket.WebSocketListener;
17-
import com.ning.http.client.websocket.WebSocketUpgradeHandler;
15+
import com.ning.http.client.AsyncHttpClient;
16+
import com.ning.http.client.AsyncHttpClientConfig;
17+
import com.ning.http.client.ws.WebSocket;
18+
import com.ning.http.client.ws.WebSocketListener;
19+
import com.ning.http.client.ws.WebSocketTextListener;
20+
import com.ning.http.client.ws.WebSocketUpgradeHandler;
1821

1922
public class OnBadRequestErrFeature extends ServerFeature {
2023

coverage-report/src/test/java/org/jooby/ws/OnByteArrayMessageFeature.java

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,10 @@
1313

1414
import com.ning.http.client.AsyncHttpClient;
1515
import com.ning.http.client.AsyncHttpClientConfig;
16-
import com.ning.http.client.websocket.WebSocket;
17-
import com.ning.http.client.websocket.WebSocketByteListener;
18-
import com.ning.http.client.websocket.WebSocketUpgradeHandler;
16+
import com.ning.http.client.ws.WebSocket;
17+
import com.ning.http.client.ws.WebSocketByteListener;
18+
import com.ning.http.client.ws.WebSocketUpgradeHandler;
19+
1920

2021
public class OnByteArrayMessageFeature extends ServerFeature {
2122

@@ -54,10 +55,6 @@ public void sendBinaryMessage() throws Exception {
5455
.execute(new WebSocketUpgradeHandler.Builder().addWebSocketListener(
5556
new WebSocketByteListener() {
5657

57-
@Override
58-
public void onFragment(final byte[] fragment, final boolean last) {
59-
}
60-
6158
@Override
6259
public void onMessage(final byte[] message) {
6360
messages.add(message);

coverage-report/src/test/java/org/jooby/ws/OnByteBufferMessageFeature.java

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,10 @@
1414

1515
import com.ning.http.client.AsyncHttpClient;
1616
import com.ning.http.client.AsyncHttpClientConfig;
17-
import com.ning.http.client.websocket.WebSocket;
18-
import com.ning.http.client.websocket.WebSocketByteListener;
19-
import com.ning.http.client.websocket.WebSocketUpgradeHandler;
17+
import com.ning.http.client.ws.WebSocket;
18+
import com.ning.http.client.ws.WebSocketByteListener;
19+
import com.ning.http.client.ws.WebSocketUpgradeHandler;
20+
2021

2122
public class OnByteBufferMessageFeature extends ServerFeature {
2223

@@ -56,10 +57,6 @@ public void sendBinaryMessageBuffer() throws Exception {
5657
.execute(new WebSocketUpgradeHandler.Builder().addWebSocketListener(
5758
new WebSocketByteListener() {
5859

59-
@Override
60-
public void onFragment(final byte[] fragment, final boolean last) {
61-
}
62-
6360
@Override
6461
public void onMessage(final byte[] message) {
6562
messages.add(message);

coverage-report/src/test/java/org/jooby/ws/OnCheckedErrFeature.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,10 @@
1010

1111
import com.ning.http.client.AsyncHttpClient;
1212
import com.ning.http.client.AsyncHttpClientConfig;
13-
import com.ning.http.client.websocket.WebSocket;
14-
import com.ning.http.client.websocket.WebSocketListener;
15-
import com.ning.http.client.websocket.WebSocketUpgradeHandler;
13+
import com.ning.http.client.ws.WebSocket;
14+
import com.ning.http.client.ws.WebSocketListener;
15+
import com.ning.http.client.ws.WebSocketUpgradeHandler;
16+
1617

1718
public class OnCheckedErrFeature extends ServerFeature {
1819

coverage-report/src/test/java/org/jooby/ws/OnCloseFeature.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,10 @@
1313

1414
import com.ning.http.client.AsyncHttpClient;
1515
import com.ning.http.client.AsyncHttpClientConfig;
16-
import com.ning.http.client.websocket.WebSocket;
17-
import com.ning.http.client.websocket.WebSocketListener;
18-
import com.ning.http.client.websocket.WebSocketUpgradeHandler;
16+
import com.ning.http.client.ws.WebSocket;
17+
import com.ning.http.client.ws.WebSocketListener;
18+
import com.ning.http.client.ws.WebSocketUpgradeHandler;
19+
1920

2021
public class OnCloseFeature extends ServerFeature {
2122

coverage-report/src/test/java/org/jooby/ws/OnConnectFeature.java

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,10 @@
1414

1515
import com.ning.http.client.AsyncHttpClient;
1616
import com.ning.http.client.AsyncHttpClientConfig;
17-
import com.ning.http.client.websocket.WebSocket;
18-
import com.ning.http.client.websocket.WebSocketTextListener;
19-
import com.ning.http.client.websocket.WebSocketUpgradeHandler;
17+
import com.ning.http.client.ws.WebSocket;
18+
import com.ning.http.client.ws.WebSocketTextListener;
19+
import com.ning.http.client.ws.WebSocketUpgradeHandler;
20+
2021

2122
public class OnConnectFeature extends ServerFeature {
2223

@@ -53,10 +54,6 @@ public void connect() throws Exception {
5354
.execute(new WebSocketUpgradeHandler.Builder().addWebSocketListener(
5455
new WebSocketTextListener() {
5556

56-
@Override
57-
public void onFragment(final String fragment, final boolean last) {
58-
}
59-
6057
@Override
6158
public void onMessage(final String message) {
6259
messages.add(message);

coverage-report/src/test/java/org/jooby/ws/OnDirectByteBufferMessageFeature.java

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,10 @@
1414

1515
import com.ning.http.client.AsyncHttpClient;
1616
import com.ning.http.client.AsyncHttpClientConfig;
17-
import com.ning.http.client.websocket.WebSocket;
18-
import com.ning.http.client.websocket.WebSocketByteListener;
19-
import com.ning.http.client.websocket.WebSocketUpgradeHandler;
17+
import com.ning.http.client.ws.WebSocket;
18+
import com.ning.http.client.ws.WebSocketByteListener;
19+
import com.ning.http.client.ws.WebSocketUpgradeHandler;
20+
2021

2122
public class OnDirectByteBufferMessageFeature extends ServerFeature {
2223

@@ -58,10 +59,6 @@ public void sendBinaryMessageBufferDirect() throws Exception {
5859
.execute(new WebSocketUpgradeHandler.Builder().addWebSocketListener(
5960
new WebSocketByteListener() {
6061

61-
@Override
62-
public void onFragment(final byte[] fragment, final boolean last) {
63-
}
64-
6562
@Override
6663
public void onMessage(final byte[] message) {
6764
messages.add(message);

0 commit comments

Comments
 (0)