summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--eventlet/websocket.py15
-rw-r--r--tests/manual/websocket-gunicorn.py48
2 files changed, 61 insertions, 2 deletions
diff --git a/eventlet/websocket.py b/eventlet/websocket.py
index 9321956..1fdb3bf 100644
--- a/eventlet/websocket.py
+++ b/eventlet/websocket.py
@@ -135,7 +135,12 @@ class WebSocketWSGI(object):
return wsgi.ALREADY_HANDLED
def _handle_legacy_request(self, environ):
- sock = environ['eventlet.input'].get_socket()
+ if 'eventlet.input' in environ:
+ sock = environ['eventlet.input'].get_socket()
+ elif 'gunicorn.socket' in environ:
+ sock = environ['gunicorn.socket']
+ else:
+ raise Exception('No eventlet.input or gunicorn.socket present in environ.')
if 'HTTP_SEC_WEBSOCKET_KEY1' in environ:
self.protocol_version = 76
@@ -192,7 +197,13 @@ class WebSocketWSGI(object):
return WebSocket(sock, environ, self.protocol_version)
def _handle_hybi_request(self, environ):
- sock = environ['eventlet.input'].get_socket()
+ if 'eventlet.input' in environ:
+ sock = environ['eventlet.input'].get_socket()
+ elif 'gunicorn.socket' in environ:
+ sock = environ['gunicorn.socket']
+ else:
+ raise Exception('No eventlet.input or gunicorn.socket present in environ.')
+
hybi_version = environ['HTTP_SEC_WEBSOCKET_VERSION']
if hybi_version not in ('8', '13', ):
raise BadRequest(status='426 Upgrade Required',
diff --git a/tests/manual/websocket-gunicorn.py b/tests/manual/websocket-gunicorn.py
new file mode 100644
index 0000000..88b823a
--- /dev/null
+++ b/tests/manual/websocket-gunicorn.py
@@ -0,0 +1,48 @@
+import eventlet.websocket
+import gunicorn
+import os
+import random
+import sys
+
+
+@eventlet.websocket.WebSocketWSGI
+def wsapp(ws):
+ ws.send(b'test pass')
+ ws.close()
+
+
+def app(environ, start_response):
+ body = b'''<!doctype html>
+<h1 id=status>loading...</h1>
+<script>
+ (function(D) {
+ ws = new WebSocket('ws://127.0.0.1:5001/');
+ ws.onmessage = function(msg) {
+ var fr = new FileReader();
+ fr.onload = function(ev) {
+ D.getElementById('status').innerHTML = ev.target.result;
+ }
+ fr.readAsText(msg.data);
+ };
+ ws.onerror = function() {
+ D.getElementById('status').innerHTML = 'test fail';
+ }
+ })(document);
+</script>
+'''
+ if environ.get('HTTP_UPGRADE') == 'websocket':
+ return wsapp(environ, start_response)
+
+ start_response(
+ '200 OK', (
+ ('Content-type', 'text/html'),
+ ('Content-Length', str(len(body))),
+ ('X-Gunicorn-Version', gunicorn.__version__),
+ ),
+ )
+ return [body]
+
+if __name__ == '__main__':
+ cmd = 'gunicorn websocket-gunicorn:app -b 127.0.0.1:5001 -k eventlet -w 1'
+ sys.stderr.write('exec ' + cmd + '\n')
+ os.system(cmd)