diff --git a/eventlet/greenio.py b/eventlet/greenio.py index 3472396..9257a55 100644 --- a/eventlet/greenio.py +++ b/eventlet/greenio.py @@ -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() + diff --git a/eventlet/util.py b/eventlet/util.py index 237aa95..acbc126 100644 --- a/eventlet/util.py +++ b/eventlet/util.py @@ -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(): diff --git a/eventlet/wsgi.py b/eventlet/wsgi.py index 22c3f9c..34bfa65 100644 --- a/eventlet/wsgi.py +++ b/eventlet/wsgi.py @@ -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: