summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2014-01-06 23:53:16 +0100
committerVictor Stinner <victor.stinner@gmail.com>2014-01-06 23:53:16 +0100
commit03435c4eb1c3cd966edca043aad43a195dad3dc4 (patch)
tree4a93360d88a5372bac3c24fc0e1e375686c45dbf
parent6d8c2cbe675a26d3054bb3b504b9e1fc2023a2f5 (diff)
downloadtrollius-03435c4eb1c3cd966edca043aad43a195dad3dc4.tar.gz
support buffer type, memoryview is not supported in Python 2.6
-rw-r--r--asyncio/selector_events.py49
1 files changed, 30 insertions, 19 deletions
diff --git a/asyncio/selector_events.py b/asyncio/selector_events.py
index 282c8e6..a316f70 100644
--- a/asyncio/selector_events.py
+++ b/asyncio/selector_events.py
@@ -8,6 +8,7 @@ import collections
import errno
import functools
import socket
+import sys
try:
import ssl
except ImportError: # pragma: no cover
@@ -24,6 +25,28 @@ from .backport import wrap_error
from .backport_ssl import wrap_ssl_error
from .log import logger
+PY26 = (sys.version_info < (2, 7))
+PY3 = (sys.version_info >= (3,))
+
+def flatten_bytes(data):
+ if PY3:
+ bytes_types = (bytes, bytearray, memoryview)
+ elif PY26:
+ bytes_types = (bytes, bytearray, buffer)
+ else:
+ bytes_types = (bytes, bytearray, memoryview, buffer)
+ if not isinstance(data, bytes_types):
+ raise TypeError('data argument must be byte-ish (%r)',
+ type(data))
+ if not data:
+ return b''
+ if not PY3 and isinstance(data, (buffer, bytearray)):
+ return bytes(data)
+ elif not PY26 and isinstance(data, memoryview):
+ return data.tobytes()
+ else:
+ return data
+
class BaseSelectorEventLoop(base_events.BaseEventLoop):
"""Selector event loop.
@@ -500,15 +523,9 @@ class _SelectorSocketTransport(_SelectorTransport):
self.close()
def write(self, data):
- if not isinstance(data, (bytes, bytearray, memoryview)):
- raise TypeError('data argument must be byte-ish (%r)',
- type(data))
- if self._eof:
- raise RuntimeError('Cannot call write() after write_eof()')
+ data = flatten_bytes(data)
if not data:
return
- if isinstance(data, memoryview):
- data = data.tobytes()
if self._conn_lost:
if self._conn_lost >= constants.LOG_THRESHOLD_FOR_CONNLOST_WRITES:
@@ -539,8 +556,9 @@ class _SelectorSocketTransport(_SelectorTransport):
def _write_ready(self):
assert self._buffer, 'Data should not be empty'
+ data = flatten_bytes(self._buffer)
try:
- n = wrap_error(self._sock.send, self._buffer)
+ n = wrap_error(self._sock.send, data)
except (BlockingIOError, InterruptedError):
pass
except Exception as exc:
@@ -737,8 +755,9 @@ class _SelectorSslTransport(_SelectorTransport):
self._loop.add_reader(self._sock_fd, self._read_ready)
if self._buffer:
+ data = flatten_bytes(self._buffer)
try:
- n = wrap_error(self._sock.send, self._buffer)
+ n = wrap_error(self._sock.send, data)
except (BlockingIOError, InterruptedError,
ssl.SSLWantWriteError):
n = 0
@@ -763,13 +782,9 @@ class _SelectorSslTransport(_SelectorTransport):
self._call_connection_lost(None)
def write(self, data):
- if not isinstance(data, (bytes, bytearray, memoryview)):
- raise TypeError('data argument must be byte-ish (%r)',
- type(data))
+ data = flatten_bytes(data)
if not data:
return
- if isinstance(data, memoryview):
- data = data.tobytes()
if self._conn_lost:
if self._conn_lost >= constants.LOG_THRESHOLD_FOR_CONNLOST_WRITES:
@@ -814,13 +829,9 @@ class _SelectorDatagramTransport(_SelectorTransport):
self._protocol.datagram_received(data, addr)
def sendto(self, data, addr=None):
- if not isinstance(data, (bytes, bytearray, memoryview)):
- raise TypeError('data argument must be byte-ish (%r)',
- type(data))
+ data = flatten_bytes(data)
if not data:
return
- if isinstance(data, memoryview):
- data = data.tobytes()
if self._address and addr not in (None, self._address):
raise ValueError('Invalid address: must be None or %s' %