diff options
Diffstat (limited to 'eventlet')
| -rw-r--r-- | eventlet/green/thread.py | 11 | ||||
| -rw-r--r-- | eventlet/green/threading.py | 13 | ||||
| -rw-r--r-- | eventlet/websocket.py | 51 | ||||
| -rw-r--r-- | eventlet/wsgi.py | 6 |
4 files changed, 48 insertions, 33 deletions
diff --git a/eventlet/green/thread.py b/eventlet/green/thread.py index 66bb581..2360310 100644 --- a/eventlet/green/thread.py +++ b/eventlet/green/thread.py @@ -1,6 +1,6 @@ """Implements the standard thread module, using greenthreads.""" from eventlet.support.six.moves import _thread as __thread -from eventlet.support import greenlets as greenlet +from eventlet.support import greenlets as greenlet, six from eventlet import greenthread from eventlet.semaphore import Semaphore as LockType @@ -13,6 +13,15 @@ error = __thread.error __threadcount = 0 +if six.PY3: + def _set_sentinel(): + # TODO this is a dummy code, reimplementing this may be needed: + # https://hg.python.org/cpython/file/b5e9bc4352e1/Modules/_threadmodule.c#l1203 + return allocate_lock() + + TIMEOUT_MAX = __thread.TIMEOUT_MAX + + def _count(): return __threadcount diff --git a/eventlet/green/threading.py b/eventlet/green/threading.py index 5c56ba1..3176261 100644 --- a/eventlet/green/threading.py +++ b/eventlet/green/threading.py @@ -2,12 +2,17 @@ from eventlet import patcher from eventlet.green import thread from eventlet.green import time -from eventlet.support import greenlets as greenlet +from eventlet.support import greenlets as greenlet, six -__patched__ = ['_start_new_thread', '_allocate_lock', '_get_ident', '_sleep', - 'local', 'stack_size', 'Lock', 'currentThread', +__patched__ = ['_start_new_thread', '_allocate_lock', + '_sleep', 'local', 'stack_size', 'Lock', 'currentThread', 'current_thread', '_after_fork', '_shutdown'] +if six.PY2: + __patched__ += ['_get_ident'] +else: + __patched__ += ['get_ident', '_set_sentinel'] + __orig_threading = patcher.original('threading') __threadlocal = __orig_threading.local() @@ -15,7 +20,7 @@ __threadlocal = __orig_threading.local() patcher.inject( 'threading', globals(), - ('thread', thread), + ('thread' if six.PY2 else '_thread', thread), ('time', time)) del patcher diff --git a/eventlet/websocket.py b/eventlet/websocket.py index 10c868d..1fb33bb 100644 --- a/eventlet/websocket.py +++ b/eventlet/websocket.py @@ -168,25 +168,24 @@ class WebSocketWSGI(object): if qs is not None: location += '?' + qs if self.protocol_version == 75: - handshake_reply = ("HTTP/1.1 101 Web Socket Protocol Handshake\r\n" - "Upgrade: WebSocket\r\n" - "Connection: Upgrade\r\n" - "WebSocket-Origin: %s\r\n" - "WebSocket-Location: %s\r\n\r\n" % ( - environ.get('HTTP_ORIGIN'), - location)) + handshake_reply = ( + b"HTTP/1.1 101 Web Socket Protocol Handshake\r\n" + b"Upgrade: WebSocket\r\n" + b"Connection: Upgrade\r\n" + b"WebSocket-Origin: " + environ.get('HTTP_ORIGIN') + b"\r\n" + b"WebSocket-Location: " + six.b(location) + b"\r\n\r\n" + ) elif self.protocol_version == 76: - handshake_reply = ("HTTP/1.1 101 WebSocket Protocol Handshake\r\n" - "Upgrade: WebSocket\r\n" - "Connection: Upgrade\r\n" - "Sec-WebSocket-Origin: %s\r\n" - "Sec-WebSocket-Protocol: %s\r\n" - "Sec-WebSocket-Location: %s\r\n" - "\r\n%s" % ( - environ.get('HTTP_ORIGIN'), - environ.get('HTTP_SEC_WEBSOCKET_PROTOCOL', 'default'), - location, - response)) + handshake_reply = ( + b"HTTP/1.1 101 WebSocket Protocol Handshake\r\n" + b"Upgrade: WebSocket\r\n" + b"Connection: Upgrade\r\n" + b"Sec-WebSocket-Origin: " + six.b(environ.get('HTTP_ORIGIN')) + b"\r\n" + b"Sec-WebSocket-Protocol: " + + six.b(environ.get('HTTP_SEC_WEBSOCKET_PROTOCOL', 'default')) + b"\r\n" + b"Sec-WebSocket-Location: " + six.b(location) + b"\r\n" + b"\r\n" + response + ) else: # pragma NO COVER raise ValueError("Unknown WebSocket protocol version.") sock.sendall(handshake_reply) @@ -244,7 +243,7 @@ class WebSocketWSGI(object): out += char elif char == " ": spaces += 1 - return int(out) / spaces + return int(out) // spaces class WebSocket(object): @@ -281,7 +280,7 @@ class WebSocket(object): self.environ = environ self.version = version self.websocket_closed = False - self._buf = "" + self._buf = b"" self._msgs = collections.deque() self._sendlock = semaphore.Semaphore() @@ -294,8 +293,8 @@ class WebSocket(object): if isinstance(message, six.text_type): message = message.encode('utf-8') elif not isinstance(message, six.binary_type): - message = b'%s' % (message,) - packed = b"\x00%s\xFF" % message + message = six.b(str(message)) + packed = b"\x00" + message + b"\xFF" return packed def _parse_messages(self): @@ -309,17 +308,17 @@ class WebSocket(object): end_idx = 0 buf = self._buf while buf: - frame_type = ord(buf[0]) + frame_type = six.indexbytes(buf, 0) if frame_type == 0: # Normal message. - end_idx = buf.find("\xFF") + end_idx = buf.find(b"\xFF") if end_idx == -1: # pragma NO COVER break msgs.append(buf[1:end_idx].decode('utf-8', 'replace')) buf = buf[end_idx + 1:] elif frame_type == 255: # Closing handshake. - assert ord(buf[1]) == 0, "Unexpected closing handshake: %r" % buf + assert six.indexbytes(buf, 1) == 0, "Unexpected closing handshake: %r" % buf self.websocket_closed = True break else: @@ -355,7 +354,7 @@ class WebSocket(object): return None # no parsed messages, must mean buf needs more data delta = self.socket.recv(8096) - if delta == '': + if delta == b'': return None self._buf += delta msgs = self._parse_messages() diff --git a/eventlet/wsgi.py b/eventlet/wsgi.py index a17de17..1feb734 100644 --- a/eventlet/wsgi.py +++ b/eventlet/wsgi.py @@ -69,11 +69,13 @@ class Input(object): def __init__(self, rfile, content_length, + sock, wfile=None, wfile_line=None, chunked_input=False): self.rfile = rfile + self._sock = sock if content_length is not None: content_length = int(content_length) self.content_length = content_length @@ -193,7 +195,7 @@ class Input(object): return iter(self.read, b'') def get_socket(self): - return self.rfile._sock + return self._sock def set_hundred_continue_response_headers(self, headers, capitalize_response_headers=True): @@ -564,7 +566,7 @@ class HttpProtocol(BaseHTTPServer.BaseHTTPRequestHandler): wfile_line = None chunked = env.get('HTTP_TRANSFER_ENCODING', '').lower() == 'chunked' env['wsgi.input'] = env['eventlet.input'] = Input( - self.rfile, length, wfile=wfile, wfile_line=wfile_line, + self.rfile, length, self.connection, wfile=wfile, wfile_line=wfile_line, chunked_input=chunked) env['eventlet.posthooks'] = [] |
