Support ssl objects properly again. Support wsgi.server(max_http_version=)

This commit is contained in:
donovan
2008-04-30 18:53:19 -07:00
parent f61bcd8621
commit ad70bd6e42
3 changed files with 65 additions and 37 deletions

View File

@@ -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()

View File

@@ -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():

View File

@@ -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: