Skip to content

Commit b89468e

Browse files
committed
Replaced recursive calls with iterative calls
1 parent c70516d commit b89468e

File tree

2 files changed

+84
-80
lines changed

2 files changed

+84
-80
lines changed

src/main/java/org/java_websocket/SSLSocketChannel2.java

Lines changed: 38 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -223,58 +223,60 @@ public int write( ByteBuffer src ) throws IOException {
223223
/**
224224
* Blocks when in blocking mode until at least one byte has been decoded.<br>
225225
* When not in blocking mode 0 may be returned.
226-
*
226+
*
227227
* @return the number of bytes read.
228228
**/
229-
public int read( ByteBuffer dst ) throws IOException {
230-
if( !dst.hasRemaining() )
231-
return 0;
232-
if( !isHandShakeComplete() ) {
233-
if( isBlocking() ) {
234-
while ( !isHandShakeComplete() ) {
229+
public int read(ByteBuffer dst) throws IOException {
230+
while (true) {
231+
if (!dst.hasRemaining())
232+
return 0;
233+
if (!isHandShakeComplete()) {
234+
if (isBlocking()) {
235+
while (!isHandShakeComplete()) {
236+
processHandshake();
237+
}
238+
} else {
235239
processHandshake();
236-
}
237-
} else {
238-
processHandshake();
239-
if( !isHandShakeComplete() ) {
240-
return 0;
240+
if (!isHandShakeComplete()) {
241+
return 0;
242+
}
241243
}
242244
}
243-
}
244-
// assert ( bufferallocations > 1 ); //see #190
245-
//if( bufferallocations <= 1 ) {
246-
// createBuffers( sslEngine.getSession() );
247-
//}
245+
// assert ( bufferallocations > 1 ); //see #190
246+
//if( bufferallocations <= 1 ) {
247+
// createBuffers( sslEngine.getSession() );
248+
//}
248249
/* 1. When "dst" is smaller than "inData" readRemaining will fill "dst" with data decoded in a previous read call.
249250
* 2. When "inCrypt" contains more data than "inData" has remaining space, unwrap has to be called on more time(readRemaining)
250251
*/
251-
int purged = readRemaining( dst );
252-
if( purged != 0 )
253-
return purged;
252+
int purged = readRemaining(dst);
253+
if (purged != 0)
254+
return purged;
254255

255256
/* We only continue when we really need more data from the network.
256257
* Thats the case if inData is empty or inCrypt holds to less data than necessary for decryption
257258
*/
258-
assert ( inData.position() == 0 );
259-
inData.clear();
259+
assert (inData.position() == 0);
260+
inData.clear();
260261

261-
if( !inCrypt.hasRemaining() )
262-
inCrypt.clear();
263-
else
264-
inCrypt.compact();
262+
if (!inCrypt.hasRemaining())
263+
inCrypt.clear();
264+
else
265+
inCrypt.compact();
265266

266-
if( isBlocking() || readEngineResult.getStatus() == Status.BUFFER_UNDERFLOW )
267-
if( socketChannel.read( inCrypt ) == -1 ) {
268-
return -1;
269-
}
270-
inCrypt.flip();
271-
unwrap();
267+
if (isBlocking() || readEngineResult.getStatus() == Status.BUFFER_UNDERFLOW)
268+
if (socketChannel.read(inCrypt) == -1) {
269+
return -1;
270+
}
271+
inCrypt.flip();
272+
unwrap();
272273

273-
int transfered = transfereTo( inData, dst );
274-
if( transfered == 0 && isBlocking() ) {
275-
return read( dst ); // "transfered" may be 0 when not enough bytes were received or during rehandshaking
274+
int transfered = transfereTo(inData, dst);
275+
if (transfered == 0 && isBlocking()) {
276+
continue;
277+
}
278+
return transfered;
276279
}
277-
return transfered;
278280
}
279281
/**
280282
* {@link #read(ByteBuffer)} may not be to leave all buffers(inData, inCrypt)

src/main/java/org/java_websocket/drafts/Draft_10.java

Lines changed: 46 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -235,55 +235,57 @@ private Opcode toOpcode(byte opcode) throws InvalidFrameException {
235235

236236
@Override
237237
public List<Framedata> translateFrame(ByteBuffer buffer) throws LimitExedeedException, InvalidDataException {
238-
List<Framedata> frames = new LinkedList<Framedata>();
239-
Framedata cur;
240-
241-
if (incompleteframe != null) {
242-
// complete an incomplete frame
243-
try {
244-
buffer.mark();
245-
int available_next_byte_count = buffer.remaining();// The number of bytes received
246-
int expected_next_byte_count = incompleteframe.remaining();// The number of bytes to complete the incomplete frame
247-
248-
if (expected_next_byte_count > available_next_byte_count) {
249-
// did not receive enough bytes to complete the frame
250-
incompleteframe.put(buffer.array(), buffer.position(), available_next_byte_count);
251-
buffer.position(buffer.position() + available_next_byte_count);
252-
return Collections.emptyList();
238+
while (true) {
239+
List<Framedata> frames = new LinkedList<Framedata>();
240+
Framedata cur;
241+
242+
if (incompleteframe != null) {
243+
// complete an incomplete frame
244+
try {
245+
buffer.mark();
246+
int available_next_byte_count = buffer.remaining();// The number of bytes received
247+
int expected_next_byte_count = incompleteframe.remaining();// The number of bytes to complete the incomplete frame
248+
249+
if (expected_next_byte_count > available_next_byte_count) {
250+
// did not receive enough bytes to complete the frame
251+
incompleteframe.put(buffer.array(), buffer.position(), available_next_byte_count);
252+
buffer.position(buffer.position() + available_next_byte_count);
253+
return Collections.emptyList();
254+
}
255+
incompleteframe.put(buffer.array(), buffer.position(), expected_next_byte_count);
256+
buffer.position(buffer.position() + expected_next_byte_count);
257+
258+
cur = translateSingleFrame((ByteBuffer) incompleteframe.duplicate().position(0));
259+
frames.add(cur);
260+
incompleteframe = null;
261+
} catch (IncompleteException e) {
262+
// extending as much as suggested
263+
int oldsize = incompleteframe.limit();
264+
ByteBuffer extendedframe = ByteBuffer.allocate(checkAlloc(e.getPreferedSize()));
265+
assert (extendedframe.limit() > incompleteframe.limit());
266+
incompleteframe.rewind();
267+
extendedframe.put(incompleteframe);
268+
incompleteframe = extendedframe;
269+
continue;
253270
}
254-
incompleteframe.put(buffer.array(), buffer.position(), expected_next_byte_count);
255-
buffer.position(buffer.position() + expected_next_byte_count);
256-
257-
cur = translateSingleFrame((ByteBuffer) incompleteframe.duplicate().position(0));
258-
frames.add(cur);
259-
incompleteframe = null;
260-
} catch (IncompleteException e) {
261-
// extending as much as suggested
262-
int oldsize = incompleteframe.limit();
263-
ByteBuffer extendedframe = ByteBuffer.allocate(checkAlloc(e.getPreferedSize()));
264-
assert (extendedframe.limit() > incompleteframe.limit());
265-
incompleteframe.rewind();
266-
extendedframe.put(incompleteframe);
267-
incompleteframe = extendedframe;
268-
return translateFrame(buffer);
269271
}
270-
}
271272

272-
while (buffer.hasRemaining()) {// Read as much as possible full frames
273-
buffer.mark();
274-
try {
275-
cur = translateSingleFrame(buffer);
276-
frames.add(cur);
277-
} catch (IncompleteException e) {
278-
// remember the incomplete data
279-
buffer.reset();
280-
int pref = e.getPreferedSize();
281-
incompleteframe = ByteBuffer.allocate(checkAlloc(pref));
282-
incompleteframe.put(buffer);
283-
break;
273+
while (buffer.hasRemaining()) {// Read as much as possible full frames
274+
buffer.mark();
275+
try {
276+
cur = translateSingleFrame(buffer);
277+
frames.add(cur);
278+
} catch (IncompleteException e) {
279+
// remember the incomplete data
280+
buffer.reset();
281+
int pref = e.getPreferedSize();
282+
incompleteframe = ByteBuffer.allocate(checkAlloc(pref));
283+
incompleteframe.put(buffer);
284+
break;
285+
}
284286
}
287+
return frames;
285288
}
286-
return frames;
287289
}
288290

289291
public Framedata translateSingleFrame(ByteBuffer buffer) throws IncompleteException, InvalidDataException {

0 commit comments

Comments
 (0)