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 )
@@ -29,11 +38,11 @@ def __send_handshake(self):
2938 self .io .set_close_callback (self .__connection_closed )
3039 self .io .write (escape .utf8 (self .handshake_request ),
3140 self .__handshake_sent )
32-
41+
3342 def __connection_closed (self , * args , ** kwargs ):
3443 self .server_terminated = True
3544 self .closed (1006 , 'Connection closed during handshake' )
36-
45+
3746 def __handshake_sent (self ):
3847 self .io .read_until ("\r \n \r \n " , self .__handshake_completed )
3948
@@ -46,7 +55,7 @@ def __handshake_completed(self, data):
4655 except HandshakeError :
4756 self .close_connection ()
4857 raise
49-
58+
5059 self .opened ()
5160 self .io .set_close_callback (self .__stream_closed )
5261 self .io .read_bytes (self .reading_buffer_size , self .__fetch_more )
@@ -64,7 +73,7 @@ def __fetch_more(self, bytes):
6473
6574 def __gracefully_terminate (self ):
6675 self .client_terminated = self .server_terminated = True
67-
76+
6877 try :
6978 if not self .stream .closing :
7079 self .closed (1006 )
@@ -93,7 +102,7 @@ def data_provider():
93102 yield "#" * i
94103
95104 self .send (data_provider ())
96-
105+
97106 for i in range (0 , 200 , 25 ):
98107 self .send ("*" * i )
99108
@@ -104,9 +113,9 @@ def received_message(self, m):
104113
105114 def closed (self , code , reason = None ):
106115 ioloop .IOLoop .instance ().stop ()
107-
116+
108117 ws = MyClient ('http://localhost:9000/ws' , protocols = ['http-only' , 'chat' ])
109118 ws .connect ()
110-
119+
111120 ioloop .IOLoop .instance ().start ()
112121
0 commit comments