From 0ec3884e98f19fc6845332e19cfe4b521c486f5d Mon Sep 17 00:00:00 2001 From: SquidDev Date: Wed, 8 May 2019 08:09:56 +0100 Subject: [PATCH] Handle websockets which close while receiving This changes the previous behaviour a little, but hopefully is more sane: - Only require the socket to be open when first calling receive. This means if it closes while receving, you won't get an error. This behaviour is still not perfect - the socket could have closed, but the event not reached the user yet, but it's better. - Listen to websocket_close events while receiving, and return null should it match ours. See #201 --- .../core/apis/http/websocket/WebsocketHandle.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/main/java/dan200/computercraft/core/apis/http/websocket/WebsocketHandle.java b/src/main/java/dan200/computercraft/core/apis/http/websocket/WebsocketHandle.java index d5eaf37e7..f53a2bff1 100644 --- a/src/main/java/dan200/computercraft/core/apis/http/websocket/WebsocketHandle.java +++ b/src/main/java/dan200/computercraft/core/apis/http/websocket/WebsocketHandle.java @@ -24,6 +24,7 @@ import java.util.Arrays; import static dan200.computercraft.core.apis.ArgumentHelper.optBoolean; +import static dan200.computercraft.core.apis.http.websocket.Websocket.CLOSE_EVENT; import static dan200.computercraft.core.apis.http.websocket.Websocket.MESSAGE_EVENT; public class WebsocketHandle implements ILuaObject, Closeable @@ -53,15 +54,18 @@ public Object[] callMethod( @Nonnull ILuaContext context, int method, @Nonnull O switch( method ) { case 0: // receive + checkOpen(); while( true ) { - checkOpen(); - - Object[] event = context.pullEvent( MESSAGE_EVENT ); - if( event.length >= 3 && Objects.equal( event[1], websocket.address() ) ) + Object[] event = context.pullEvent( null ); + if( event.length >= 3 && Objects.equal( event[0], MESSAGE_EVENT ) && Objects.equal( event[1], websocket.address() ) ) { return Arrays.copyOfRange( event, 2, event.length ); } + else if( event.length >= 2 && Objects.equal( event[0], CLOSE_EVENT ) && Objects.equal( event[1], websocket.address() ) && closed ) + { + return null; + } } case 1: // send