Browse Source

Namespace connnection handling fixed. Issue #101

master
Nikita 11 years ago
parent
commit
2d990104b9
  1. 2
      src/main/java/com/corundumstudio/socketio/handler/AuthorizeHandler.java
  2. 11
      src/main/java/com/corundumstudio/socketio/handler/PacketHandler.java
  3. 14
      src/main/java/com/corundumstudio/socketio/transport/MainBaseClient.java
  4. 12
      src/test/java/com/corundumstudio/socketio/handler/PacketHandlerTest.java

2
src/main/java/com/corundumstudio/socketio/handler/AuthorizeHandler.java

@ -188,7 +188,7 @@ public class AuthorizeHandler extends ChannelInboundHandlerAdapter implements Di
client.send(new Packet(PacketType.CONNECT));
Namespace ns = namespacesHub.get(Namespace.DEFAULT_NAME);
SocketIOClient nsClient = client.getChildClient(ns);
SocketIOClient nsClient = client.addChildClient(ns);
namespacesHub.get(ns.getName()).onConnect(nsClient);
}

11
src/main/java/com/corundumstudio/socketio/handler/PacketHandler.java

@ -29,6 +29,7 @@ import com.corundumstudio.socketio.namespace.Namespace;
import com.corundumstudio.socketio.namespace.NamespacesHub;
import com.corundumstudio.socketio.parser.Decoder;
import com.corundumstudio.socketio.parser.Packet;
import com.corundumstudio.socketio.parser.PacketType;
import com.corundumstudio.socketio.transport.MainBaseClient;
import com.corundumstudio.socketio.transport.NamespaceClient;
@ -62,11 +63,19 @@ public class PacketHandler extends SimpleChannelInboundHandler<PacketsMessage> {
Packet packet = decoder.decodePackets(content, client.getSessionId());
Namespace ns = namespacesHub.get(packet.getEndpoint());
if (ns == null) {
log.warn("Can't find namespace for endpoint: {} probably it was removed.", packet.getEndpoint());
log.debug("Can't find namespace for endpoint: {}, sessionId: {} probably it was removed.", packet.getEndpoint(), client.getSessionId());
return;
}
if (packet.getType() == PacketType.CONNECT) {
client.addChildClient(ns);
}
NamespaceClient nClient = (NamespaceClient) client.getChildClient(ns);
if (nClient == null) {
log.debug("Can't find namespace client in namespace: {}, sessionId: {} probably it was disconnected.", ns.getName(), client.getSessionId());
return;
}
packetListener.onPacket(packet, nClient);
} catch (Exception ex) {
String c = content.toString(CharsetUtil.UTF_8);

14
src/main/java/com/corundumstudio/socketio/transport/MainBaseClient.java

@ -80,14 +80,12 @@ public abstract class MainBaseClient {
}
public SocketIOClient getChildClient(Namespace namespace) {
SocketIOClient client = namespaceClients.get(namespace);
if (client == null) {
client = new NamespaceClient(this, namespace);
SocketIOClient oldClient = namespaceClients.putIfAbsent(namespace, client);
if (oldClient != null) {
client = oldClient;
}
}
return namespaceClients.get(namespace);
}
public SocketIOClient addChildClient(Namespace namespace) {
SocketIOClient client = new NamespaceClient(this, namespace);
namespaceClients.put(namespace, client);
return client;
}

12
src/test/java/com/corundumstudio/socketio/handler/PacketHandlerTest.java

@ -19,20 +19,23 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Queue;
import java.util.UUID;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.atomic.AtomicInteger;
import junit.framework.Assert;
import mockit.Mocked;
import com.corundumstudio.socketio.Configuration;
import com.corundumstudio.socketio.store.MemoryStoreFactory;
import com.corundumstudio.socketio.transport.NamespaceClient;
import com.corundumstudio.socketio.transport.XHRPollingClient;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.buffer.UnpooledByteBufAllocator;
import io.netty.channel.Channel;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
@ -57,15 +60,16 @@ public class PacketHandlerTest {
private NamespacesHub namespacesHub = new NamespacesHub(map, null);
@Mocked
private Channel channel;
@Mocked
private MainBaseClient client;
private MainBaseClient client = new XHRPollingClient(null, null, UUID.randomUUID(), null, new MemoryStoreFactory(), null);
private final AtomicInteger invocations = new AtomicInteger();
@Before
public void before() {
if (namespacesHub.get(Namespace.DEFAULT_NAME) == null) {
namespacesHub.create(Namespace.DEFAULT_NAME);
Namespace ns = namespacesHub.create(Namespace.DEFAULT_NAME);
client.addChildClient(ns);
}
invocations.set(0);
}

Loading…
Cancel
Save