From 3859c5d0174a8db8c2ed5bfd730c7922cd48b7fb Mon Sep 17 00:00:00 2001 From: Nikita Date: Mon, 30 Jun 2014 11:20:58 +0400 Subject: [PATCH 01/24] Configuration.origin param added. #115 --- .../corundumstudio/socketio/Configuration.java | 18 ++++++++++++++++++ .../socketio/SocketIOChannelInitializer.java | 2 +- .../socketio/handler/EncoderHandler.java | 16 +++++++++++++--- 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/corundumstudio/socketio/Configuration.java b/src/main/java/com/corundumstudio/socketio/Configuration.java index f9b8551fd..a017d4309 100644 --- a/src/main/java/com/corundumstudio/socketio/Configuration.java +++ b/src/main/java/com/corundumstudio/socketio/Configuration.java @@ -69,6 +69,8 @@ public class Configuration { private JsonSupport jsonSupport = new JacksonJsonSupport(this); private AuthorizationListener authorizationListener = new SuccessAuthorizationListener(); + + private String origin; private AckMode ackMode = AckMode.AUTO_SUCCESS_ONLY; @@ -116,6 +118,7 @@ public Configuration() { setSocketConfig(conf.getSocketConfig()); setAckMode(conf.getAckMode()); setMaxFramePayloadLength(conf.getMaxFramePayloadLength()); + setOrigin(conf.getOrigin()); } private String join(Transport[] transports) { @@ -474,4 +477,19 @@ public int getMaxFramePayloadLength() { return maxFramePayloadLength; } + /** + * Set Access-Control-Allow-Origin header value for http each response. + * Default is {@code null}. + * + * If value is {@code null} then request {@code ORIGIN} header value used. + * + * @param origin + */ + public void setOrigin(String origin) { + this.origin = origin; + } + public String getOrigin() { + return origin; + } + } diff --git a/src/main/java/com/corundumstudio/socketio/SocketIOChannelInitializer.java b/src/main/java/com/corundumstudio/socketio/SocketIOChannelInitializer.java index ee2f08083..6c4a6eae7 100644 --- a/src/main/java/com/corundumstudio/socketio/SocketIOChannelInitializer.java +++ b/src/main/java/com/corundumstudio/socketio/SocketIOChannelInitializer.java @@ -135,7 +135,7 @@ public void start(Configuration configuration, NamespacesHub namespacesHub) { flashSocketTransport = new FlashSocketTransport(connectPath, isSsl, ackManager, this, authorizeHandler, heartbeatHandler, factory, configuration.getMaxFramePayloadLength()); resourceHandler = new ResourceHandler(configuration.getContext()); - encoderHandler = new EncoderHandler(encoder); + encoderHandler = new EncoderHandler(encoder, configuration); wrongUrlHandler = new WrongUrlHandler(); } diff --git a/src/main/java/com/corundumstudio/socketio/handler/EncoderHandler.java b/src/main/java/com/corundumstudio/socketio/handler/EncoderHandler.java index 863fce1c7..dc66f0170 100644 --- a/src/main/java/com/corundumstudio/socketio/handler/EncoderHandler.java +++ b/src/main/java/com/corundumstudio/socketio/handler/EncoderHandler.java @@ -44,6 +44,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.corundumstudio.socketio.Configuration; import com.corundumstudio.socketio.messages.AuthorizeMessage; import com.corundumstudio.socketio.messages.BaseMessage; import com.corundumstudio.socketio.messages.HttpMessage; @@ -61,9 +62,11 @@ public class EncoderHandler extends ChannelOutboundHandlerAdapter { private final Logger log = LoggerFactory.getLogger(getClass()); private final Encoder encoder; + private final Configuration configuration; - public EncoderHandler(Encoder encoder) { + public EncoderHandler(Encoder encoder, Configuration configuration) { this.encoder = encoder; + this.configuration = configuration; } private void write(XHRSendPacketsMessage msg, ChannelHandlerContext ctx, ByteBuf out) throws IOException { @@ -114,10 +117,17 @@ private HttpResponse createHttpResponse(HttpMessage msg, ByteBuf message) { } HttpHeaders.addHeader(res, CONNECTION, KEEP_ALIVE); - if (msg.getOrigin() != null) { - HttpHeaders.addHeader(res, ACCESS_CONTROL_ALLOW_ORIGIN, msg.getOrigin()); + + if (configuration.getOrigin() == null) { + if (msg.getOrigin() != null) { + HttpHeaders.addHeader(res, ACCESS_CONTROL_ALLOW_ORIGIN, msg.getOrigin()); + HttpHeaders.addHeader(res, ACCESS_CONTROL_ALLOW_CREDENTIALS, "true"); + } + } else { + HttpHeaders.addHeader(res, ACCESS_CONTROL_ALLOW_ORIGIN, configuration.getOrigin()); HttpHeaders.addHeader(res, ACCESS_CONTROL_ALLOW_CREDENTIALS, "true"); } + HttpHeaders.setContentLength(res, message.readableBytes()); return res; From 13cb68b367a34f62d534a369a20e19cc5aa4b864 Mon Sep 17 00:00:00 2001 From: Nikita Date: Mon, 30 Jun 2014 11:27:43 +0400 Subject: [PATCH 02/24] Custom origin fixed. #115 --- .../java/com/corundumstudio/socketio/handler/EncoderHandler.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/corundumstudio/socketio/handler/EncoderHandler.java b/src/main/java/com/corundumstudio/socketio/handler/EncoderHandler.java index dc66f0170..195297b42 100644 --- a/src/main/java/com/corundumstudio/socketio/handler/EncoderHandler.java +++ b/src/main/java/com/corundumstudio/socketio/handler/EncoderHandler.java @@ -125,7 +125,6 @@ private HttpResponse createHttpResponse(HttpMessage msg, ByteBuf message) { } } else { HttpHeaders.addHeader(res, ACCESS_CONTROL_ALLOW_ORIGIN, configuration.getOrigin()); - HttpHeaders.addHeader(res, ACCESS_CONTROL_ALLOW_CREDENTIALS, "true"); } HttpHeaders.setContentLength(res, message.readableBytes()); From 13c954f4fd5d3ff7bbe6f32d3ffb1931f92afc17 Mon Sep 17 00:00:00 2001 From: Nikita Date: Wed, 30 Jul 2014 16:15:26 +0400 Subject: [PATCH 03/24] Configuration.crossDomainPolicy param added. #116, #133 --- .../socketio/Configuration.java | 21 +++++++-- .../socketio/SocketIOChannelInitializer.java | 3 +- .../transport/FlashPolicyHandler.java | 45 ++++++++++++++++--- .../static/flashsocket/crossdomain.xml | 6 +++ 4 files changed, 64 insertions(+), 11 deletions(-) create mode 100644 src/main/resources/static/flashsocket/crossdomain.xml diff --git a/src/main/java/com/corundumstudio/socketio/Configuration.java b/src/main/java/com/corundumstudio/socketio/Configuration.java index a017d4309..676c6d4a3 100644 --- a/src/main/java/com/corundumstudio/socketio/Configuration.java +++ b/src/main/java/com/corundumstudio/socketio/Configuration.java @@ -52,6 +52,8 @@ public class Configuration { private String hostname; private int port = -1; + private InputStream crossDomainPolicy; + private String keyStoreFormat = "JKS"; private InputStream keyStore; private String keyStorePassword; @@ -69,7 +71,7 @@ public class Configuration { private JsonSupport jsonSupport = new JacksonJsonSupport(this); private AuthorizationListener authorizationListener = new SuccessAuthorizationListener(); - + private String origin; private AckMode ackMode = AckMode.AUTO_SUCCESS_ONLY; @@ -119,6 +121,7 @@ public Configuration() { setAckMode(conf.getAckMode()); setMaxFramePayloadLength(conf.getMaxFramePayloadLength()); setOrigin(conf.getOrigin()); + setCrossDomainPolicy(conf.getCrossDomainPolicy()); } private String join(Transport[] transports) { @@ -480,9 +483,9 @@ public int getMaxFramePayloadLength() { /** * Set Access-Control-Allow-Origin header value for http each response. * Default is {@code null}. - * + * * If value is {@code null} then request {@code ORIGIN} header value used. - * + * * @param origin */ public void setOrigin(String origin) { @@ -492,4 +495,16 @@ public String getOrigin() { return origin; } + /** + * crossdomain.xml file stream used for flash-socket transport + * + * @param crossDomainPolicy + */ + public void setCrossDomainPolicy(InputStream crossDomainPolicy) { + this.crossDomainPolicy = crossDomainPolicy; + } + public InputStream getCrossDomainPolicy() { + return crossDomainPolicy; + } + } diff --git a/src/main/java/com/corundumstudio/socketio/SocketIOChannelInitializer.java b/src/main/java/com/corundumstudio/socketio/SocketIOChannelInitializer.java index 6c4a6eae7..ab6ddcae8 100644 --- a/src/main/java/com/corundumstudio/socketio/SocketIOChannelInitializer.java +++ b/src/main/java/com/corundumstudio/socketio/SocketIOChannelInitializer.java @@ -84,7 +84,7 @@ public class SocketIOChannelInitializer extends ChannelInitializer impl private XHRPollingTransport xhrPollingTransport; private WebSocketTransport webSocketTransport; private FlashSocketTransport flashSocketTransport; - private final FlashPolicyHandler flashPolicyHandler = new FlashPolicyHandler(); + private FlashPolicyHandler flashPolicyHandler; private ResourceHandler resourceHandler; private EncoderHandler encoderHandler; private WrongUrlHandler wrongUrlHandler; @@ -124,6 +124,7 @@ public void start(Configuration configuration, NamespacesHub namespacesHub) { } } + flashPolicyHandler = new FlashPolicyHandler(configuration); packetHandler = new PacketHandler(packetListener, decoder, namespacesHub, configuration.getExceptionListener()); authorizeHandler = new AuthorizeHandler(connectPath, scheduler, configuration, namespacesHub); diff --git a/src/main/java/com/corundumstudio/socketio/transport/FlashPolicyHandler.java b/src/main/java/com/corundumstudio/socketio/transport/FlashPolicyHandler.java index 80a817e7d..30173fb39 100644 --- a/src/main/java/com/corundumstudio/socketio/transport/FlashPolicyHandler.java +++ b/src/main/java/com/corundumstudio/socketio/transport/FlashPolicyHandler.java @@ -24,18 +24,49 @@ import io.netty.channel.ChannelInboundHandlerAdapter; import io.netty.util.CharsetUtil; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.net.URLConnection; +import java.nio.ByteBuffer; +import java.nio.channels.Channels; +import java.nio.channels.ReadableByteChannel; + +import com.corundumstudio.socketio.Configuration; + @Sharable public class FlashPolicyHandler extends ChannelInboundHandlerAdapter { private final ByteBuf requestBuffer = Unpooled.copiedBuffer( "", CharsetUtil.UTF_8); + private ByteBuf responseBuffer; + + public FlashPolicyHandler(Configuration configuration) { + try { + if (configuration.getCrossDomainPolicy() == null) { + URL resUrl = getClass().getResource("/static/flashsocket/crossdomain.xml"); + URLConnection urlConnection = resUrl.openConnection(); + + InputStream stream = urlConnection.getInputStream(); + try { + readFile(stream); + } finally { + stream.close(); + } + } else { + readFile(configuration.getCrossDomainPolicy()); + } + } catch (IOException e) { + throw new IllegalStateException(e); + } + } - private final ByteBuf responseBuffer = Unpooled.copiedBuffer( - "" - + "" - + " " - + " " - + " " - + "", CharsetUtil.UTF_8); + private void readFile(InputStream stream) throws IOException { + ReadableByteChannel channel = Channels.newChannel(stream); + ByteBuffer buffer = ByteBuffer.allocate(5*1024); + channel.read(buffer); + buffer.flip(); + responseBuffer = Unpooled.copiedBuffer(buffer); + } @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { diff --git a/src/main/resources/static/flashsocket/crossdomain.xml b/src/main/resources/static/flashsocket/crossdomain.xml new file mode 100644 index 000000000..052d0af96 --- /dev/null +++ b/src/main/resources/static/flashsocket/crossdomain.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file From 6a9574985bba7fa3032ccded278951ca488a35a0 Mon Sep 17 00:00:00 2001 From: Nikita Date: Wed, 30 Jul 2014 17:28:35 +0400 Subject: [PATCH 04/24] license formatting skip --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b210a902d..0bd72d1ab 100644 --- a/pom.xml +++ b/pom.xml @@ -319,7 +319,7 @@ true false - src/** + src/**/*.java target/** From 82649c8128737d55dc78fefd0965ee715e35ba18 Mon Sep 17 00:00:00 2001 From: Nikita Date: Wed, 30 Jul 2014 17:29:23 +0400 Subject: [PATCH 05/24] SocketIOServer.startAsync method added. #90 --- .../socketio/SocketIOServer.java | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/corundumstudio/socketio/SocketIOServer.java b/src/main/java/com/corundumstudio/socketio/SocketIOServer.java index b79fdd69d..1ce1d8235 100644 --- a/src/main/java/com/corundumstudio/socketio/SocketIOServer.java +++ b/src/main/java/com/corundumstudio/socketio/SocketIOServer.java @@ -16,11 +16,14 @@ package com.corundumstudio.socketio; import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelOption; import io.netty.channel.EventLoopGroup; import io.netty.channel.FixedRecvByteBufAllocator; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.util.concurrent.Future; +import io.netty.util.concurrent.FutureListener; import java.net.InetSocketAddress; import java.util.Collection; @@ -115,6 +118,11 @@ public BroadcastOperations getRoomOperations(String room) { * Start server */ public void start() { + startAsync().awaitUninterruptibly(); + } + + public Future startAsync() { + log.info("Session store / pubsub factory used: {}", configCopy.getStoreFactory()); initGroups(); pipelineFactory.start(configCopy, namespacesHub); @@ -129,10 +137,18 @@ public void start() { addr = new InetSocketAddress(configCopy.getHostname(), configCopy.getPort()); } - b.bind(addr).syncUninterruptibly(); - - log.info("Session store / pubsub factory used: {}", configCopy.getStoreFactory()); - log.info("SocketIO server started at port: {}", configCopy.getPort()); + ChannelFuture future = b.bind(addr); + future.addListener(new FutureListener() { + @Override + public void operationComplete(Future future) throws Exception { + if (future.isSuccess()) { + log.info("SocketIO server started at port: {}", configCopy.getPort()); + } else { + log.error("SocketIO server start at port: {} failed!", configCopy.getPort()); + } + } + }); + return future; } protected void applyConnectionOptions(ServerBootstrap bootstrap) { From 7222e198387d9cc66183f53e7032b668aa727e3d Mon Sep 17 00:00:00 2001 From: Nikita Date: Mon, 29 Sep 2014 15:16:42 +0400 Subject: [PATCH 06/24] libs updated --- pom.xml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/pom.xml b/pom.xml index 0bd72d1ab..7ea600da9 100644 --- a/pom.xml +++ b/pom.xml @@ -97,32 +97,32 @@ io.netty netty-buffer - 4.0.19.Final + 4.0.23.Final io.netty netty-common - 4.0.19.Final + 4.0.23.Final io.netty netty-transport - 4.0.19.Final + 4.0.23.Final io.netty netty-handler - 4.0.19.Final + 4.0.23.Final io.netty netty-codec-http - 4.0.19.Final + 4.0.23.Final io.netty netty-codec - 4.0.19.Final + 4.0.23.Final @@ -147,12 +147,12 @@ com.fasterxml.jackson.core jackson-core - 2.3.3 + 2.4.2 com.fasterxml.jackson.core jackson-databind - 2.3.3 + 2.4.2 From 027b874a69b11877ef3f14af945f5849919c5109 Mon Sep 17 00:00:00 2001 From: Nikita Date: Mon, 29 Sep 2014 15:17:42 +0400 Subject: [PATCH 07/24] [maven-release-plugin] prepare release netty-socketio-1.6.6 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 7ea600da9..3e5722a8e 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ com.corundumstudio.socketio netty-socketio - 1.6.6-SNAPSHOT + 1.6.6 bundle NettySocketIO Socket.IO server implemented on Java @@ -14,7 +14,7 @@ scm:git:git@github.com:mrniko/netty-socketio.git scm:git:git@github.com:mrniko/netty-socketio.git scm:git:git@github.com:mrniko/netty-socketio.git - HEAD + netty-socketio-1.6.6 From 21d9cac150787cd1a4abe8d1fa6206d3a5d370f6 Mon Sep 17 00:00:00 2001 From: Nikita Date: Mon, 29 Sep 2014 15:17:48 +0400 Subject: [PATCH 08/24] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 3e5722a8e..3d307c05e 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ com.corundumstudio.socketio netty-socketio - 1.6.6 + 1.6.7-SNAPSHOT bundle NettySocketIO Socket.IO server implemented on Java @@ -14,7 +14,7 @@ scm:git:git@github.com:mrniko/netty-socketio.git scm:git:git@github.com:mrniko/netty-socketio.git scm:git:git@github.com:mrniko/netty-socketio.git - netty-socketio-1.6.6 + HEAD From cd11beb774145e2021d2443022394a2fe3d72fa5 Mon Sep 17 00:00:00 2001 From: Nikita Date: Fri, 12 Dec 2014 14:06:29 +0300 Subject: [PATCH 09/24] logging added --- .../com/corundumstudio/socketio/handler/AuthorizeHandler.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/corundumstudio/socketio/handler/AuthorizeHandler.java b/src/main/java/com/corundumstudio/socketio/handler/AuthorizeHandler.java index 83278570d..a01ac21e3 100644 --- a/src/main/java/com/corundumstudio/socketio/handler/AuthorizeHandler.java +++ b/src/main/java/com/corundumstudio/socketio/handler/AuthorizeHandler.java @@ -137,13 +137,13 @@ private void authorize(Channel channel, String origin, Map> channel.writeAndFlush(new AuthorizeMessage(msg, jsonpParam, origin, sessionId)); authorizedSessionIds.put(sessionId, data); - log.debug("Handshake authorized for sessionId: {}", sessionId); + log.debug("Handshake authorized for sessionId: {} query params: {} headers: {}", sessionId, params, headers); } else { HttpResponse res = new DefaultHttpResponse(HTTP_1_1, HttpResponseStatus.UNAUTHORIZED); ChannelFuture f = channel.writeAndFlush(res); f.addListener(ChannelFutureListener.CLOSE); - log.debug("Handshake unauthorized"); + log.debug("Handshake unauthorized, query params: {} headers: {}", params, headers); } } From f522d6830c3571026ca968245b56e5856f2b5853 Mon Sep 17 00:00:00 2001 From: Nikita Date: Fri, 12 Dec 2014 14:06:38 +0300 Subject: [PATCH 10/24] libs updated --- pom.xml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/pom.xml b/pom.xml index 3d307c05e..6ed197b63 100644 --- a/pom.xml +++ b/pom.xml @@ -97,32 +97,32 @@ io.netty netty-buffer - 4.0.23.Final + 4.0.24.Final io.netty netty-common - 4.0.23.Final + 4.0.24.Final io.netty netty-transport - 4.0.23.Final + 4.0.24.Final io.netty netty-handler - 4.0.23.Final + 4.0.24.Final io.netty netty-codec-http - 4.0.23.Final + 4.0.24.Final io.netty netty-codec - 4.0.23.Final + 4.0.24.Final @@ -147,12 +147,12 @@ com.fasterxml.jackson.core jackson-core - 2.4.2 + 2.4.4 com.fasterxml.jackson.core jackson-databind - 2.4.2 + 2.4.4 From b382a8949e468d07f3267b6d721a22edbbac63fe Mon Sep 17 00:00:00 2001 From: Nikita Date: Mon, 9 Feb 2015 17:51:49 +0300 Subject: [PATCH 11/24] netty updated --- pom.xml | 12 ++++++------ .../socketio/handler/EncoderHandler.java | 10 ++++++---- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/pom.xml b/pom.xml index 6ed197b63..3758feae2 100644 --- a/pom.xml +++ b/pom.xml @@ -97,32 +97,32 @@ io.netty netty-buffer - 4.0.24.Final + 4.0.25.Final io.netty netty-common - 4.0.24.Final + 4.0.25.Final io.netty netty-transport - 4.0.24.Final + 4.0.25.Final io.netty netty-handler - 4.0.24.Final + 4.0.25.Final io.netty netty-codec-http - 4.0.24.Final + 4.0.25.Final io.netty netty-codec - 4.0.24.Final + 4.0.25.Final diff --git a/src/main/java/com/corundumstudio/socketio/handler/EncoderHandler.java b/src/main/java/com/corundumstudio/socketio/handler/EncoderHandler.java index 195297b42..4d85b2c86 100644 --- a/src/main/java/com/corundumstudio/socketio/handler/EncoderHandler.java +++ b/src/main/java/com/corundumstudio/socketio/handler/EncoderHandler.java @@ -117,7 +117,7 @@ private HttpResponse createHttpResponse(HttpMessage msg, ByteBuf message) { } HttpHeaders.addHeader(res, CONNECTION, KEEP_ALIVE); - + if (configuration.getOrigin() == null) { if (msg.getOrigin() != null) { HttpHeaders.addHeader(res, ACCESS_CONTROL_ALLOW_ORIGIN, msg.getOrigin()); @@ -126,7 +126,7 @@ private HttpResponse createHttpResponse(HttpMessage msg, ByteBuf message) { } else { HttpHeaders.addHeader(res, ACCESS_CONTROL_ALLOW_ORIGIN, configuration.getOrigin()); } - + HttpHeaders.setContentLength(res, message.readableBytes()); return res; @@ -180,8 +180,10 @@ private void handle(WebSocketPacketMessage webSocketPacketMessage, Channel chann WebSocketFrame res = new TextWebSocketFrame(out); log.trace("Out message: {} sessionId: {}", out.toString(CharsetUtil.UTF_8), webSocketPacketMessage.getSessionId()); - channel.writeAndFlush(res); - if (!out.isReadable()) { + + if (out.isReadable()) { + channel.writeAndFlush(res); + } else { out.release(); } } From 1478593dc34f871b1c9283c93ef4d07c7e6949b9 Mon Sep 17 00:00:00 2001 From: Nikita Date: Wed, 11 Mar 2015 14:30:53 +0300 Subject: [PATCH 12/24] websocket packet ordering fixed. --- .../socketio/transport/MainBaseClient.java | 5 +++-- .../socketio/transport/WebSocketClient.java | 12 +++++++++--- .../socketio/transport/XHRPollingClient.java | 4 ++-- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/corundumstudio/socketio/transport/MainBaseClient.java b/src/main/java/com/corundumstudio/socketio/transport/MainBaseClient.java index 5fec89c2c..8b8c11ca0 100644 --- a/src/main/java/com/corundumstudio/socketio/transport/MainBaseClient.java +++ b/src/main/java/com/corundumstudio/socketio/transport/MainBaseClient.java @@ -18,6 +18,7 @@ import io.netty.channel.Channel; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelFutureListener; +import io.netty.util.concurrent.Future; import java.net.SocketAddress; import java.util.Collection; @@ -72,7 +73,7 @@ public Transport getTransport() { return transport; } - public abstract ChannelFuture send(Packet packet); + public abstract Future send(Packet packet); public void removeChildClient(SocketIOClient client) { namespaceClients.remove((Namespace) client.getNamespace()); @@ -123,7 +124,7 @@ public SocketAddress getRemoteAddress() { } public void disconnect() { - ChannelFuture future = send(new Packet(PacketType.DISCONNECT)); + Future future = send(new Packet(PacketType.DISCONNECT)); future.addListener(ChannelFutureListener.CLOSE); onChannelDisconnect(); diff --git a/src/main/java/com/corundumstudio/socketio/transport/WebSocketClient.java b/src/main/java/com/corundumstudio/socketio/transport/WebSocketClient.java index 82a7e8c6d..698fa928e 100644 --- a/src/main/java/com/corundumstudio/socketio/transport/WebSocketClient.java +++ b/src/main/java/com/corundumstudio/socketio/transport/WebSocketClient.java @@ -16,7 +16,7 @@ package com.corundumstudio.socketio.transport; import io.netty.channel.Channel; -import io.netty.channel.ChannelFuture; +import io.netty.util.concurrent.Future; import java.util.UUID; @@ -37,8 +37,14 @@ public WebSocketClient(Channel channel, AckManager ackManager, setChannel(channel); } - public ChannelFuture send(Packet packet) { - return getChannel().writeAndFlush(new WebSocketPacketMessage(getSessionId(), packet)); + public Future send(final Packet packet) { + return getChannel().eventLoop().submit(new Runnable() { + @Override + public void run() { + getChannel() + .writeAndFlush(new WebSocketPacketMessage(getSessionId(), packet)); + } + }); } } diff --git a/src/main/java/com/corundumstudio/socketio/transport/XHRPollingClient.java b/src/main/java/com/corundumstudio/socketio/transport/XHRPollingClient.java index 5375f17fa..3d743dd1f 100644 --- a/src/main/java/com/corundumstudio/socketio/transport/XHRPollingClient.java +++ b/src/main/java/com/corundumstudio/socketio/transport/XHRPollingClient.java @@ -18,10 +18,10 @@ import io.netty.channel.Channel; import io.netty.channel.ChannelFuture; import io.netty.util.AttributeKey; +import io.netty.util.internal.PlatformDependent; import java.util.Queue; import java.util.UUID; -import java.util.concurrent.ConcurrentLinkedQueue; import com.corundumstudio.socketio.DisconnectableHub; import com.corundumstudio.socketio.HandshakeData; @@ -35,7 +35,7 @@ public class XHRPollingClient extends MainBaseClient { public static final AttributeKey WRITE_ONCE = AttributeKey.valueOf("writeOnce"); - private final Queue packetQueue = new ConcurrentLinkedQueue(); + private final Queue packetQueue = PlatformDependent.newMpscQueue(); private String origin; public XHRPollingClient(AckManager ackManager, DisconnectableHub disconnectable, From d65b0701cd8560798a13ba0e0227461a9dd1350d Mon Sep 17 00:00:00 2001 From: Nikita Date: Wed, 25 Mar 2015 12:28:04 +0300 Subject: [PATCH 13/24] libs updated --- pom.xml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/pom.xml b/pom.xml index 3758feae2..de222b4f6 100644 --- a/pom.xml +++ b/pom.xml @@ -97,32 +97,32 @@ io.netty netty-buffer - 4.0.25.Final + 4.0.26.Final io.netty netty-common - 4.0.25.Final + 4.0.26.Final io.netty netty-transport - 4.0.25.Final + 4.0.26.Final io.netty netty-handler - 4.0.25.Final + 4.0.26.Final io.netty netty-codec-http - 4.0.25.Final + 4.0.26.Final io.netty netty-codec - 4.0.25.Final + 4.0.26.Final @@ -141,18 +141,18 @@ org.slf4j slf4j-api - 1.7.6 + 1.7.10 com.fasterxml.jackson.core jackson-core - 2.4.4 + 2.5.1 com.fasterxml.jackson.core jackson-databind - 2.4.4 + 2.5.1 @@ -179,7 +179,7 @@ org.redisson redisson - 1.0.2 + 1.2.0 provided From a9967811496be80d37e5639a5876ef0528b8b27d Mon Sep 17 00:00:00 2001 From: Nikita Date: Wed, 25 Mar 2015 17:26:14 +0300 Subject: [PATCH 14/24] Use string ordering param added --- .../socketio/Configuration.java | 14 +++++++++++ .../socketio/SocketIOChannelInitializer.java | 2 +- .../socketio/transport/WebSocketClient.java | 23 ++++++++++++------- .../transport/WebSocketTransport.java | 11 +++++---- 4 files changed, 36 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/corundumstudio/socketio/Configuration.java b/src/main/java/com/corundumstudio/socketio/Configuration.java index 676c6d4a3..d8d2d47e0 100644 --- a/src/main/java/com/corundumstudio/socketio/Configuration.java +++ b/src/main/java/com/corundumstudio/socketio/Configuration.java @@ -47,6 +47,7 @@ public class Configuration { private int maxHttpContentLength = 64 * 1024; private int maxFramePayloadLength = 64 * 1024; + private boolean useStrictOrdering = false; private String packagePrefix; private String hostname; @@ -122,6 +123,7 @@ public Configuration() { setMaxFramePayloadLength(conf.getMaxFramePayloadLength()); setOrigin(conf.getOrigin()); setCrossDomainPolicy(conf.getCrossDomainPolicy()); + setUseStrictOrdering(conf.isUseStrictOrdering()); } private String join(Transport[] transports) { @@ -507,4 +509,16 @@ public InputStream getCrossDomainPolicy() { return crossDomainPolicy; } + /** + * Packet strict ordering in websocket transport + * + * @param useStrictOrdering + */ + public void setUseStrictOrdering(boolean useStrictOrdering) { + this.useStrictOrdering = useStrictOrdering; + } + public boolean isUseStrictOrdering() { + return useStrictOrdering; + } + } diff --git a/src/main/java/com/corundumstudio/socketio/SocketIOChannelInitializer.java b/src/main/java/com/corundumstudio/socketio/SocketIOChannelInitializer.java index ab6ddcae8..1a83105a7 100644 --- a/src/main/java/com/corundumstudio/socketio/SocketIOChannelInitializer.java +++ b/src/main/java/com/corundumstudio/socketio/SocketIOChannelInitializer.java @@ -132,7 +132,7 @@ public void start(Configuration configuration, NamespacesHub namespacesHub) { factory.init(namespacesHub, authorizeHandler, jsonSupport); xhrPollingTransport = new XHRPollingTransport(connectPath, ackManager, this, scheduler, authorizeHandler, configuration); - webSocketTransport = new WebSocketTransport(connectPath, isSsl, ackManager, this, authorizeHandler, heartbeatHandler, factory, configuration.getMaxFramePayloadLength()); + webSocketTransport = new WebSocketTransport(connectPath, isSsl, ackManager, this, authorizeHandler, heartbeatHandler, factory, configuration); flashSocketTransport = new FlashSocketTransport(connectPath, isSsl, ackManager, this, authorizeHandler, heartbeatHandler, factory, configuration.getMaxFramePayloadLength()); resourceHandler = new ResourceHandler(configuration.getContext()); diff --git a/src/main/java/com/corundumstudio/socketio/transport/WebSocketClient.java b/src/main/java/com/corundumstudio/socketio/transport/WebSocketClient.java index 698fa928e..730a8b494 100644 --- a/src/main/java/com/corundumstudio/socketio/transport/WebSocketClient.java +++ b/src/main/java/com/corundumstudio/socketio/transport/WebSocketClient.java @@ -20,6 +20,7 @@ import java.util.UUID; +import com.corundumstudio.socketio.Configuration; import com.corundumstudio.socketio.DisconnectableHub; import com.corundumstudio.socketio.HandshakeData; import com.corundumstudio.socketio.Transport; @@ -30,21 +31,27 @@ public class WebSocketClient extends MainBaseClient { + private final Configuration config; + public WebSocketClient(Channel channel, AckManager ackManager, DisconnectableHub disconnectable, UUID sessionId, - Transport transport, StoreFactory storeFactory, HandshakeData handshakeData) { + Transport transport, StoreFactory storeFactory, HandshakeData handshakeData, Configuration config) { super(sessionId, ackManager, disconnectable, transport, storeFactory, handshakeData); setChannel(channel); + this.config = config; } public Future send(final Packet packet) { - return getChannel().eventLoop().submit(new Runnable() { - @Override - public void run() { - getChannel() - .writeAndFlush(new WebSocketPacketMessage(getSessionId(), packet)); - } - }); + if (config.isUseStrictOrdering()) { + return getChannel().eventLoop().submit(new Runnable() { + @Override + public void run() { + getChannel() + .writeAndFlush(new WebSocketPacketMessage(getSessionId(), packet)); + } + }); + } + return getChannel().writeAndFlush(new WebSocketPacketMessage(getSessionId(), packet)); } } diff --git a/src/main/java/com/corundumstudio/socketio/transport/WebSocketTransport.java b/src/main/java/com/corundumstudio/socketio/transport/WebSocketTransport.java index 2a2400337..2b38b2d73 100644 --- a/src/main/java/com/corundumstudio/socketio/transport/WebSocketTransport.java +++ b/src/main/java/com/corundumstudio/socketio/transport/WebSocketTransport.java @@ -37,6 +37,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.corundumstudio.socketio.Configuration; import com.corundumstudio.socketio.DisconnectableHub; import com.corundumstudio.socketio.HandshakeData; import com.corundumstudio.socketio.SocketIOChannelInitializer; @@ -62,7 +63,7 @@ public class WebSocketTransport extends BaseTransport { private final AuthorizeHandler authorizeHandler; private final DisconnectableHub disconnectableHub; private final StoreFactory storeFactory; - private final int maxFramePayloadLength; + private final Configuration config; private final boolean isSsl; protected String path; @@ -70,7 +71,7 @@ public class WebSocketTransport extends BaseTransport { public WebSocketTransport(String connectPath, boolean isSsl, AckManager ackManager, DisconnectableHub disconnectable, - AuthorizeHandler authorizeHandler, HeartbeatHandler heartbeatHandler, StoreFactory storeFactory, int maxFramePayloadLength) { + AuthorizeHandler authorizeHandler, HeartbeatHandler heartbeatHandler, StoreFactory storeFactory, Configuration config) { this.path = connectPath + NAME; this.isSsl = isSsl; this.authorizeHandler = authorizeHandler; @@ -78,7 +79,7 @@ public WebSocketTransport(String connectPath, boolean isSsl, AckManager ackManag this.disconnectableHub = disconnectable; this.heartbeatHandler = heartbeatHandler; this.storeFactory = storeFactory; - this.maxFramePayloadLength = maxFramePayloadLength; + this.config = config; } @Override @@ -141,7 +142,7 @@ private void handshake(ChannelHandlerContext ctx, String path, FullHttpRequest r final UUID sessionId = UUID.fromString(parts[4]); WebSocketServerHandshakerFactory factory = - new WebSocketServerHandshakerFactory(getWebSocketLocation(req), null, false, maxFramePayloadLength); + new WebSocketServerHandshakerFactory(getWebSocketLocation(req), null, false, config.getMaxFramePayloadLength()); WebSocketServerHandshaker handshaker = factory.newHandshaker(req); if (handshaker != null) { ChannelFuture f = handshaker.handshake(channel, req); @@ -165,7 +166,7 @@ private void connectClient(Channel channel, UUID sessionId) { return; } - WebSocketClient client = new WebSocketClient(channel, ackManager, disconnectableHub, sessionId, getTransport(), storeFactory, data); + WebSocketClient client = new WebSocketClient(channel, ackManager, disconnectableHub, sessionId, getTransport(), storeFactory, data, config); channelId2Client.put(channel, client); sessionId2Client.put(sessionId, client); From a62c3c55587c74944d67d457706ff45948c47a0e Mon Sep 17 00:00:00 2001 From: Nikita Date: Wed, 25 Mar 2015 17:28:06 +0300 Subject: [PATCH 15/24] FAIL_ON_EMPTY_BEANS = false --- .../com/corundumstudio/socketio/parser/JacksonJsonSupport.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/corundumstudio/socketio/parser/JacksonJsonSupport.java b/src/main/java/com/corundumstudio/socketio/parser/JacksonJsonSupport.java index b535bf2cc..cc75b44d5 100644 --- a/src/main/java/com/corundumstudio/socketio/parser/JacksonJsonSupport.java +++ b/src/main/java/com/corundumstudio/socketio/parser/JacksonJsonSupport.java @@ -234,6 +234,7 @@ protected void init(ObjectMapper objectMapper) { objectMapper.registerModule(module); objectMapper.setSerializationInclusion(Include.NON_NULL); + objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); objectMapper.configure(SerializationFeature.WRITE_BIGDECIMAL_AS_PLAIN, true); From 5a99a4fd8cb0b4a43fe55a356efd0c012ebcde7d Mon Sep 17 00:00:00 2001 From: Nikita Date: Wed, 25 Mar 2015 17:35:27 +0300 Subject: [PATCH 16/24] compilation errors fixed --- .../corundumstudio/socketio/SocketIOChannelInitializer.java | 2 +- .../socketio/transport/FlashSocketTransport.java | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/corundumstudio/socketio/SocketIOChannelInitializer.java b/src/main/java/com/corundumstudio/socketio/SocketIOChannelInitializer.java index 1a83105a7..b8af7026a 100644 --- a/src/main/java/com/corundumstudio/socketio/SocketIOChannelInitializer.java +++ b/src/main/java/com/corundumstudio/socketio/SocketIOChannelInitializer.java @@ -133,7 +133,7 @@ public void start(Configuration configuration, NamespacesHub namespacesHub) { xhrPollingTransport = new XHRPollingTransport(connectPath, ackManager, this, scheduler, authorizeHandler, configuration); webSocketTransport = new WebSocketTransport(connectPath, isSsl, ackManager, this, authorizeHandler, heartbeatHandler, factory, configuration); - flashSocketTransport = new FlashSocketTransport(connectPath, isSsl, ackManager, this, authorizeHandler, heartbeatHandler, factory, configuration.getMaxFramePayloadLength()); + flashSocketTransport = new FlashSocketTransport(connectPath, isSsl, ackManager, this, authorizeHandler, heartbeatHandler, factory, configuration); resourceHandler = new ResourceHandler(configuration.getContext()); encoderHandler = new EncoderHandler(encoder, configuration); diff --git a/src/main/java/com/corundumstudio/socketio/transport/FlashSocketTransport.java b/src/main/java/com/corundumstudio/socketio/transport/FlashSocketTransport.java index 3808be186..94e776e43 100644 --- a/src/main/java/com/corundumstudio/socketio/transport/FlashSocketTransport.java +++ b/src/main/java/com/corundumstudio/socketio/transport/FlashSocketTransport.java @@ -18,6 +18,7 @@ import io.netty.channel.ChannelPipeline; import io.netty.channel.ChannelHandler.Sharable; +import com.corundumstudio.socketio.Configuration; import com.corundumstudio.socketio.DisconnectableHub; import com.corundumstudio.socketio.SocketIOChannelInitializer; import com.corundumstudio.socketio.Transport; @@ -33,9 +34,9 @@ public class FlashSocketTransport extends WebSocketTransport { public FlashSocketTransport(String connectPath, boolean isSsl, AckManager ackManager, DisconnectableHub disconnectable, AuthorizeHandler authorizeHandler, - HeartbeatHandler heartbeatHandler, StoreFactory storeFactory, int maxFramePayloadLength) { + HeartbeatHandler heartbeatHandler, StoreFactory storeFactory, Configuration config) { super(connectPath, isSsl, ackManager, disconnectable, - authorizeHandler, heartbeatHandler, storeFactory, maxFramePayloadLength); + authorizeHandler, heartbeatHandler, storeFactory, config); path = connectPath + NAME; } From 4a48aef9b9c014b9b87698198d293df96fc872cb Mon Sep 17 00:00:00 2001 From: Nikita Date: Thu, 26 Mar 2015 10:01:58 +0300 Subject: [PATCH 17/24] release plugin updated --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index de222b4f6..d6478c646 100644 --- a/pom.xml +++ b/pom.xml @@ -196,7 +196,7 @@ org.apache.maven.plugins maven-release-plugin - 2.4.2 + 2.5.1 From 257a13324ac924570d14104b8e04897046d615a2 Mon Sep 17 00:00:00 2001 From: Nikita Date: Thu, 26 Mar 2015 10:02:32 +0300 Subject: [PATCH 18/24] [maven-release-plugin] prepare release netty-socketio-1.6.7 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index d6478c646..ff3dce924 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ com.corundumstudio.socketio netty-socketio - 1.6.7-SNAPSHOT + 1.6.7 bundle NettySocketIO Socket.IO server implemented on Java @@ -14,7 +14,7 @@ scm:git:git@github.com:mrniko/netty-socketio.git scm:git:git@github.com:mrniko/netty-socketio.git scm:git:git@github.com:mrniko/netty-socketio.git - HEAD + netty-socketio-1.6.7 From 3f9d1048f9b09d18565a071e8a4b335bf55f232b Mon Sep 17 00:00:00 2001 From: Nikita Date: Thu, 26 Mar 2015 10:02:38 +0300 Subject: [PATCH 19/24] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index ff3dce924..5d8db0f4e 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ com.corundumstudio.socketio netty-socketio - 1.6.7 + 1.6.8-SNAPSHOT bundle NettySocketIO Socket.IO server implemented on Java @@ -14,7 +14,7 @@ scm:git:git@github.com:mrniko/netty-socketio.git scm:git:git@github.com:mrniko/netty-socketio.git scm:git:git@github.com:mrniko/netty-socketio.git - netty-socketio-1.6.7 + HEAD From b5d065788895d7b090c12f1cb4a2e22ddc0c3b3c Mon Sep 17 00:00:00 2001 From: Nikita Date: Fri, 17 Apr 2015 11:29:44 +0300 Subject: [PATCH 20/24] netty updated --- pom.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pom.xml b/pom.xml index 5d8db0f4e..f4937d4e9 100644 --- a/pom.xml +++ b/pom.xml @@ -97,32 +97,32 @@ io.netty netty-buffer - 4.0.26.Final + 4.0.27.Final io.netty netty-common - 4.0.26.Final + 4.0.27.Final io.netty netty-transport - 4.0.26.Final + 4.0.27.Final io.netty netty-handler - 4.0.26.Final + 4.0.27.Final io.netty netty-codec-http - 4.0.26.Final + 4.0.27.Final io.netty netty-codec - 4.0.26.Final + 4.0.27.Final From ac509898d2d809a077a645e5b4708f41cdd011bc Mon Sep 17 00:00:00 2001 From: Nikita Date: Fri, 17 Apr 2015 11:44:47 +0300 Subject: [PATCH 21/24] 'firstDataTimeout' param introduced to avoid hanged silent channels --- .../corundumstudio/socketio/Configuration.java | 16 ++++++++++++++++ .../socketio/handler/AuthorizeHandler.java | 17 +++++++++++++++++ .../socketio/scheduler/SchedulerKey.java | 15 +++++++-------- 3 files changed, 40 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/corundumstudio/socketio/Configuration.java b/src/main/java/com/corundumstudio/socketio/Configuration.java index d8d2d47e0..f56bff9b1 100644 --- a/src/main/java/com/corundumstudio/socketio/Configuration.java +++ b/src/main/java/com/corundumstudio/socketio/Configuration.java @@ -44,6 +44,7 @@ public class Configuration { private int heartbeatTimeout = 60; private int heartbeatInterval = 25; private int closeTimeout = 60; + private int firstDataTimeout = 5; private int maxHttpContentLength = 64 * 1024; private int maxFramePayloadLength = 64 * 1024; @@ -124,6 +125,7 @@ public Configuration() { setOrigin(conf.getOrigin()); setCrossDomainPolicy(conf.getCrossDomainPolicy()); setUseStrictOrdering(conf.isUseStrictOrdering()); + setFirstDataTimeout(conf.getFirstDataTimeout()); } private String join(Transport[] transports) { @@ -521,4 +523,18 @@ public boolean isUseStrictOrdering() { return useStrictOrdering; } + /** + * Timeout between channel opening and first data transfer + * Helps to avoid 'silent channel' attack and prevents + * 'Too many open files' problem in this case + * + * @param firstDataTimeout + */ + public void setFirstDataTimeout(int firstDataTimeout) { + this.firstDataTimeout = firstDataTimeout; + } + public int getFirstDataTimeout() { + return firstDataTimeout; + } + } diff --git a/src/main/java/com/corundumstudio/socketio/handler/AuthorizeHandler.java b/src/main/java/com/corundumstudio/socketio/handler/AuthorizeHandler.java index a01ac21e3..0950dffb7 100644 --- a/src/main/java/com/corundumstudio/socketio/handler/AuthorizeHandler.java +++ b/src/main/java/com/corundumstudio/socketio/handler/AuthorizeHandler.java @@ -77,9 +77,26 @@ public AuthorizeHandler(String connectPath, CancelableScheduler scheduler, Confi this.authorizedSessionIds = configuration.getStoreFactory().createMap("authorizedSessionIds"); } + + @Override + public void channelActive(final ChannelHandlerContext ctx) throws Exception { + SchedulerKey key = new SchedulerKey(Type.CLOSE_TIMEOUT, ctx.channel()); + disconnectScheduler.schedule(key, new Runnable() { + @Override + public void run() { + ctx.channel().close(); + log.debug("Client with ip {} opens channel but not sended any data! Channel closed!", ctx.channel().remoteAddress()); + } + }, configuration.getFirstDataTimeout(), TimeUnit.SECONDS); + + super.channelActive(ctx); + } @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + SchedulerKey key = new SchedulerKey(Type.CLOSE_TIMEOUT, ctx.channel()); + disconnectScheduler.cancel(key); + if (msg instanceof FullHttpRequest) { FullHttpRequest req = (FullHttpRequest) msg; Channel channel = ctx.channel(); diff --git a/src/main/java/com/corundumstudio/socketio/scheduler/SchedulerKey.java b/src/main/java/com/corundumstudio/socketio/scheduler/SchedulerKey.java index 0ce36aa45..e1cfc0a5f 100644 --- a/src/main/java/com/corundumstudio/socketio/scheduler/SchedulerKey.java +++ b/src/main/java/com/corundumstudio/socketio/scheduler/SchedulerKey.java @@ -15,18 +15,17 @@ */ package com.corundumstudio.socketio.scheduler; -import java.util.UUID; public class SchedulerKey { public enum Type {POLLING, HEARBEAT_TIMEOUT, CLOSE_TIMEOUT, AUTHORIZE, ACK_TIMEOUT}; private final Type type; - private final UUID sessionId; + private final Object key; - public SchedulerKey(Type type, UUID sessionId) { + public SchedulerKey(Type type, Object key) { this.type = type; - this.sessionId = sessionId; + this.key = key; } @Override @@ -34,7 +33,7 @@ public int hashCode() { final int prime = 31; int result = 1; result = prime * result - + ((sessionId == null) ? 0 : sessionId.hashCode()); + + ((key == null) ? 0 : key.hashCode()); result = prime * result + ((type == null) ? 0 : type.hashCode()); return result; } @@ -48,10 +47,10 @@ public boolean equals(Object obj) { if (getClass() != obj.getClass()) return false; SchedulerKey other = (SchedulerKey) obj; - if (sessionId == null) { - if (other.sessionId != null) + if (key == null) { + if (other.key != null) return false; - } else if (!sessionId.equals(other.sessionId)) + } else if (!key.equals(other.key)) return false; if (type != other.type) return false; From a49a7685d40b9e2a1f8249ec9365f3ec43334d93 Mon Sep 17 00:00:00 2001 From: Nikita Date: Wed, 27 May 2015 10:15:06 +0300 Subject: [PATCH 22/24] #238 fixed --- .../com/corundumstudio/socketio/handler/EncoderHandler.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/corundumstudio/socketio/handler/EncoderHandler.java b/src/main/java/com/corundumstudio/socketio/handler/EncoderHandler.java index 4d85b2c86..84dc7382c 100644 --- a/src/main/java/com/corundumstudio/socketio/handler/EncoderHandler.java +++ b/src/main/java/com/corundumstudio/socketio/handler/EncoderHandler.java @@ -121,10 +121,14 @@ private HttpResponse createHttpResponse(HttpMessage msg, ByteBuf message) { if (configuration.getOrigin() == null) { if (msg.getOrigin() != null) { HttpHeaders.addHeader(res, ACCESS_CONTROL_ALLOW_ORIGIN, msg.getOrigin()); - HttpHeaders.addHeader(res, ACCESS_CONTROL_ALLOW_CREDENTIALS, "true"); + HttpHeaders.addHeader(res, ACCESS_CONTROL_ALLOW_CREDENTIALS, Boolean.TRUE); + } else { + HttpHeaders.addHeader(res, ACCESS_CONTROL_ALLOW_ORIGIN, "*"); + HttpHeaders.addHeader(res, ACCESS_CONTROL_ALLOW_CREDENTIALS, Boolean.TRUE); } } else { HttpHeaders.addHeader(res, ACCESS_CONTROL_ALLOW_ORIGIN, configuration.getOrigin()); + HttpHeaders.addHeader(res, ACCESS_CONTROL_ALLOW_CREDENTIALS, Boolean.TRUE); } HttpHeaders.setContentLength(res, message.readableBytes()); From 6f4e148acf189936a3c846c5ace4fb998bd8d897 Mon Sep 17 00:00:00 2001 From: Nikita Date: Wed, 27 May 2015 10:15:49 +0300 Subject: [PATCH 23/24] netty updated --- pom.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pom.xml b/pom.xml index f4937d4e9..2a716670d 100644 --- a/pom.xml +++ b/pom.xml @@ -97,32 +97,32 @@ io.netty netty-buffer - 4.0.27.Final + 4.0.28.Final io.netty netty-common - 4.0.27.Final + 4.0.28.Final io.netty netty-transport - 4.0.27.Final + 4.0.28.Final io.netty netty-handler - 4.0.27.Final + 4.0.28.Final io.netty netty-codec-http - 4.0.27.Final + 4.0.28.Final io.netty netty-codec - 4.0.27.Final + 4.0.28.Final From 968c0719d98dd536bde0441b8531d30d0a50b57f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20W=C3=BCrsch?= Date: Tue, 16 Aug 2016 17:26:37 +0300 Subject: [PATCH 24/24] Allow authorizing channels which are connected through io.netty.channel.local.LocalAddress Local addresses (io.netty.channel.local.LocalAddress) are quite useful as they don't bind to real socket address are less likely to cause unwanted side-effects with other processes. Authorization for socket io clients connecting through local address failed because HandshakeData data was expecting instance of InetSocketAddress. --- .../socketio/HandshakeData.java | 19 ++++++++++++++----- .../socketio/handler/AuthorizeHandler.java | 3 +-- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/corundumstudio/socketio/HandshakeData.java b/src/main/java/com/corundumstudio/socketio/HandshakeData.java index 6b475c503..1a0792ac6 100644 --- a/src/main/java/com/corundumstudio/socketio/HandshakeData.java +++ b/src/main/java/com/corundumstudio/socketio/HandshakeData.java @@ -17,6 +17,7 @@ import java.io.Serializable; import java.net.InetSocketAddress; +import java.net.SocketAddress; import java.util.Date; import java.util.List; import java.util.Map; @@ -26,7 +27,7 @@ public class HandshakeData implements Serializable { private static final long serialVersionUID = 1196350300161819978L; private Map> headers; - private InetSocketAddress address; + private SocketAddress address; private Date time = new Date(); private String url; private Map> urlParams; @@ -35,7 +36,7 @@ public class HandshakeData implements Serializable { public HandshakeData() { } - public HandshakeData(Map> headers, Map> urlParams, InetSocketAddress address, String url, boolean xdomain) { + public HandshakeData(Map> headers, Map> urlParams, SocketAddress address, String url, boolean xdomain) { super(); this.headers = headers; this.urlParams = urlParams; @@ -44,9 +45,17 @@ public HandshakeData(Map> headers, Map this.xdomain = xdomain; } - public InetSocketAddress getAddress() { - return address; - } + /** + * @deprecated use {@link #getSocketAddress()} instead + */ + @Deprecated + public InetSocketAddress getAddress() { + return (InetSocketAddress) address; + } + + public SocketAddress getSocketAddress() { + return address; + } public Map> getHeaders() { return headers; diff --git a/src/main/java/com/corundumstudio/socketio/handler/AuthorizeHandler.java b/src/main/java/com/corundumstudio/socketio/handler/AuthorizeHandler.java index 0950dffb7..8225d85c0 100644 --- a/src/main/java/com/corundumstudio/socketio/handler/AuthorizeHandler.java +++ b/src/main/java/com/corundumstudio/socketio/handler/AuthorizeHandler.java @@ -30,7 +30,6 @@ import io.netty.handler.codec.http.QueryStringDecoder; import java.io.IOException; -import java.net.InetSocketAddress; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -129,7 +128,7 @@ private void authorize(Channel channel, String origin, Map> } HandshakeData data = new HandshakeData(headers, params, - (InetSocketAddress)channel.remoteAddress(), + channel.remoteAddress(), req.getUri(), origin != null && !origin.equalsIgnoreCase("null")); boolean result = false;