From ca9ed3d8ddb6530a06e069ff2b5fa5e0ea06a6f4 Mon Sep 17 00:00:00 2001 From: Tilman Griesel Date: Tue, 28 Aug 2012 17:34:24 +0200 Subject: [PATCH 1/2] added SecureSocket support - added an option to use the new SecureSocket class to build on SSL/TLS web socket connections --- .../src/net/gimite/websocket/WebSocket.as | 40 ++++++++++++++----- 1 file changed, 29 insertions(+), 11 deletions(-) diff --git a/flash-src/src/net/gimite/websocket/WebSocket.as b/flash-src/src/net/gimite/websocket/WebSocket.as index 0f32017..e9caea1 100644 --- a/flash-src/src/net/gimite/websocket/WebSocket.as +++ b/flash-src/src/net/gimite/websocket/WebSocket.as @@ -60,6 +60,8 @@ public class WebSocket extends EventDispatcher { private var rawSocket:Socket; private var tlsSocket:TLSSocket; private var tlsConfig:TLSConfig; + private var secureSocket:SecureSocket; + private var socket:Socket; private var acceptedProtocol:String; @@ -72,11 +74,13 @@ public class WebSocket extends EventDispatcher { private var logger:IWebSocketLogger; private var base64Encoder:Base64Encoder = new Base64Encoder(); + private var useFlashSecureSocket:Boolean = false; + public function WebSocket( id:int, url:String, protocols:Array, origin:String, proxyHost:String, proxyPort:int, cookie:String, headers:String, - logger:IWebSocketLogger) { + logger:IWebSocketLogger, useFlashSecureSocket:Boolean = false) { this.logger = logger; this.id = id; this.url = url; @@ -90,6 +94,7 @@ public class WebSocket extends EventDispatcher { this.origin = origin; this.requestedProtocols = protocols; this.cookie = cookie; + this.useFlashSecureSocket = useFlashSecureSocket; // if present and not the empty string, headers MUST end with \r\n // headers should be zero or more complete lines, for example // "Header1: xxx\r\nHeader2: yyyy\r\n" @@ -106,14 +111,24 @@ public class WebSocket extends EventDispatcher { } else { rawSocket = new Socket(); if (scheme == "wss") { - tlsConfig= new TLSConfig(TLSEngine.CLIENT, - null, null, null, null, null, - TLSSecurityParameters.PROTOCOL_VERSION); - tlsConfig.trustAllCertificates = true; - tlsConfig.ignoreCommonNameMismatch = true; - tlsSocket = new TLSSocket(); - tlsSocket.addEventListener(ProgressEvent.SOCKET_DATA, onSocketData); - socket = tlsSocket; + if(!useFlashSecureSocket) { + logger.log('using tlsSocket'); + tlsConfig= new TLSConfig(TLSEngine.CLIENT, + null, null, null, null, null, + TLSSecurityParameters.PROTOCOL_VERSION); + tlsConfig.trustAllCertificates = true; + tlsConfig.ignoreCommonNameMismatch = true; + tlsSocket = new TLSSocket(); + tlsSocket.addEventListener(ProgressEvent.SOCKET_DATA, onSocketData); + socket = tlsSocket; + } + else + { + logger.log('using internal SecureSocket'); + secureSocket = new SecureSocket(); + secureSocket.addEventListener(ProgressEvent.SOCKET_DATA, onSocketData); + rawSocket = socket = secureSocket; + } } else { rawSocket.addEventListener(ProgressEvent.SOCKET_DATA, onSocketData); socket = rawSocket; @@ -220,8 +235,11 @@ public class WebSocket extends EventDispatcher { logger.log("connected"); if (scheme == "wss") { - logger.log("starting SSL/TLS"); - tlsSocket.startTLS(rawSocket, host, tlsConfig); + if(!useFlashSecureSocket) + { + logger.log("starting SSL/TLS"); + tlsSocket.startTLS(rawSocket, host, tlsConfig); + } } var defaultPort:int = scheme == "wss" ? 443 : 80; From ab06d97863d43ea6b30425768e283c277ece36eb Mon Sep 17 00:00:00 2001 From: Tilman Griesel Date: Thu, 30 Aug 2012 15:48:30 +0200 Subject: [PATCH 2/2] added connection timeout param --- .../src/net/gimite/websocket/WebSocket.as | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/flash-src/src/net/gimite/websocket/WebSocket.as b/flash-src/src/net/gimite/websocket/WebSocket.as index e9caea1..728d57a 100644 --- a/flash-src/src/net/gimite/websocket/WebSocket.as +++ b/flash-src/src/net/gimite/websocket/WebSocket.as @@ -74,13 +74,16 @@ public class WebSocket extends EventDispatcher { private var logger:IWebSocketLogger; private var base64Encoder:Base64Encoder = new Base64Encoder(); - private var useFlashSecureSocket:Boolean = false; + private var useFlashSecureSocket:Boolean; + private var connectionTimeout:int; public function WebSocket( - id:int, url:String, protocols:Array, origin:String, - proxyHost:String, proxyPort:int, - cookie:String, headers:String, - logger:IWebSocketLogger, useFlashSecureSocket:Boolean = false) { + id:int, url:String, protocols:Array, origin:String, + proxyHost:String, proxyPort:int, + cookie:String, headers:String, + logger:IWebSocketLogger, + useFlashSecureSocket:Boolean = false, + connectionTimeout:int = 1000) { this.logger = logger; this.id = id; this.url = url; @@ -95,6 +98,7 @@ public class WebSocket extends EventDispatcher { this.requestedProtocols = protocols; this.cookie = cookie; this.useFlashSecureSocket = useFlashSecureSocket; + this.connectionTimeout = connectionTimeout; // if present and not the empty string, headers MUST end with \r\n // headers should be zero or more complete lines, for example // "Header1: xxx\r\nHeader2: yyyy\r\n" @@ -134,6 +138,10 @@ public class WebSocket extends EventDispatcher { socket = rawSocket; } } + + // apply timeout to socket connections + rawSocket.timeout = socket.timeout = connectionTimeout; + rawSocket.addEventListener(Event.CLOSE, onSocketClose); rawSocket.addEventListener(Event.CONNECT, onSocketConnect); rawSocket.addEventListener(IOErrorEvent.IO_ERROR, onSocketIoError);