5 from eventlet import event
6 from eventlet import websocket
7 from eventlet.green import httplib
8 from eventlet.green import socket
10 from tests.wsgi_test import _TestBase
15 if ws.path == '/echo':
21 elif ws.path == '/range':
25 elif ws.path == '/error':
26 # some random socket error that we shouldn't normally get
27 raise socket.error(errno.ENOTSOCK)
31 wsapp = websocket.WebSocketWSGI(handle)
34 class TestWebSocket(_TestBase):
40 def test_incomplete_headers_13(self):
41 headers = dict(kv.split(': ') for kv in [
43 # NOTE: intentionally no connection header
44 "Host: localhost:%s" % self.port,
45 "Origin: http://localhost:%s" % self.port,
46 "Sec-WebSocket-Version: 13",
48 http = httplib.HTTPConnection('localhost', self.port)
49 http.request("GET", "/echo", headers=headers)
50 resp = http.getresponse()
52 self.assertEqual(resp.status, 400)
53 self.assertEqual(resp.getheader('connection'), 'close')
54 self.assertEqual(resp.read(), '')
57 headers = dict(kv.split(': ') for kv in [
59 "Connection: Upgrade",
60 "Host: localhost:%s" % self.port,
61 "Origin: http://localhost:%s" % self.port,
62 "Sec-WebSocket-Version: 13",
64 http = httplib.HTTPConnection('localhost', self.port)
65 http.request("GET", "/echo", headers=headers)
66 resp = http.getresponse()
68 self.assertEqual(resp.status, 400)
69 self.assertEqual(resp.getheader('connection'), 'close')
70 self.assertEqual(resp.read(), '')
73 headers = dict(kv.split(': ') for kv in [
74 "Connection: Upgrade",
75 "Host: localhost:%s" % self.port,
76 "Origin: http://localhost:%s" % self.port,
77 "Sec-WebSocket-Version: 13",
79 http = httplib.HTTPConnection('localhost', self.port)
80 http.request("GET", "/echo", headers=headers)
81 resp = http.getresponse()
83 self.assertEqual(resp.status, 400)
84 self.assertEqual(resp.getheader('connection'), 'close')
85 self.assertEqual(resp.read(), '')
87 def test_correct_upgrade_request_13(self):
88 for http_connection in ['Upgrade', 'UpGrAdE', 'keep-alive, Upgrade']:
92 "Connection: %s" % http_connection,
93 "Host: localhost:%s" % self.port,
94 "Origin: http://localhost:%s" % self.port,
95 "Sec-WebSocket-Version: 13",
96 "Sec-WebSocket-Key: d9MXuOzlVQ0h+qRllvSCIg==",
98 sock = eventlet.connect(('localhost', self.port))
100 sock.sendall('\r\n'.join(connect) + '\r\n\r\n')
101 result = sock.recv(1024)
102 # The server responds the correct Websocket handshake
103 print('Connection string: %r' % http_connection)
104 self.assertEqual(result, '\r\n'.join([
105 'HTTP/1.1 101 Switching Protocols',
106 'Upgrade: websocket',
107 'Connection: Upgrade',
108 'Sec-WebSocket-Accept: ywSyWXCPNsDxLrQdQrn5RFNRfBU=\r\n\r\n',
111 def test_send_recv_13(self):
113 "GET /echo HTTP/1.1",
114 "Upgrade: websocket",
115 "Connection: Upgrade",
116 "Host: localhost:%s" % self.port,
117 "Origin: http://localhost:%s" % self.port,
118 "Sec-WebSocket-Version: 13",
119 "Sec-WebSocket-Key: d9MXuOzlVQ0h+qRllvSCIg==",
121 sock = eventlet.connect(
122 ('localhost', self.port))
124 sock.sendall('\r\n'.join(connect) + '\r\n\r\n')
126 ws = websocket.RFC6455WebSocket(sock, {}, client=True)
128 assert ws.wait() == 'hello'
129 ws.send('hello world!\x01')
130 ws.send(u'hello world again!')
131 assert ws.wait() == 'hello world!\x01'
132 assert ws.wait() == u'hello world again!'
136 def test_breaking_the_connection_13(self):
137 error_detected = [False]
138 done_with_request = event.Event()
141 def error_detector(environ, start_response):
144 return site(environ, start_response)
146 error_detected[0] = True
149 done_with_request.send(True)
150 self.site = error_detector
153 "GET /echo HTTP/1.1",
154 "Upgrade: websocket",
155 "Connection: Upgrade",
156 "Host: localhost:%s" % self.port,
157 "Origin: http://localhost:%s" % self.port,
158 "Sec-WebSocket-Version: 13",
159 "Sec-WebSocket-Key: d9MXuOzlVQ0h+qRllvSCIg==",
161 sock = eventlet.connect(
162 ('localhost', self.port))
163 sock.sendall('\r\n'.join(connect) + '\r\n\r\n')
164 sock.recv(1024) # get the headers
165 sock.close() # close while the app is running
166 done_with_request.wait()
167 assert not error_detected[0]
169 def test_client_closing_connection_13(self):
170 error_detected = [False]
171 done_with_request = event.Event()
174 def error_detector(environ, start_response):
177 return site(environ, start_response)
179 error_detected[0] = True
182 done_with_request.send(True)
183 self.site = error_detector
186 "GET /echo HTTP/1.1",
187 "Upgrade: websocket",
188 "Connection: Upgrade",
189 "Host: localhost:%s" % self.port,
190 "Origin: http://localhost:%s" % self.port,
191 "Sec-WebSocket-Version: 13",
192 "Sec-WebSocket-Key: d9MXuOzlVQ0h+qRllvSCIg==",
194 sock = eventlet.connect(
195 ('localhost', self.port))
196 sock.sendall('\r\n'.join(connect) + '\r\n\r\n')
197 sock.recv(1024) # get the headers
198 closeframe = struct.pack('!BBIH', 1 << 7 | 8, 1 << 7 | 2, 0, 1000)
199 sock.sendall(closeframe) # "Close the connection" packet.
200 done_with_request.wait()
201 assert not error_detected[0]
203 def test_client_invalid_packet_13(self):
204 error_detected = [False]
205 done_with_request = event.Event()
208 def error_detector(environ, start_response):
211 return site(environ, start_response)
213 error_detected[0] = True
216 done_with_request.send(True)
217 self.site = error_detector
220 "GET /echo HTTP/1.1",
221 "Upgrade: websocket",
222 "Connection: Upgrade",
223 "Host: localhost:%s" % self.port,
224 "Origin: http://localhost:%s" % self.port,
225 "Sec-WebSocket-Version: 13",
226 "Sec-WebSocket-Key: d9MXuOzlVQ0h+qRllvSCIg==",
228 sock = eventlet.connect(
229 ('localhost', self.port))
230 sock.sendall('\r\n'.join(connect) + '\r\n\r\n')
231 sock.recv(1024) # get the headers
232 sock.sendall('\x07\xff') # Weird packet.
233 done_with_request.wait()
234 assert not error_detected[0]