Support ssl objects properly again. Support wsgi.server(max_http_version=)
This commit is contained in:
@@ -98,9 +98,9 @@ def socket_send(descriptor, data):
|
|||||||
if e[0] == errno.EWOULDBLOCK:
|
if e[0] == errno.EWOULDBLOCK:
|
||||||
return 0
|
return 0
|
||||||
raise
|
raise
|
||||||
except SSL.WantWriteError:
|
except util.SSL.WantWriteError:
|
||||||
return 0
|
return 0
|
||||||
except SSL.WantReadError:
|
except util.SSL.WantReadError:
|
||||||
return 0
|
return 0
|
||||||
finally:
|
finally:
|
||||||
if cancel:
|
if cancel:
|
||||||
@@ -124,11 +124,11 @@ def socket_recv(descriptor, buflen):
|
|||||||
if e[0] in SOCKET_CLOSED:
|
if e[0] in SOCKET_CLOSED:
|
||||||
return ''
|
return ''
|
||||||
raise
|
raise
|
||||||
except SSL.WantReadError:
|
except util.SSL.WantReadError:
|
||||||
return None
|
return None
|
||||||
except SSL.ZeroReturnError:
|
except util.SSL.ZeroReturnError:
|
||||||
return ''
|
return ''
|
||||||
except SSL.SysCallError, e:
|
except util.SSL.SysCallError, e:
|
||||||
if e[0] == -1 or e[0] > 0:
|
if e[0] == -1 or e[0] > 0:
|
||||||
raise socket.error(errno.ECONNRESET, errno.errorcode[errno.ECONNRESET])
|
raise socket.error(errno.ECONNRESET, errno.errorcode[errno.ECONNRESET])
|
||||||
raise
|
raise
|
||||||
@@ -287,6 +287,35 @@ class GreenSocket(object):
|
|||||||
return self.timeout
|
return self.timeout
|
||||||
|
|
||||||
|
|
||||||
|
def read(self, size=None):
|
||||||
|
if size is not None and not isinstance(size, (int, long)):
|
||||||
|
raise TypeError('Expecting an int or long for size, got %s: %s' % (type(size), repr(size)))
|
||||||
|
buf, self.sock.recvbuffer = self.sock.recvbuffer, ''
|
||||||
|
lst = [buf]
|
||||||
|
if size is None:
|
||||||
|
while True:
|
||||||
|
d = self.sock.recv(BUFFER_SIZE)
|
||||||
|
if not d:
|
||||||
|
break
|
||||||
|
lst.append(d)
|
||||||
|
else:
|
||||||
|
buflen = len(buf)
|
||||||
|
while buflen < size:
|
||||||
|
d = self.sock.recv(BUFFER_SIZE)
|
||||||
|
if not d:
|
||||||
|
break
|
||||||
|
buflen += len(d)
|
||||||
|
lst.append(d)
|
||||||
|
else:
|
||||||
|
d = lst[-1]
|
||||||
|
overbite = buflen - size
|
||||||
|
if overbite:
|
||||||
|
lst[-1], self.sock.recvbuffer = d[:-overbite], d[-overbite:]
|
||||||
|
else:
|
||||||
|
lst[-1], self.sock.recvbuffer = d, ''
|
||||||
|
return ''.join(lst)
|
||||||
|
|
||||||
|
|
||||||
class GreenFile(object):
|
class GreenFile(object):
|
||||||
newlines = '\r\n'
|
newlines = '\r\n'
|
||||||
mode = 'wb+'
|
mode = 'wb+'
|
||||||
@@ -368,33 +397,7 @@ class GreenFile(object):
|
|||||||
for line in lines:
|
for line in lines:
|
||||||
self.write(line)
|
self.write(line)
|
||||||
|
|
||||||
def read(self, size=None):
|
read = read
|
||||||
if size is not None and not isinstance(size, (int, long)):
|
|
||||||
raise TypeError('Expecting an int or long for size, got %s: %s' % (type(size), repr(size)))
|
|
||||||
buf, self.sock.recvbuffer = self.sock.recvbuffer, ''
|
|
||||||
lst = [buf]
|
|
||||||
if size is None:
|
|
||||||
while True:
|
|
||||||
d = self.sock.recv(BUFFER_SIZE)
|
|
||||||
if not d:
|
|
||||||
break
|
|
||||||
lst.append(d)
|
|
||||||
else:
|
|
||||||
buflen = len(buf)
|
|
||||||
while buflen < size:
|
|
||||||
d = self.sock.recv(BUFFER_SIZE)
|
|
||||||
if not d:
|
|
||||||
break
|
|
||||||
buflen += len(d)
|
|
||||||
lst.append(d)
|
|
||||||
else:
|
|
||||||
d = lst[-1]
|
|
||||||
overbite = buflen - size
|
|
||||||
if overbite:
|
|
||||||
lst[-1], self.sock.recvbuffer = d[:-overbite], d[-overbite:]
|
|
||||||
else:
|
|
||||||
lst[-1], self.sock.recvbuffer = d, ''
|
|
||||||
return ''.join(lst)
|
|
||||||
|
|
||||||
|
|
||||||
class GreenPipeSocket(GreenSocket):
|
class GreenPipeSocket(GreenSocket):
|
||||||
@@ -420,3 +423,21 @@ class GreenPipe(GreenFile):
|
|||||||
|
|
||||||
def flush(self):
|
def flush(self):
|
||||||
self.fd.fd.flush()
|
self.fd.fd.flush()
|
||||||
|
|
||||||
|
|
||||||
|
class GreenSSL(GreenSocket):
|
||||||
|
def __init__(self, fd):
|
||||||
|
GreenSocket.__init__(self, fd)
|
||||||
|
self.sock = self
|
||||||
|
|
||||||
|
read = read
|
||||||
|
|
||||||
|
def write(self, data):
|
||||||
|
return self.sendall(data)
|
||||||
|
|
||||||
|
def server(self):
|
||||||
|
return self.fd.server()
|
||||||
|
|
||||||
|
def issuer(self):
|
||||||
|
return self.fd.issuer()
|
||||||
|
|
||||||
|
@@ -88,7 +88,7 @@ def wrap_ssl(sock, certificate=None, private_key=None):
|
|||||||
## TODO only do this on client sockets? how?
|
## TODO only do this on client sockets? how?
|
||||||
connection = SSL.Connection(context, sock)
|
connection = SSL.Connection(context, sock)
|
||||||
connection.set_connect_state()
|
connection.set_connect_state()
|
||||||
return greenio.GreenSocket(connection)
|
return greenio.GreenSSL(connection)
|
||||||
|
|
||||||
socket_already_wrapped = False
|
socket_already_wrapped = False
|
||||||
def wrap_socket_with_coroutine_socket():
|
def wrap_socket_with_coroutine_socket():
|
||||||
|
@@ -37,6 +37,9 @@ from eventlet import api
|
|||||||
from eventlet.httpdate import format_date_time
|
from eventlet.httpdate import format_date_time
|
||||||
|
|
||||||
|
|
||||||
|
DEFAULT_MAX_HTTP_VERSION = 'HTTP/1.1'
|
||||||
|
|
||||||
|
|
||||||
class Input(object):
|
class Input(object):
|
||||||
def __init__(self, rfile, content_length, wfile=None, wfile_line=None):
|
def __init__(self, rfile, content_length, wfile=None, wfile_line=None):
|
||||||
self.rfile = rfile
|
self.rfile = rfile
|
||||||
@@ -76,6 +79,9 @@ class HttpProtocol(BaseHTTPServer.BaseHTTPRequestHandler):
|
|||||||
format % args))
|
format % args))
|
||||||
|
|
||||||
def handle_one_request(self):
|
def handle_one_request(self):
|
||||||
|
if self.server.max_http_version:
|
||||||
|
self.protocol_version = self.server.max_http_version
|
||||||
|
|
||||||
try:
|
try:
|
||||||
self.raw_requestline = self.rfile.readline()
|
self.raw_requestline = self.rfile.readline()
|
||||||
except socket.error, e:
|
except socket.error, e:
|
||||||
@@ -263,7 +269,7 @@ class HttpProtocol(BaseHTTPServer.BaseHTTPRequestHandler):
|
|||||||
|
|
||||||
|
|
||||||
class Server(BaseHTTPServer.HTTPServer):
|
class Server(BaseHTTPServer.HTTPServer):
|
||||||
def __init__(self, socket, address, app, log, environ=None):
|
def __init__(self, socket, address, app, log, environ=None, max_http_version=None):
|
||||||
self.socket = socket
|
self.socket = socket
|
||||||
self.address = address
|
self.address = address
|
||||||
if log:
|
if log:
|
||||||
@@ -273,6 +279,7 @@ class Server(BaseHTTPServer.HTTPServer):
|
|||||||
self.log = sys.stderr
|
self.log = sys.stderr
|
||||||
self.app = app
|
self.app = app
|
||||||
self.environ = environ
|
self.environ = environ
|
||||||
|
self.max_http_version = max_http_version
|
||||||
|
|
||||||
def get_environ(self):
|
def get_environ(self):
|
||||||
socket = self.socket
|
socket = self.socket
|
||||||
@@ -296,8 +303,8 @@ class Server(BaseHTTPServer.HTTPServer):
|
|||||||
self.log.write(message + '\n')
|
self.log.write(message + '\n')
|
||||||
|
|
||||||
|
|
||||||
def server(sock, site, log=None, environ=None, max_size=None):
|
def server(sock, site, log=None, environ=None, max_size=None, max_http_version=DEFAULT_MAX_HTTP_VERSION):
|
||||||
serv = Server(sock, sock.getsockname(), site, log, environ=None)
|
serv = Server(sock, sock.getsockname(), site, log, environ=None, max_http_version=max_http_version)
|
||||||
try:
|
try:
|
||||||
print "wsgi starting up on", sock.getsockname()
|
print "wsgi starting up on", sock.getsockname()
|
||||||
while True:
|
while True:
|
||||||
|
Reference in New Issue
Block a user