5 from eventlet import event
6 from eventlet import websocket
7 from eventlet.green import httplib
8 from eventlet.green import socket
9 from eventlet.support import six
11 from tests.wsgi_test import _TestBase
16 if ws.path == '/echo':
22 elif ws.path == '/range':
26 elif ws.path == '/error':
27 # some random socket error that we shouldn't normally get
28 raise socket.error(errno.ENOTSOCK)
32 wsapp = websocket.WebSocketWSGI(handle)
35 class TestWebSocket(_TestBase):
41 def test_incomplete_headers_13(self):
42 headers = dict(kv.split(': ') for kv in [
44 # NOTE: intentionally no connection header
45 "Host: localhost:%s" % self.port,
46 "Origin: http://localhost:%s" % self.port,
47 "Sec-WebSocket-Version: 13",
49 http = httplib.HTTPConnection('localhost', self.port)
50 http.request("GET", "/echo", headers=headers)
51 resp = http.getresponse()
53 self.assertEqual(resp.status, 400)
54 self.assertEqual(resp.getheader('connection'), 'close')
55 self.assertEqual(resp.read(), b'')
58 headers = dict(kv.split(': ') for kv in [
60 "Connection: Upgrade",
61 "Host: localhost:%s" % self.port,
62 "Origin: http://localhost:%s" % self.port,
63 "Sec-WebSocket-Version: 13",
65 http = httplib.HTTPConnection('localhost', self.port)
66 http.request("GET", "/echo", headers=headers)
67 resp = http.getresponse()
69 self.assertEqual(resp.status, 400)
70 self.assertEqual(resp.getheader('connection'), 'close')
71 self.assertEqual(resp.read(), b'')
74 headers = dict(kv.split(': ') for kv in [
75 "Connection: Upgrade",
76 "Host: localhost:%s" % self.port,
77 "Origin: http://localhost:%s" % self.port,
78 "Sec-WebSocket-Version: 13",
80 http = httplib.HTTPConnection('localhost', self.port)
81 http.request("GET", "/echo", headers=headers)
82 resp = http.getresponse()
84 self.assertEqual(resp.status, 400)
85 self.assertEqual(resp.getheader('connection'), 'close')
86 self.assertEqual(resp.read(), b'')
88 def test_correct_upgrade_request_13(self):
89 for http_connection in ['Upgrade', 'UpGrAdE', 'keep-alive, Upgrade']:
93 "Connection: %s" % http_connection,
94 "Host: localhost:%s" % self.port,
95 "Origin: http://localhost:%s" % self.port,
96 "Sec-WebSocket-Version: 13",
97 "Sec-WebSocket-Key: d9MXuOzlVQ0h+qRllvSCIg==",
99 sock = eventlet.connect(('localhost', self.port))
101 sock.sendall(six.b('\r\n'.join(connect) + '\r\n\r\n'))
102 result = sock.recv(1024)
103 # The server responds the correct Websocket handshake
104 print('Connection string: %r' % http_connection)
105 self.assertEqual(result, six.b('\r\n'.join([
106 'HTTP/1.1 101 Switching Protocols',
107 'Upgrade: websocket',
108 'Connection: Upgrade',
109 'Sec-WebSocket-Accept: ywSyWXCPNsDxLrQdQrn5RFNRfBU=\r\n\r\n',
112 def test_send_recv_13(self):
114 "GET /echo HTTP/1.1",
115 "Upgrade: websocket",
116 "Connection: Upgrade",
117 "Host: localhost:%s" % self.port,
118 "Origin: http://localhost:%s" % self.port,
119 "Sec-WebSocket-Version: 13",
120 "Sec-WebSocket-Key: d9MXuOzlVQ0h+qRllvSCIg==",
122 sock = eventlet.connect(
123 ('localhost', self.port))
125 sock.sendall(six.b('\r\n'.join(connect) + '\r\n\r\n'))
127 ws = websocket.RFC6455WebSocket(sock, {}, client=True)
129 assert ws.wait() == b'hello'
130 ws.send(b'hello world!\x01')
131 ws.send(u'hello world again!')
132 assert ws.wait() == b'hello world!\x01'
133 assert ws.wait() == u'hello world again!'
137 def test_breaking_the_connection_13(self):
138 error_detected = [False]
139 done_with_request = event.Event()
142 def error_detector(environ, start_response):
145 return site(environ, start_response)
147 error_detected[0] = True
150 done_with_request.send(True)
151 self.site = error_detector
154 "GET /echo HTTP/1.1",
155 "Upgrade: websocket",
156 "Connection: Upgrade",
157 "Host: localhost:%s" % self.port,
158 "Origin: http://localhost:%s" % self.port,
159 "Sec-WebSocket-Version: 13",
160 "Sec-WebSocket-Key: d9MXuOzlVQ0h+qRllvSCIg==",
162 sock = eventlet.connect(
163 ('localhost', self.port))
164 sock.sendall(six.b('\r\n'.join(connect) + '\r\n\r\n'))
165 sock.recv(1024) # get the headers
166 sock.close() # close while the app is running
167 done_with_request.wait()
168 assert not error_detected[0]
170 def test_client_closing_connection_13(self):
171 error_detected = [False]
172 done_with_request = event.Event()
175 def error_detector(environ, start_response):
178 return site(environ, start_response)
180 error_detected[0] = True
183 done_with_request.send(True)
184 self.site = error_detector
187 "GET /echo HTTP/1.1",
188 "Upgrade: websocket",
189 "Connection: Upgrade",
190 "Host: localhost:%s" % self.port,
191 "Origin: http://localhost:%s" % self.port,
192 "Sec-WebSocket-Version: 13",
193 "Sec-WebSocket-Key: d9MXuOzlVQ0h+qRllvSCIg==",
195 sock = eventlet.connect(
196 ('localhost', self.port))
197 sock.sendall(six.b('\r\n'.join(connect) + '\r\n\r\n'))
198 sock.recv(1024) # get the headers
199 closeframe = struct.pack('!BBIH', 1 << 7 | 8, 1 << 7 | 2, 0, 1000)
200 sock.sendall(closeframe) # "Close the connection" packet.
201 done_with_request.wait()
202 assert not error_detected[0]
204 def test_client_invalid_packet_13(self):
205 error_detected = [False]
206 done_with_request = event.Event()
209 def error_detector(environ, start_response):
212 return site(environ, start_response)
214 error_detected[0] = True
217 done_with_request.send(True)
218 self.site = error_detector
221 "GET /echo HTTP/1.1",
222 "Upgrade: websocket",
223 "Connection: Upgrade",
224 "Host: localhost:%s" % self.port,
225 "Origin: http://localhost:%s" % self.port,
226 "Sec-WebSocket-Version: 13",
227 "Sec-WebSocket-Key: d9MXuOzlVQ0h+qRllvSCIg==",
229 sock = eventlet.connect(
230 ('localhost', self.port))
231 sock.sendall(six.b('\r\n'.join(connect) + '\r\n\r\n'))
232 sock.recv(1024) # get the headers
233 sock.sendall(b'\x07\xff') # Weird packet.
234 done_with_request.wait()
235 assert not error_detected[0]