diff --git a/src/main/java/com/corundumstudio/socketio/AuthorizeHandler.java b/src/main/java/com/corundumstudio/socketio/AuthorizeHandler.java index 051b6c8..ce398aa 100644 --- a/src/main/java/com/corundumstudio/socketio/AuthorizeHandler.java +++ b/src/main/java/com/corundumstudio/socketio/AuthorizeHandler.java @@ -51,9 +51,6 @@ import com.corundumstudio.socketio.scheduler.CancelableScheduler; import com.corundumstudio.socketio.scheduler.SchedulerKey; import com.corundumstudio.socketio.scheduler.SchedulerKey.Type; import com.corundumstudio.socketio.transport.BaseClient; -import com.corundumstudio.socketio.transport.FlashSocketTransport; -import com.corundumstudio.socketio.transport.WebSocketTransport; -import com.corundumstudio.socketio.transport.XHRPollingTransport; @Sharable public class AuthorizeHandler extends SimpleChannelUpstreamHandler implements Disconnectable { @@ -91,34 +88,34 @@ public class AuthorizeHandler extends SimpleChannelUpstreamHandler implements Di return; } if (queryDecoder.getPath().equals(connectPath)) { - authorize(channel, req, queryDecoder.getParameters()); + String origin = req.getHeader(HttpHeaders.Names.ORIGIN); + authorize(channel, origin, queryDecoder.getParameters()); return; } } ctx.sendUpstream(e); } - private void authorize(Channel channel, HttpRequest req, Map> params) + private void authorize(Channel channel, String origin, Map> params) throws IOException { final UUID sessionId = UUID.randomUUID(); authorizedSessionIds.add(sessionId); scheduleDisconnect(channel, sessionId); - String transports = WebSocketTransport.NAME + "," + FlashSocketTransport.NAME + "," + XHRPollingTransport.NAME; String heartbeatTimeoutVal = String.valueOf(configuration.getHeartbeatTimeout()); if (!configuration.isHeartbeatsEnabled()) { heartbeatTimeoutVal = ""; } - String msg = sessionId + ":" + heartbeatTimeoutVal + ":" + configuration.getCloseTimeout() + ":" + transports; + String msg = sessionId + ":" + heartbeatTimeoutVal + ":" + configuration.getCloseTimeout() + ":" + configuration.getTransports(); List jsonpParams = params.get("jsonp"); String jsonpParam = null; if (jsonpParams != null) { jsonpParam = jsonpParams.get(0); } - String origin = req.getHeader(HttpHeaders.Names.ORIGIN); + channel.write(new AuthorizeMessage(msg, jsonpParam, origin, sessionId)); log.debug("New sessionId: {} authorized", sessionId); } diff --git a/src/main/java/com/corundumstudio/socketio/Configuration.java b/src/main/java/com/corundumstudio/socketio/Configuration.java index 57a7d5a..091b75c 100644 --- a/src/main/java/com/corundumstudio/socketio/Configuration.java +++ b/src/main/java/com/corundumstudio/socketio/Configuration.java @@ -16,6 +16,8 @@ package com.corundumstudio.socketio; import java.io.InputStream; +import java.util.Arrays; +import java.util.List; import java.util.concurrent.Executor; import java.util.concurrent.Executors; @@ -27,6 +29,8 @@ public class Configuration { private String jsonTypeFieldName = "@class"; private String context = "/socket.io"; + private String transports = join(Arrays.asList(Transport.WEBSOCKET, Transport.FLASHSOCKET, Transport.XHRPOLLING)); + private Executor bossExecutor = Executors.newCachedThreadPool(); private Executor workerExecutor = Executors.newCachedThreadPool(); @@ -71,6 +75,17 @@ public class Configuration { setJsonTypeFieldName(conf.getJsonTypeFieldName()); setKeyStorePassword(conf.getKeyStorePassword()); setKeyStore(conf.getKeyStore()); + setTransports(conf.getTransports()); + } + + private String join(List transports) { + StringBuilder result = new StringBuilder(); + for (Transport transport : transports) { + result.append(transport.getValue()); + result.append(","); + } + result.setLength(result.length()-1); + return result.toString(); } public String getJsonTypeFieldName() { @@ -214,6 +229,11 @@ public class Configuration { this.pollingDuration = pollingDuration; } + /** + * SSL key store password + * + * @param keyStorePassword + */ public void setKeyStorePassword(String keyStorePassword) { this.keyStorePassword = keyStorePassword; } @@ -221,6 +241,11 @@ public class Configuration { return keyStorePassword; } + /** + * SSL key store stream, maybe appointed to any source + * + * @param keyStore + */ public void setKeyStore(InputStream keyStore) { this.keyStore = keyStore; } @@ -228,4 +253,23 @@ public class Configuration { return keyStore; } + /** + * Transports supported by server + * + * @param transports - list of transports + */ + public void setTransports(List transports) { + if (transports.isEmpty()) { + throw new IllegalArgumentException("Transports list can't be empty"); + } + this.transports = join(transports); + } + // used in cloning + private void setTransports(String transports) { + this.transports = transports; + } + public String getTransports() { + return transports; + } + } diff --git a/src/main/java/com/corundumstudio/socketio/Transport.java b/src/main/java/com/corundumstudio/socketio/Transport.java new file mode 100644 index 0000000..a23c1bc --- /dev/null +++ b/src/main/java/com/corundumstudio/socketio/Transport.java @@ -0,0 +1,38 @@ +/** + * Copyright 2012 Nikita Koksharov + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.corundumstudio.socketio; + +import com.corundumstudio.socketio.transport.FlashSocketTransport; +import com.corundumstudio.socketio.transport.WebSocketTransport; +import com.corundumstudio.socketio.transport.XHRPollingTransport; + +public enum Transport { + + WEBSOCKET(WebSocketTransport.NAME), + FLASHSOCKET(FlashSocketTransport.NAME), + XHRPOLLING(XHRPollingTransport.NAME); + + private final String value; + + Transport(String value) { + this.value = value; + } + + public String getValue() { + return value; + } + +}