Fixed bug exposed by redbo's unit test, tweaked test itself a bit based on experimentation.
This commit is contained in:
@@ -471,7 +471,14 @@ class Server(BaseHTTPServer.HTTPServer):
|
|||||||
def log_message(self, message):
|
def log_message(self, message):
|
||||||
self.log.write(message + '\n')
|
self.log.write(message + '\n')
|
||||||
|
|
||||||
ACCEPT_SOCK = set((errno.EPIPE, errno.EBADF))
|
try:
|
||||||
|
import ssl
|
||||||
|
ACCEPT_EXCEPTIONS = (socket.error, ssl.SSLError)
|
||||||
|
ACCEPT_ERRNO = set((errno.EPIPE, errno.EBADF,
|
||||||
|
ssl.SSL_ERROR_EOF, ssl.SSL_ERROR_SSL))
|
||||||
|
except ImportError:
|
||||||
|
ACCEPT_EXCEPTIONS = (socket.error,)
|
||||||
|
ACCEPT_ERRNO = set((errno.EPIPE, errno.EBADF))
|
||||||
|
|
||||||
def server(sock, site,
|
def server(sock, site,
|
||||||
log=None,
|
log=None,
|
||||||
@@ -536,19 +543,18 @@ def server(sock, site,
|
|||||||
serv.log.write("(%s) wsgi starting up on %s://%s%s/\n" % (os.getpid(), scheme, host, port))
|
serv.log.write("(%s) wsgi starting up on %s://%s%s/\n" % (os.getpid(), scheme, host, port))
|
||||||
while True:
|
while True:
|
||||||
try:
|
try:
|
||||||
|
client_socket = sock.accept()
|
||||||
try:
|
try:
|
||||||
client_socket = sock.accept()
|
pool.spawn_n(serv.process_request, client_socket)
|
||||||
except socket.error, e:
|
|
||||||
if get_errno(e) not in ACCEPT_SOCK:
|
|
||||||
raise
|
|
||||||
try:
|
|
||||||
pool.spawn_n(serv.process_request, client_socket)
|
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
warnings.warn("wsgi's pool should be an instance of " \
|
warnings.warn("wsgi's pool should be an instance of " \
|
||||||
"eventlet.greenpool.GreenPool, is %s. Please convert your"\
|
"eventlet.greenpool.GreenPool, is %s. Please convert your"\
|
||||||
" call site to use GreenPool instead" % type(pool),
|
" call site to use GreenPool instead" % type(pool),
|
||||||
DeprecationWarning, stacklevel=2)
|
DeprecationWarning, stacklevel=2)
|
||||||
pool.execute_async(serv.process_request, client_socket)
|
pool.execute_async(serv.process_request, client_socket)
|
||||||
|
except ACCEPT_EXCEPTIONS, e:
|
||||||
|
if get_errno(e) not in ACCEPT_ERRNO:
|
||||||
|
raise
|
||||||
except (KeyboardInterrupt, SystemExit):
|
except (KeyboardInterrupt, SystemExit):
|
||||||
serv.log.write("wsgi exiting\n")
|
serv.log.write("wsgi exiting\n")
|
||||||
break
|
break
|
||||||
|
|||||||
@@ -741,19 +741,32 @@ class TestHttpd(LimitedTestCase):
|
|||||||
try:
|
try:
|
||||||
wsgi.server(sock=sock, site=hello_world, log=self.logfile)
|
wsgi.server(sock=sock, site=hello_world, log=self.logfile)
|
||||||
errored[0] = 'SSL handshake error caused wsgi.server to exit.'
|
errored[0] = 'SSL handshake error caused wsgi.server to exit.'
|
||||||
|
except greenthread.greenlet.GreenletExit:
|
||||||
|
pass
|
||||||
except Exception, e:
|
except Exception, e:
|
||||||
errored[0] = 'SSL handshake error raised exception %s.' % e
|
errored[0] = 'SSL handshake error raised exception %s.' % e
|
||||||
srv_sock = api.ssl_listener(('localhost', 0), certificate_file, private_key_file)
|
|
||||||
port = srv_sock.getsockname()[1]
|
|
||||||
for data in ('', 'GET /non-ssl-request HTTP/1.0\r\n\r\n'):
|
for data in ('', 'GET /non-ssl-request HTTP/1.0\r\n\r\n'):
|
||||||
g = eventlet.spawn(server, srv_sock)
|
srv_sock = api.ssl_listener(('localhost', 0), certificate_file, private_key_file)
|
||||||
sock = api.connect_tcp(('localhost', port))
|
port = srv_sock.getsockname()[1]
|
||||||
|
g = eventlet.spawn_n(server, srv_sock)
|
||||||
|
client = api.connect_tcp(('localhost', port))
|
||||||
if data: # send non-ssl request
|
if data: # send non-ssl request
|
||||||
sock.sendall(data)
|
client.sendall(data)
|
||||||
else: # close sock prematurely
|
else: # close sock prematurely
|
||||||
sock.close()
|
client.close()
|
||||||
api.sleep(0) # let context switch back to server
|
api.sleep(0) # let context switch back to server
|
||||||
self.assert_(not errored[0], errored[0])
|
self.assert_(not errored[0], errored[0])
|
||||||
|
# make another request to ensure the server's still alive
|
||||||
|
try:
|
||||||
|
from eventlet.green import ssl
|
||||||
|
client = ssl.wrap_socket(api.connect_tcp(('localhost', port)))
|
||||||
|
client.write('GET / HTTP/1.0\r\nHost: localhost\r\n\r\n')
|
||||||
|
result = client.read()
|
||||||
|
self.assert_(result.startswith('HTTP'), result)
|
||||||
|
self.assert_(result.endswith('hello world'))
|
||||||
|
except ImportError:
|
||||||
|
pass # TODO: should test with OpenSSL
|
||||||
|
greenthread.kill(g)
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
main()
|
main()
|
||||||
|
|||||||
Reference in New Issue
Block a user