From f558407a8299e02e00e4206d5565dadc8f1d1a2c Mon Sep 17 00:00:00 2001 From: Naoyuki Kanezawa Date: Fri, 7 Jun 2013 05:44:00 +0900 Subject: [PATCH] compatible with 0.6.1 --- .../github/nkzawa/engineio/client/Socket.java | 30 ++++++++++++++----- .../nkzawa/engineio/client/SocketTest.java | 30 +++++++++++++++++++ src/test/resources/package.json | 2 +- 3 files changed, 54 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/github/nkzawa/engineio/client/Socket.java b/src/main/java/com/github/nkzawa/engineio/client/Socket.java index 3a5440b..049860d 100644 --- a/src/main/java/com/github/nkzawa/engineio/client/Socket.java +++ b/src/main/java/com/github/nkzawa/engineio/client/Socket.java @@ -378,7 +378,7 @@ public abstract class Socket extends Emitter { if (Packet.OPEN.equals(packet.type)) { this.onHandshake(gson.fromJson(packet.data, HandshakeData.class)); } else if (Packet.PONG.equals(packet.type)) { - this.ping(); + this.setPing(); } else if (Packet.ERROR.equals(packet.type)) { // TODO: handle error EngineIOException err = new EngineIOException("server error"); @@ -402,7 +402,7 @@ public abstract class Socket extends Emitter { this.pingInterval = data.pingInterval; this.pingTimeout = data.pingTimeout; this.onOpen(); - this.ping(); + this.setPing(); this.off(EVENT_HEARTBEAT, this.onHeartbeatAsListener); this.on(EVENT_HEARTBEAT, this.onHeartbeatAsListener); @@ -439,7 +439,7 @@ public abstract class Socket extends Emitter { }, timeout, TimeUnit.MILLISECONDS); } - private void ping() { + private void setPing() { if (this.pingIntervalTimer != null) { pingIntervalTimer.cancel(true); } @@ -452,7 +452,7 @@ public abstract class Socket extends Emitter { @Override public void run() { logger.fine(String.format("writing ping packet - expecting pong within %sms", self.pingTimeout)); - self.sendPacket(Packet.PING); + self.ping(); self.onHeartbeat(self.pingTimeout); } }); @@ -460,6 +460,18 @@ public abstract class Socket extends Emitter { }, this.pingInterval, TimeUnit.MILLISECONDS); } + /** + * Sends a ping packet + */ + public void ping() { + EventThread.exec(new Runnable() { + @Override + public void run() { + Socket.this.sendPacket(Packet.PING); + } + }); + } + private void onDrain() { this.callbacks(); for (int i = 0; i < this.prevBufferLen; i++) { @@ -578,6 +590,7 @@ public abstract class Socket extends Emitter { private void onClose(String reason, Exception desc) { if (this.readyState == ReadyState.OPENING || this.readyState == ReadyState.OPEN) { logger.fine(String.format("socket close with reason: %s", reason)); + final Socket self = this; if (this.pingIntervalTimer != null) { this.pingIntervalTimer.cancel(true); } @@ -587,12 +600,15 @@ public abstract class Socket extends Emitter { EventThread.nextTick(new Runnable() { @Override public void run() { - Socket.this.writeBuffer.clear(); - Socket.this.callbackBuffer.clear(); + self.writeBuffer.clear(); + self.callbackBuffer.clear(); } }); + ReadyState prev = this.readyState; this.readyState = ReadyState.CLOSED; - this.emit(EVENT_CLOSE, reason, desc); + if (prev == ReadyState.OPEN) { + this.emit(EVENT_CLOSE, reason, desc); + } this.onclose(); this.id = null; } diff --git a/src/test/java/com/github/nkzawa/engineio/client/SocketTest.java b/src/test/java/com/github/nkzawa/engineio/client/SocketTest.java index cf853ca..7ced5b1 100644 --- a/src/test/java/com/github/nkzawa/engineio/client/SocketTest.java +++ b/src/test/java/com/github/nkzawa/engineio/client/SocketTest.java @@ -1,11 +1,13 @@ package com.github.nkzawa.engineio.client; +import com.github.nkzawa.emitter.Emitter; import com.github.nkzawa.engineio.client.transports.Polling; import com.github.nkzawa.engineio.client.transports.WebSocket; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; +import java.net.URISyntaxException; import java.util.ArrayList; import java.util.List; @@ -35,4 +37,32 @@ public class SocketTest { assertThat(socket.filterUpgrades(upgrades), is(expected)); } + /** + * should not emit close on incorrect connection. + * + * @throws URISyntaxException + */ + @Test + public void socketClosing() throws URISyntaxException, InterruptedException { + Socket socket = new Socket("ws://localhost:8080") { + @Override + public void onopen() {} + @Override + public void onmessage(String data) {} + @Override + public void onclose() {} + }; + final boolean[] closed = {false}; + + socket.on(Socket.EVENT_CLOSE, new Emitter.Listener() { + @Override + public void call(Object... args) { + closed[0] = true; + } + }); + socket.open(); + + Thread.sleep(200); + assertThat(closed[0], is(false)); + } } diff --git a/src/test/resources/package.json b/src/test/resources/package.json index d266866..421d4f6 100644 --- a/src/test/resources/package.json +++ b/src/test/resources/package.json @@ -3,6 +3,6 @@ "version": "0.0.0", "private": true, "dependencies": { - "engine.io": "0.5.0" + "engine.io": "0.6.1" } }