11# -*- coding: utf-8 -*-
22import socket
33from urlparse import urlsplit
4+ import ssl
45
56from tornado import iostream , escape
67from ws4py .client import WebSocketBaseClient
8+ from ws4py .exc import HandshakeError
79
810__all__ = ['TornadoWebSocketClient' ]
911
1012class TornadoWebSocketClient (WebSocketBaseClient ):
1113 def __init__ (self , url , protocols = None , extensions = None , io_loop = None ):
1214 WebSocketBaseClient .__init__ (self , url , protocols , extensions )
13- self .io = iostream .IOStream (self .sock , io_loop )
15+ parts = urlsplit (self .url )
16+ if parts .scheme == "wss" :
17+ self .sock = ssl .wrap_socket (self .sock ,
18+ do_handshake_on_connect = False )
19+ self .io = iostream .SSLIOStream (self .sock , io_loop )
20+ else :
21+ self .io = iostream .IOStream (self .sock , io_loop )
1422 self .sender = self .io .write
23+ self .io_loop = io_loop
1524
1625 def connect (self ):
1726 parts = urlsplit (self .url )
1827 host , port = parts .netloc , 80
1928 if ':' in host :
2029 host , port = parts .netloc .split (':' )
30+ self .io .set_close_callback (self .__connection_refused )
2131 self .io .connect ((host , int (port )), self .__send_handshake )
2232
33+ def __connection_refused (self , * args , ** kwargs ):
34+ self .server_terminated = True
35+ self .closed (1005 , 'Connection refused' )
36+
2337 def __send_handshake (self ):
2438 self .io .set_close_callback (self .__connection_closed )
2539 self .io .write (escape .utf8 (self .handshake_request ),
2640 self .__handshake_sent )
27-
41+
2842 def __connection_closed (self , * args , ** kwargs ):
2943 self .server_terminated = True
3044 self .closed (1006 , 'Connection closed during handshake' )
31-
45+
3246 def __handshake_sent (self ):
3347 self .io .read_until ("\r \n \r \n " , self .__handshake_completed )
3448
@@ -41,7 +55,7 @@ def __handshake_completed(self, data):
4155 except HandshakeError :
4256 self .close_connection ()
4357 raise
44-
58+
4559 self .opened ()
4660 self .io .set_close_callback (self .__stream_closed )
4761 self .io .read_bytes (self .reading_buffer_size , self .__fetch_more )
@@ -59,7 +73,7 @@ def __fetch_more(self, bytes):
5973
6074 def __gracefully_terminate (self ):
6175 self .client_terminated = self .server_terminated = True
62-
76+
6377 try :
6478 if not self .stream .closing :
6579 self .closed (1006 )
@@ -88,7 +102,7 @@ def data_provider():
88102 yield "#" * i
89103
90104 self .send (data_provider ())
91-
105+
92106 for i in range (0 , 200 , 25 ):
93107 self .send ("*" * i )
94108
@@ -99,9 +113,9 @@ def received_message(self, m):
99113
100114 def closed (self , code , reason = None ):
101115 ioloop .IOLoop .instance ().stop ()
102-
116+
103117 ws = MyClient ('http://localhost:9000/ws' , protocols = ['http-only' , 'chat' ])
104118 ws .connect ()
105-
119+
106120 ioloop .IOLoop .instance ().start ()
107121
0 commit comments