Skip to content

Commit c46279d

Browse files
committed
Made Draft_75 only deliver complete frames and no incomplete frame fragments. (TooTallNate#144)
These changes also fix the NullPointerException in TooTallNate#178
1 parent 2861d78 commit c46279d

File tree

1 file changed

+16
-19
lines changed

1 file changed

+16
-19
lines changed

‎src/main/java/org/java_websocket/drafts/Draft_75.java‎

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@
77
importjava.util.Random;
88

99
importorg.java_websocket.exceptions.InvalidDataException;
10+
importorg.java_websocket.exceptions.InvalidFrameException;
1011
importorg.java_websocket.exceptions.InvalidHandshakeException;
12+
importorg.java_websocket.exceptions.LimitExedeedException;
1113
importorg.java_websocket.exceptions.NotSendableException;
1214
importorg.java_websocket.framing.CloseFrame;
1315
importorg.java_websocket.framing.FrameBuilder;
@@ -40,14 +42,13 @@ public class Draft_75 extends Draft{
4042
*/
4143
publicstaticfinalbyteEND_OF_FRAME = (byte) 0xFF;
4244

45+
/** Is only used to detect protocol violations */
4346
protectedbooleanreadingState = false;
44-
privatebooleaninframe = false;
47+
4548
protectedList<Framedata> readyframes = newLinkedList<Framedata>();
4649
protectedByteBuffercurrentFrame;
47-
48-
50+
4951
privatefinalRandomreuseableRandom = newRandom();
50-
5152

5253
@Override
5354
publicHandshakeStateacceptHandshakeAsClient( ClientHandshakerequest, ServerHandshakeresponse ){
@@ -122,29 +123,29 @@ public HandshakeBuilder postProcessHandshakeResponseAsServer( ClientHandshake re
122123
}
123124

124125
protectedList<Framedata> translateRegularFrame( ByteBufferbuffer ) throwsInvalidDataException{
126+
125127
while ( buffer.hasRemaining() ){
126128
bytenewestByte = buffer.get();
127129
if( newestByte == START_OF_FRAME ){// Beginning of Frame
128130
if( readingState )
129-
returnnull;
131+
thrownewInvalidFrameException( "unexpected START_OF_FRAME" );
130132
readingState = true;
131133
} elseif( newestByte == END_OF_FRAME ){// End of Frame
132134
if( !readingState )
133-
returnnull;
135+
thrownewInvalidFrameException( "unexpected END_OF_FRAME" );
134136
// currentFrame will be null if END_OF_FRAME was send directly after
135137
// START_OF_FRAME, thus we will send 'null' as the sent message.
136138
if( this.currentFrame != null ){
137139
currentFrame.flip();
138140
FramedataImpl1curframe = newFramedataImpl1();
139141
curframe.setPayload( currentFrame );
140142
curframe.setFin( true );
141-
curframe.setOptcode( inframe ? Opcode.CONTINUOUS : Opcode.TEXT );
143+
curframe.setOptcode( Opcode.TEXT );
142144
readyframes.add( curframe );
143145
this.currentFrame = null;
144146
buffer.mark();
145147
}
146148
readingState = false;
147-
inframe = false;
148149
} elseif( readingState ){// Regular frame data, add to current frame buffer //TODO This code is very expensive and slow
149150
if( currentFrame == null ){
150151
currentFrame = createBuffer();
@@ -156,15 +157,11 @@ protected List<Framedata> translateRegularFrame( ByteBuffer buffer ) throws Inva
156157
returnnull;
157158
}
158159
}
159-
if( readingState ){
160-
FramedataImpl1curframe = newFramedataImpl1();
161-
currentFrame.flip();
162-
curframe.setPayload( currentFrame );
163-
curframe.setFin( false );
164-
curframe.setOptcode( inframe ? Opcode.CONTINUOUS : Opcode.TEXT );
165-
inframe = true;
166-
readyframes.add( curframe );
167-
}
160+
161+
// if no error occurred this block will be reached
162+
/*if( readingState ){
163+
checkAlloc(currentFrame.position()+1);
164+
}*/
168165

169166
List<Framedata> frames = readyframes;
170167
readyframes = newLinkedList<Framedata>();
@@ -196,9 +193,9 @@ public ByteBuffer createBuffer(){
196193
returnByteBuffer.allocate( INITIAL_FAMESIZE );
197194
}
198195

199-
publicByteBufferincreaseBuffer( ByteBufferfull ){
196+
publicByteBufferincreaseBuffer( ByteBufferfull ) throwsLimitExedeedException , InvalidDataException{
200197
full.flip();
201-
ByteBuffernewbuffer = ByteBuffer.allocate( full.capacity() * 2 );
198+
ByteBuffernewbuffer = ByteBuffer.allocate( checkAlloc( full.capacity() * 2 ) );
202199
newbuffer.put( full );
203200
returnnewbuffer;
204201
}

0 commit comments

Comments
(0)