diff --git a/flash-src/src/net/gimite/websocket/WebSocket.as b/flash-src/src/net/gimite/websocket/WebSocket.as index 0f32017..728d57a 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,16 @@ public class WebSocket extends EventDispatcher { private var logger:IWebSocketLogger; private var base64Encoder:Base64Encoder = new Base64Encoder(); + 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) { + 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; @@ -90,6 +97,8 @@ public class WebSocket extends EventDispatcher { this.origin = origin; 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" @@ -106,19 +115,33 @@ 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; } } + + // 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); @@ -220,8 +243,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;