Skip to content

Commit 1c1e114

Browse files
committed
Allow configuring WebSocket message size in a session
Issue: SPR-11575
1 parent 5caf36a commit 1c1e114

File tree

9 files changed

+182
-1
lines changed

9 files changed

+182
-1
lines changed

spring-websocket/src/main/java/org/springframework/web/socket/WebSocketSession.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,26 @@ public interface WebSocketSession {
8383
*/
8484
String getAcceptedProtocol();
8585

86+
/**
87+
* Configure the maximum size for an incoming text message.
88+
*/
89+
void setTextMessageSizeLimit(int messageSizeLimit);
90+
91+
/**
92+
* Get the configured maximum size for an incoming text message.
93+
*/
94+
int getTextMessageSizeLimit();
95+
96+
/**
97+
* Configure the maximum size for an incoming binary message.
98+
*/
99+
void setBinaryMessageSizeLimit(int messageSizeLimit);
100+
101+
/**
102+
* Get the configured maximum size for an incoming binary message.
103+
*/
104+
int getBinaryMessageSizeLimit();
105+
86106
/**
87107
* Return the negotiated extensions or {@code null} if none was specified or
88108
* negotiated successfully.

spring-websocket/src/main/java/org/springframework/web/socket/adapter/jetty/JettyWebSocketSession.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,30 @@ public String getAcceptedProtocol() {
126126
return getNativeSession().getUpgradeResponse().getAcceptedSubProtocol();
127127
}
128128

129+
@Override
130+
public void setTextMessageSizeLimit(int messageSizeLimit) {
131+
checkNativeSessionInitialized();
132+
getNativeSession().getPolicy().setMaxTextMessageSize(messageSizeLimit);
133+
}
134+
135+
@Override
136+
public int getTextMessageSizeLimit() {
137+
checkNativeSessionInitialized();
138+
return getNativeSession().getPolicy().getMaxTextMessageSize();
139+
}
140+
141+
@Override
142+
public void setBinaryMessageSizeLimit(int messageSizeLimit) {
143+
checkNativeSessionInitialized();
144+
getNativeSession().getPolicy().setMaxBinaryMessageSize(messageSizeLimit);
145+
}
146+
147+
@Override
148+
public int getBinaryMessageSizeLimit() {
149+
checkNativeSessionInitialized();
150+
return getNativeSession().getPolicy().getMaxBinaryMessageSize();
151+
}
152+
129153
@Override
130154
public List<WebSocketExtension> getExtensions() {
131155
checkNativeSessionInitialized();

spring-websocket/src/main/java/org/springframework/web/socket/adapter/standard/StandardWebSocketSession.java

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2013 the original author or authors.
2+
* Copyright 2002-2014 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -140,6 +140,30 @@ public String getAcceptedProtocol() {
140140
return StringUtils.isEmpty(protocol)? null : protocol;
141141
}
142142

143+
@Override
144+
public void setTextMessageSizeLimit(int messageSizeLimit) {
145+
checkNativeSessionInitialized();
146+
getNativeSession().setMaxTextMessageBufferSize(messageSizeLimit);
147+
}
148+
149+
@Override
150+
public int getTextMessageSizeLimit() {
151+
checkNativeSessionInitialized();
152+
return getNativeSession().getMaxTextMessageBufferSize();
153+
}
154+
155+
@Override
156+
public void setBinaryMessageSizeLimit(int messageSizeLimit) {
157+
checkNativeSessionInitialized();
158+
getNativeSession().setMaxBinaryMessageBufferSize(messageSizeLimit);
159+
}
160+
161+
@Override
162+
public int getBinaryMessageSizeLimit() {
163+
checkNativeSessionInitialized();
164+
return getNativeSession().getMaxBinaryMessageBufferSize();
165+
}
166+
143167
@Override
144168
public List<WebSocketExtension> getExtensions() {
145169
checkNativeSessionInitialized();

spring-websocket/src/main/java/org/springframework/web/socket/handler/WebSocketSessionDecorator.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,26 @@ public List<WebSocketExtension> getExtensions() {
118118
return this.delegate.getExtensions();
119119
}
120120

121+
@Override
122+
public void setTextMessageSizeLimit(int messageSizeLimit) {
123+
this.delegate.setTextMessageSizeLimit(messageSizeLimit);
124+
}
125+
126+
@Override
127+
public int getTextMessageSizeLimit() {
128+
return this.delegate.getTextMessageSizeLimit();
129+
}
130+
131+
@Override
132+
public void setBinaryMessageSizeLimit(int messageSizeLimit) {
133+
this.delegate.setBinaryMessageSizeLimit(messageSizeLimit);
134+
}
135+
136+
@Override
137+
public int getBinaryMessageSizeLimit() {
138+
return this.delegate.getBinaryMessageSizeLimit();
139+
}
140+
121141
@Override
122142
public boolean isOpen() {
123143
return this.delegate.isOpen();

spring-websocket/src/main/java/org/springframework/web/socket/messaging/StompSubProtocolHandler.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,16 @@
6161
*/
6262
public class StompSubProtocolHandler implements SubProtocolHandler, ApplicationEventPublisherAware {
6363

64+
/**
65+
* This protocol handler supports assembling large STOMP messages split into
66+
* multiple WebSocket messages. STOMP clients (like stomp.js) split large STOMP
67+
* messages at 16K boundaries.
68+
*
69+
* <p>We need to ensure the WebSocket server buffer is configured to support
70+
* that size at a minimum plus a little extra for any potential SockJS framing.
71+
*/
72+
public static final int MINIMUM_WEBSOCKET_MESSAGE_SIZE = 16 * 1024 + 256;
73+
6474
/**
6575
* The name of the header set on the CONNECTED frame indicating the name
6676
* of the user authenticated on the WebSocket session.
@@ -332,6 +342,9 @@ public String resolveSessionId(Message<?> message) {
332342

333343
@Override
334344
public void afterSessionStarted(WebSocketSession session, MessageChannel outputChannel) {
345+
if (session.getTextMessageSizeLimit() < MINIMUM_WEBSOCKET_MESSAGE_SIZE) {
346+
session.setTextMessageSizeLimit(MINIMUM_WEBSOCKET_MESSAGE_SIZE);
347+
}
335348
this.decoders.put(session.getId(), new BufferingStompDecoder(getMessageSizeLimit()));
336349
}
337350

spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/session/AbstractHttpSockJsSession.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,26 @@ public boolean isActive() {
148148
return (control != null && !control.isCompleted());
149149
}
150150

151+
@Override
152+
public void setTextMessageSizeLimit(int messageSizeLimit) {
153+
// ignore
154+
}
155+
156+
@Override
157+
public int getTextMessageSizeLimit() {
158+
return -1;
159+
}
160+
161+
@Override
162+
public void setBinaryMessageSizeLimit(int messageSizeLimit) {
163+
// ignore
164+
}
165+
166+
@Override
167+
public int getBinaryMessageSizeLimit() {
168+
return -1;
169+
}
170+
151171
@Override
152172
public List<WebSocketExtension> getExtensions() {
153173
return Collections.emptyList();

spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/session/WebSocketServerSockJsSession.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,30 @@ public String getAcceptedProtocol() {
9191
return this.webSocketSession.getAcceptedProtocol();
9292
}
9393

94+
@Override
95+
public void setTextMessageSizeLimit(int messageSizeLimit) {
96+
checkDelegateSessionInitialized();
97+
this.webSocketSession.setTextMessageSizeLimit(messageSizeLimit);
98+
}
99+
100+
@Override
101+
public int getTextMessageSizeLimit() {
102+
checkDelegateSessionInitialized();
103+
return this.webSocketSession.getTextMessageSizeLimit();
104+
}
105+
106+
@Override
107+
public void setBinaryMessageSizeLimit(int messageSizeLimit) {
108+
checkDelegateSessionInitialized();
109+
this.webSocketSession.setBinaryMessageSizeLimit(messageSizeLimit);
110+
}
111+
112+
@Override
113+
public int getBinaryMessageSizeLimit() {
114+
checkDelegateSessionInitialized();
115+
return this.webSocketSession.getBinaryMessageSizeLimit();
116+
}
117+
94118
@Override
95119
public List<WebSocketExtension> getExtensions() {
96120
checkDelegateSessionInitialized();

spring-websocket/src/test/java/org/springframework/web/socket/handler/TestWebSocketSession.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,24 @@ public void setAcceptedProtocol(String protocol) {
145145
this.protocol = protocol;
146146
}
147147

148+
@Override
149+
public void setTextMessageSizeLimit(int messageSizeLimit) {
150+
}
151+
152+
@Override
153+
public int getTextMessageSizeLimit() {
154+
return 0;
155+
}
156+
157+
@Override
158+
public void setBinaryMessageSizeLimit(int messageSizeLimit) {
159+
}
160+
161+
@Override
162+
public int getBinaryMessageSizeLimit() {
163+
return 0;
164+
}
165+
148166
@Override
149167
public List<WebSocketExtension> getExtensions() {
150168
return this.extensions;

spring-websocket/src/test/java/org/springframework/web/socket/sockjs/transport/session/TestSockJsSession.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,24 @@ public void setAcceptedProtocol(String protocol) {
128128
this.subProtocol = protocol;
129129
}
130130

131+
@Override
132+
public void setTextMessageSizeLimit(int messageSizeLimit) {
133+
}
134+
135+
@Override
136+
public int getTextMessageSizeLimit() {
137+
return 0;
138+
}
139+
140+
@Override
141+
public void setBinaryMessageSizeLimit(int messageSizeLimit) {
142+
}
143+
144+
@Override
145+
public int getBinaryMessageSizeLimit() {
146+
return 0;
147+
}
148+
131149
@Override
132150
public List<WebSocketExtension> getExtensions() {
133151
return this.extensions;

0 commit comments

Comments
 (0)