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:
|
||||
return 0
|
||||
raise
|
||||
except SSL.WantWriteError:
|
||||
except util.SSL.WantWriteError:
|
||||
return 0
|
||||
except SSL.WantReadError:
|
||||
except util.SSL.WantReadError:
|
||||
return 0
|
||||
finally:
|
||||
if cancel:
|
||||
@@ -124,11 +124,11 @@ def socket_recv(descriptor, buflen):
|
||||
if e[0] in SOCKET_CLOSED:
|
||||
return ''
|
||||
raise
|
||||
except SSL.WantReadError:
|
||||
except util.SSL.WantReadError:
|
||||
return None
|
||||
except SSL.ZeroReturnError:
|
||||
except util.SSL.ZeroReturnError:
|
||||
return ''
|
||||
except SSL.SysCallError, e:
|
||||
except util.SSL.SysCallError, e:
|
||||
if e[0] == -1 or e[0] > 0:
|
||||
raise socket.error(errno.ECONNRESET, errno.errorcode[errno.ECONNRESET])
|
||||
raise
|
||||
@@ -286,7 +286,36 @@ class GreenSocket(object):
|
||||
def gettimeout(self):
|
||||
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):
|
||||
newlines = '\r\n'
|
||||
mode = 'wb+'
|
||||
@@ -368,33 +397,7 @@ class GreenFile(object):
|
||||
for line in lines:
|
||||
self.write(line)
|
||||
|
||||
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)
|
||||
read = read
|
||||
|
||||
|
||||
class GreenPipeSocket(GreenSocket):
|
||||
@@ -420,3 +423,21 @@ class GreenPipe(GreenFile):
|
||||
|
||||
def flush(self):
|
||||
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?
|
||||
connection = SSL.Connection(context, sock)
|
||||
connection.set_connect_state()
|
||||
return greenio.GreenSocket(connection)
|
||||
return greenio.GreenSSL(connection)
|
||||
|
||||
socket_already_wrapped = False
|
||||
def wrap_socket_with_coroutine_socket():
|
||||
|
@@ -37,6 +37,9 @@ from eventlet import api
|
||||
from eventlet.httpdate import format_date_time
|
||||
|
||||
|
||||
DEFAULT_MAX_HTTP_VERSION = 'HTTP/1.1'
|
||||
|
||||
|
||||
class Input(object):
|
||||
def __init__(self, rfile, content_length, wfile=None, wfile_line=None):
|
||||
self.rfile = rfile
|
||||
@@ -76,6 +79,9 @@ class HttpProtocol(BaseHTTPServer.BaseHTTPRequestHandler):
|
||||
format % args))
|
||||
|
||||
def handle_one_request(self):
|
||||
if self.server.max_http_version:
|
||||
self.protocol_version = self.server.max_http_version
|
||||
|
||||
try:
|
||||
self.raw_requestline = self.rfile.readline()
|
||||
except socket.error, e:
|
||||
@@ -263,7 +269,7 @@ class HttpProtocol(BaseHTTPServer.BaseHTTPRequestHandler):
|
||||
|
||||
|
||||
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.address = address
|
||||
if log:
|
||||
@@ -273,6 +279,7 @@ class Server(BaseHTTPServer.HTTPServer):
|
||||
self.log = sys.stderr
|
||||
self.app = app
|
||||
self.environ = environ
|
||||
self.max_http_version = max_http_version
|
||||
|
||||
def get_environ(self):
|
||||
socket = self.socket
|
||||
@@ -296,8 +303,8 @@ class Server(BaseHTTPServer.HTTPServer):
|
||||
self.log.write(message + '\n')
|
||||
|
||||
|
||||
def server(sock, site, log=None, environ=None, max_size=None):
|
||||
serv = Server(sock, sock.getsockname(), site, log, environ=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, max_http_version=max_http_version)
|
||||
try:
|
||||
print "wsgi starting up on", sock.getsockname()
|
||||
while True:
|
||||
|
Reference in New Issue
Block a user