27
27
28
28
import java .util .concurrent .ConcurrentLinkedQueue ;
29
29
30
+ import java .io .ByteArrayOutputStream ;
31
+
30
32
import static org .jboss .netty .buffer .ChannelBuffers .wrappedBuffer ;
31
33
32
34
public class NettyWebSocket implements WebSocket {
@@ -35,6 +37,10 @@ public class NettyWebSocket implements WebSocket {
35
37
private final Channel channel ;
36
38
private final ConcurrentLinkedQueue <WebSocketListener > listeners = new ConcurrentLinkedQueue <WebSocketListener >();
37
39
40
+ private StringBuilder textBuffer ;
41
+ private ByteArrayOutputStream byteBuffer ;
42
+ private int maxBufferSize = 128000000 ;
43
+
38
44
public NettyWebSocket (Channel channel ) {
39
45
this .channel = channel ;
40
46
}
@@ -90,6 +96,17 @@ public WebSocket removeWebSocketListener(WebSocketListener l) {
90
96
return this ;
91
97
}
92
98
99
+ public int getMaxBufferSize () {
100
+ return maxBufferSize ;
101
+ }
102
+
103
+ public void setMaxBufferSize (int bufferSize ) {
104
+ maxBufferSize = bufferSize ;
105
+
106
+ if (maxBufferSize < 8192 )
107
+ maxBufferSize = 8192 ;
108
+ }
109
+
93
110
// @Override
94
111
public boolean isOpen () {
95
112
return channel .isOpen ();
@@ -102,23 +119,62 @@ public void close() {
102
119
channel .close ();
103
120
}
104
121
105
- protected void onMessage (byte [] message ) {
122
+ protected void onBinaryFragment (byte [] message , boolean last ) {
106
123
for (WebSocketListener l : listeners ) {
107
124
if (WebSocketByteListener .class .isAssignableFrom (l .getClass ())) {
108
125
try {
109
- WebSocketByteListener .class .cast (l ).onMessage (message );
126
+ WebSocketByteListener .class .cast (l ).onFragment (message ,last );
127
+
128
+ if (byteBuffer == null ) {
129
+ byteBuffer = new ByteArrayOutputStream ();
130
+ }
131
+
132
+ byteBuffer .write (message );
133
+
134
+ if (byteBuffer .size () > maxBufferSize ) {
135
+ Exception e = new Exception ("Exceeded Netty Web Socket maximum buffer size of " + getMaxBufferSize ());
136
+ l .onError (e );
137
+ this .close ();
138
+ return ;
139
+ }
140
+
141
+
142
+ if (last ) {
143
+ WebSocketByteListener .class .cast (l ).onMessage (byteBuffer .toByteArray ());
144
+ byteBuffer = null ;
145
+ textBuffer = null ;
146
+ }
110
147
} catch (Exception ex ) {
111
148
l .onError (ex );
112
149
}
113
150
}
114
151
}
115
152
}
116
153
117
- protected void onTextMessage (String message ) {
154
+ protected void onTextFragment (String message , boolean last ) {
118
155
for (WebSocketListener l : listeners ) {
119
156
if (WebSocketTextListener .class .isAssignableFrom (l .getClass ())) {
120
157
try {
121
- WebSocketTextListener .class .cast (l ).onMessage (message );
158
+ WebSocketTextListener .class .cast (l ).onFragment (message ,last );
159
+
160
+ if (textBuffer == null ) {
161
+ textBuffer = new StringBuilder ();
162
+ }
163
+
164
+ textBuffer .append (message );
165
+
166
+ if (textBuffer .length () > maxBufferSize ) {
167
+ Exception e = new Exception ("Exceeded Netty Web Socket maximum buffer size of " + getMaxBufferSize ());
168
+ l .onError (e );
169
+ this .close ();
170
+ return ;
171
+ }
172
+
173
+ if (last ) {
174
+ WebSocketTextListener .class .cast (l ).onMessage (textBuffer .toString ());
175
+ byteBuffer = null ;
176
+ textBuffer = null ;
177
+ }
122
178
} catch (Exception ex ) {
123
179
l .onError (ex );
124
180
}
0 commit comments