2016-10-11 3 views
1

Ceci est un extrait de code simple qui répète systématiquement le problème que je rencontre. J'utilise Python 2.7.12, Flask 0.11, Flask-SocketIO 2.7.1 et gevent 1.1.2. Je comprends que c'est probablement un problème qui a été soulevé dans la liste de diffusion du paquet responsable, mais je ne peux pas déterminer lequel est responsable. Cependant, je suis sûr que c'est un problème avec gevent parce que c'est ce qui soulève l'exception.Pourquoi Flask + SocketIO + Gevent me donne-t-il des erreurs SSL EOF?

from flask import Flask 
from flask_socketio import SocketIO 

from gevent import monkey 
monkey.patch_all() 

import ssl 

app = Flask(__name__) 
app.config['SECRET_KEY'] = 'secret' 

socketio = SocketIO(app, async_mode='gevent') 

@app.route('/') 
def index(): 
    return "Hello World!" 

@socketio.on('connect') 
def handle_connect_event(): 
    print('Client connected') 

if __name__ == '__main__': 
    socketio.run(app, host='127.0.0.1', port=8443, 
       certfile='ssl/server/server.cer', keyfile='ssl/server/server.key', 
       ca_certs='ssl/server/ca.cer', cert_reqs=ssl.CERT_REQUIRED, 
       ssl_version=ssl.PROTOCOL_TLSv1_2) 

Et voici l'erreur que je reçois lorsque le client se connecte:

Traceback (most recent call last): 
    File "/usr/lib/python2.7/site-packages/gevent/greenlet.py", line 534, in 
    result = self._run(*self.args, **self.kwargs) 
    File "/usr/lib/python2.7/site-packages/gevent/baseserver.py", line 25, in 
    return handle(*args_tuple) 
    File "/usr/lib/python2.7/site-packages/gevent/server.py", line 126, in wr 
    ssl_socket = self.wrap_socket(client_socket, **self.ssl_args) 
    File "/usr/lib/python2.7/site-packages/gevent/_sslgte279.py", line 691, i 
    ciphers=ciphers) 
    File "/usr/lib/python2.7/site-packages/gevent/_sslgte279.py", line 271, i 
    raise x 

    SSLEOFError: EOF occurred in violation of protocol (_ssl.c:590) 
    <Greenlet at 0x7fdd593c94b0: _handle_and_close_when_done(<bound method WSGInd method WSGIServer.do_close of <WSGIServer a, (<socket at 0x7fdd590f4410 SSLEOFError 

Mon système a également la version OpenSSL 1.0.2.j si cela aide. Toute réflexion sera apprécié!

+0

Ce m'a été rapporté avant (voir https://github.com/miguelgrinberg/Flask-SocketIO/issues/88), mais jamais trouvé ce qui était la question. Il est tout à fait possible que ce soit un bug lié au gevent. Vous pouvez être en mesure de contourner ce problème si vous avez un serveur proxy que vous pouvez configurer pour mettre fin à votre SSL, car la personne dans le bogue signalé que j'ai lié l'a fait. – Miguel

Répondre

0

Utilisez patch_all au-dessus du code. Même avant l'importation de flask et de socketio.

from gevent import monkey 
monkey.patch_all() 

from flask import Flask 
from flask_socketio import SocketIO 

import ssl 
+0

Cela ne semble pas aider. – smbullet