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 import tests.wsgi_test
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(tests.wsgi_test._TestBase):
41 def test_incomplete_headers_13(self):
42 headers = dict(kv.split(': ') for kv in [
44 # NOTE: intentionally no connection header
45 "Host: %s:%s" % self.server_addr,
46 "Origin: http://%s:%s" % self.server_addr,
47 "Sec-WebSocket-Version: 13",
49 http = httplib.HTTPConnection(*self.server_addr)
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: %s:%s" % self.server_addr,
62 "Origin: http://%s:%s" % self.server_addr,
63 "Sec-WebSocket-Version: 13",
65 http = httplib.HTTPConnection(*self.server_addr)
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: %s:%s" % self.server_addr,
77 "Origin: http://%s:%s" % self.server_addr,
78 "Sec-WebSocket-Version: 13",
80 http = httplib.HTTPConnection(*self.server_addr)
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: %s:%s" % self.server_addr,
95 "Origin: http://%s:%s" % self.server_addr,
96 "Sec-WebSocket-Version: 13",
97 "Sec-WebSocket-Key: d9MXuOzlVQ0h+qRllvSCIg==",
99 sock = eventlet.connect(self.server_addr)
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: %s:%s" % self.server_addr,
118 "Origin: http://%s:%s" % self.server_addr,
119 "Sec-WebSocket-Version: 13",
120 "Sec-WebSocket-Key: d9MXuOzlVQ0h+qRllvSCIg==",
122 sock = eventlet.connect(self.server_addr)
123 sock.sendall(six.b('\r\n'.join(connect) + '\r\n\r\n'))
125 ws = websocket.RFC6455WebSocket(sock, {}, client=True)
127 assert ws.wait() == b'hello'
128 ws.send(b'hello world!\x01')
129 ws.send(u'hello world again!')
130 assert ws.wait() == b'hello world!\x01'
131 assert ws.wait() == u'hello world again!'
135 def test_breaking_the_connection_13(self):
136 error_detected = [False]
137 done_with_request = event.Event()
140 def error_detector(environ, start_response):
143 return site(environ, start_response)
145 error_detected[0] = True
148 done_with_request.send(True)
149 self.site = error_detector
152 "GET /echo HTTP/1.1",
153 "Upgrade: websocket",
154 "Connection: Upgrade",
155 "Host: %s:%s" % self.server_addr,
156 "Origin: http://%s:%s" % self.server_addr,
157 "Sec-WebSocket-Version: 13",
158 "Sec-WebSocket-Key: d9MXuOzlVQ0h+qRllvSCIg==",
160 sock = eventlet.connect(self.server_addr)
161 sock.sendall(six.b('\r\n'.join(connect) + '\r\n\r\n'))
162 sock.recv(1024) # get the headers
163 sock.close() # close while the app is running
164 done_with_request.wait()
165 assert not error_detected[0]
167 def test_client_closing_connection_13(self):
168 error_detected = [False]
169 done_with_request = event.Event()
172 def error_detector(environ, start_response):
175 return site(environ, start_response)
177 error_detected[0] = True
180 done_with_request.send(True)
181 self.site = error_detector
184 "GET /echo HTTP/1.1",
185 "Upgrade: websocket",
186 "Connection: Upgrade",
187 "Host: %s:%s" % self.server_addr,
188 "Origin: http://%s:%s" % self.server_addr,
189 "Sec-WebSocket-Version: 13",
190 "Sec-WebSocket-Key: d9MXuOzlVQ0h+qRllvSCIg==",
192 sock = eventlet.connect(self.server_addr)
193 sock.sendall(six.b('\r\n'.join(connect) + '\r\n\r\n'))
194 sock.recv(1024) # get the headers
195 closeframe = struct.pack('!BBIH', 1 << 7 | 8, 1 << 7 | 2, 0, 1000)
196 sock.sendall(closeframe) # "Close the connection" packet.
197 done_with_request.wait()
198 assert not error_detected[0]
200 def test_client_invalid_packet_13(self):
201 error_detected = [False]
202 done_with_request = event.Event()
205 def error_detector(environ, start_response):
208 return site(environ, start_response)
210 error_detected[0] = True
213 done_with_request.send(True)
214 self.site = error_detector
217 "GET /echo HTTP/1.1",
218 "Upgrade: websocket",
219 "Connection: Upgrade",
220 "Host: %s:%s" % self.server_addr,
221 "Origin: http://%s:%s" % self.server_addr,
222 "Sec-WebSocket-Version: 13",
223 "Sec-WebSocket-Key: d9MXuOzlVQ0h+qRllvSCIg==",
225 sock = eventlet.connect(self.server_addr)
226 sock.sendall(six.b('\r\n'.join(connect) + '\r\n\r\n'))
227 sock.recv(1024) # get the headers
228 sock.sendall(b'\x07\xff') # Weird packet.
229 done_with_request.wait()
230 assert not error_detected[0]