2013-10-01 4 views
1

Итак, я создаю сервер и делаю запрос к нему, все в том же файле.Gevent - SSL WSGIServer блокирует, когда он не должен

Это работает правильно:

import gevent 
import gevent.monkey 
gevent.monkey.patch_all() 

import requests 

from gevent.pywsgi import WSGIServer 
from flask import Flask 


app = Flask(__name__) 
app.debug = True 

# Simple catch-all server 
@app.route('/', defaults={'path': ''}, methods=['GET', 'POST']) 
@app.route('/<path:path>', methods=['GET', 'POST']) 
def catch_all(path): 
    return 'It is Working!' 


if __name__ == '__main__': 
    http_server = WSGIServer(('', 8080), app) 
    srv_greenlet = gevent.spawn(http_server.start) 
    gevent.sleep(0.5) 
    resp = requests.get('http://127.0.0.1:8080/') 
    print resp.text 
    http_server.stop() 
    gevent.joinall([srv_greenlet]) 

Выход:

(py2sni)[email protected]$ python question.py 
127.0.0.1 - - [2013-10-01 11:48:46] "GET/HTTP/1.1" 200 130 0.000614 
It is Working! 

Но это блоки, и я должен убить процесс извне:

import gevent 
import gevent.monkey 
gevent.monkey.patch_all() 

import requests 

from gevent.pywsgi import WSGIServer 
from flask import Flask 


app = Flask(__name__) 
app.debug = True 

# Simple catch-all server 
@app.route('/', defaults={'path': ''}, methods=['GET', 'POST']) 
@app.route('/<path:path>', methods=['GET', 'POST']) 
def catch_all(path): 
    return 'It is Working!' 


if __name__ == '__main__': 
    http_server = WSGIServer(('', 4430), app, keyfile='server.key', certfile='server.crt') 
    srv_greenlet = gevent.spawn(http_server.start) 
    gevent.sleep(0.5) 
    resp = requests.get('https://127.0.0.1:4430/') 
    print resp.text 
    http_server.stop() 
    gevent.joinall([srv_greenlet]) 

Единственная разница в этих двух скрипты - это то, что один использует SSL, а другой - нет. Где я могу сделать ошибку здесь? Если это помогает, я использую gevent 0.13.8 и запросы 2.0

ответ

2

Проблема here.

Это происходит только при использовании pyopenssl и gevent/greenlet. Поскольку повторение рукопожатия не имеет ввода-вывода, управление никогда не передается колбе для запуска зелья, поэтому рукопожатие никогда не будет успешным.

Я открыл сообщение об ошибке/pullrequest для этого по shazow/urllib3#250. Это должно быть просто, чтобы выполнить резервное копирование себя или дождаться следующего незначительного выпуска запросов.