Skip to content

Commit 17f374a

Browse files
authored
eclipse-che#6251 handle partial WebSocket messages (eclipse-che#6622)
Signed-off-by: Yevhen Vydolob <evidolob@codenvy.com>
1 parent f65836a commit 17f374a

1 file changed

Lines changed: 16 additions & 0 deletions

File tree

core/che-core-api-core/src/main/java/org/eclipse/che/api/core/websocket/impl/BasicWebSocketEndpoint.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import java.util.HashMap;
1818
import java.util.Map;
1919
import java.util.Optional;
20+
import java.util.concurrent.ConcurrentHashMap;
2021
import javax.websocket.CloseReason;
2122
import javax.websocket.OnClose;
2223
import javax.websocket.OnError;
@@ -39,6 +40,7 @@ public abstract class BasicWebSocketEndpoint {
3940
private final MessagesReSender reSender;
4041
private final WebSocketMessageReceiver receiver;
4142
private final WebsocketIdService identificationService;
43+
private final Map<Session, StringBuffer> sessionMessagesBuffer = new ConcurrentHashMap<>();
4244

4345
public BasicWebSocketEndpoint(
4446
WebSocketSessionRegistry registry,
@@ -63,9 +65,22 @@ public void onOpen(Session session) {
6365

6466
registry.add(combinedEndpointId, session);
6567
reSender.resend(combinedEndpointId);
68+
sessionMessagesBuffer.put(session, new StringBuffer());
6669
}
6770

6871
@OnMessage
72+
public void onMessage(String messagePart, boolean last, Session session) {
73+
StringBuffer buffer = sessionMessagesBuffer.get(session);
74+
buffer.append(messagePart);
75+
if (last) {
76+
try {
77+
onMessage(buffer.toString(), session);
78+
} finally {
79+
buffer.setLength(0);
80+
}
81+
}
82+
}
83+
6984
public void onMessage(String message, Session session) {
7085
Optional<String> endpointIdOptional = registry.get(session);
7186

@@ -98,6 +113,7 @@ public void onClose(CloseReason closeReason, Session session) {
98113
LOG.debug("Close reason: {}:{}", closeReason.getReasonPhrase(), closeReason.getCloseCode());
99114

100115
registry.remove(combinedEndpointId);
116+
sessionMessagesBuffer.remove(session);
101117
} else {
102118
LOG.warn("Closing unidentified session");
103119
}

0 commit comments

Comments
 (0)