14710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Wrapper module for _socket, providing some additional facilities
24710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# implemented in Python.
34710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
44710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"""\
54710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmThis module provides socket operations and some related functions.
64710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmOn Unix, it supports IP (Internet Protocol) and Unix domain sockets.
74710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmOn other systems, it only supports IP. Functions specific for a
84710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsocket are available as methods of the socket object.
94710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmFunctions:
114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsocket() -- create a new socket object
134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsocketpair() -- create a pair of new socket objects [*]
144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfromfd() -- create a socket object from an open file descriptor [*]
154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmgethostname() -- return the current hostname
164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmgethostbyname() -- map a hostname to its IP number
174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmgethostbyaddr() -- map an IP number or hostname to DNS info
184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmgetservbyname() -- map a service name and a protocol name to a port number
194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmgetprotobyname() -- map a protocol name (e.g. 'tcp') to a number
204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmntohs(), ntohl() -- convert 16, 32 bit int from network to host byte order
214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmhtons(), htonl() -- convert 16, 32 bit int from host to network byte order
224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylminet_aton() -- convert IP addr string (123.45.67.89) to 32-bit packed format
234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylminet_ntoa() -- convert 32-bit packed format IP to string (123.45.67.89)
244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmssl() -- secure socket layer support (only available if configured)
254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsocket.getdefaulttimeout() -- get the default timeout value
264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsocket.setdefaulttimeout() -- set the default timeout value
274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmcreate_connection() -- connects to an address, with an optional timeout and
284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                       optional source address.
294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm [*] not available on all platforms!
314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmSpecial objects:
334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmSocketType -- type object for socket objects
354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmerror -- exception raised for I/O errors
364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmhas_ipv6 -- boolean value indicating if IPv6 is supported
374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmInteger constants:
394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmAF_INET, AF_UNIX -- socket domains (first argument to socket() call)
414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmSOCK_STREAM, SOCK_DGRAM, SOCK_RAW -- socket types (second argument)
424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmMany other constants may be defined; these may be used in calls to
444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmthe setsockopt() and getsockopt() methods.
454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"""
464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport _socket
484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom _socket import *
494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom functools import partial
504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom types import MethodType
514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtry:
534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    import _ssl
544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmexcept ImportError:
554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # no SSL support
564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    pass
574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmelse:
584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def ssl(sock, keyfile=None, certfile=None):
594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # we do an internal import here because the ssl
604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # module imports the socket module
614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        import ssl as _realssl
624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        warnings.warn("socket.ssl() is deprecated.  Use ssl.wrap_socket() instead.",
634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                      DeprecationWarning, stacklevel=2)
644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return _realssl.sslwrap_simple(sock, keyfile, certfile)
654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # we need to import the same constants we used to...
674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    from _ssl import SSLError as sslerror
684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    from _ssl import \
694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm         RAND_add, \
704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm         RAND_egd, \
714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm         RAND_status, \
724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm         SSL_ERROR_ZERO_RETURN, \
734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm         SSL_ERROR_WANT_READ, \
744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm         SSL_ERROR_WANT_WRITE, \
754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm         SSL_ERROR_WANT_X509_LOOKUP, \
764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm         SSL_ERROR_SYSCALL, \
774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm         SSL_ERROR_SSL, \
784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm         SSL_ERROR_WANT_CONNECT, \
794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm         SSL_ERROR_EOF, \
804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm         SSL_ERROR_INVALID_ERROR_CODE
814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport os, sys, warnings
834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtry:
854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    from cStringIO import StringIO
864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmexcept ImportError:
874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    from StringIO import StringIO
884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtry:
904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    import errno
914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmexcept ImportError:
924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    errno = None
934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmEBADF = getattr(errno, 'EBADF', 9)
944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmEINTR = getattr(errno, 'EINTR', 4)
954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm__all__ = ["getfqdn", "create_connection"]
974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm__all__.extend(os._get_exports_list(_socket))
984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm_realsocket = socket
1014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# WSA error codes
1034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmif sys.platform.lower().startswith("win"):
1044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    errorTab = {}
1054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    errorTab[10004] = "The operation was interrupted."
1064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    errorTab[10009] = "A bad file handle was passed."
1074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    errorTab[10013] = "Permission denied."
1084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    errorTab[10014] = "A fault occurred on the network??" # WSAEFAULT
1094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    errorTab[10022] = "An invalid operation was attempted."
1104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    errorTab[10035] = "The socket operation would block"
1114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    errorTab[10036] = "A blocking operation is already in progress."
1124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    errorTab[10048] = "The network address is in use."
1134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    errorTab[10054] = "The connection has been reset."
1144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    errorTab[10058] = "The network has been shut down."
1154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    errorTab[10060] = "The operation timed out."
1164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    errorTab[10061] = "Connection refused."
1174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    errorTab[10063] = "The name is too long."
1184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    errorTab[10064] = "The host is down."
1194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    errorTab[10065] = "The host is unreachable."
1204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    __all__.append("errorTab")
1214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef getfqdn(name=''):
1254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Get fully qualified domain name from name.
1264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    An empty argument is interpreted as meaning the local host.
1284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    First the hostname returned by gethostbyaddr() is checked, then
1304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    possibly existing aliases. In case no FQDN is available, hostname
1314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    from gethostname() is returned.
1324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
1334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    name = name.strip()
1344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if not name or name == '0.0.0.0':
1354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        name = gethostname()
1364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    try:
1374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        hostname, aliases, ipaddrs = gethostbyaddr(name)
1384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    except error:
1394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        pass
1404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else:
1414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        aliases.insert(0, hostname)
1424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for name in aliases:
1434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if '.' in name:
1444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                break
1454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else:
1464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            name = hostname
1474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return name
1484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm_socketmethods = (
1514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    'bind', 'connect', 'connect_ex', 'fileno', 'listen',
1524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    'getpeername', 'getsockname', 'getsockopt', 'setsockopt',
1534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    'sendall', 'setblocking',
1544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    'settimeout', 'gettimeout', 'shutdown')
1554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmif os.name == "nt":
1574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    _socketmethods = _socketmethods + ('ioctl',)
1584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmif sys.platform == "riscos":
1604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    _socketmethods = _socketmethods + ('sleeptaskw',)
1614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# All the method names that must be delegated to either the real socket
1634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# object or the _closedsocket object.
1644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm_delegate_methods = ("recv", "recvfrom", "recv_into", "recvfrom_into",
1654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                     "send", "sendto")
1664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass _closedsocket(object):
1684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    __slots__ = []
1694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def _dummy(*args):
1704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        raise error(EBADF, 'Bad file descriptor')
1714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # All _delegate_methods must also be initialized here.
1724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    send = recv = recv_into = sendto = recvfrom = recvfrom_into = _dummy
1734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    __getattr__ = _dummy
1744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Wrapper around platform socket objects. This implements
1764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# a platform-independent dup() functionality. The
1774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# implementation currently relies on reference counting
1784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# to close the underlying socket object.
1794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass _socketobject(object):
1804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    __doc__ = _realsocket.__doc__
1824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    __slots__ = ["_sock", "__weakref__"] + list(_delegate_methods)
1844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def __init__(self, family=AF_INET, type=SOCK_STREAM, proto=0, _sock=None):
1864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if _sock is None:
1874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            _sock = _realsocket(family, type, proto)
1884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self._sock = _sock
1894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for method in _delegate_methods:
1904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            setattr(self, method, getattr(_sock, method))
1914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def close(self, _closedsocket=_closedsocket,
1934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              _delegate_methods=_delegate_methods, setattr=setattr):
1944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # This function should not reference any globals. See issue #808164.
1954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self._sock = _closedsocket()
1964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        dummy = self._sock._dummy
1974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for method in _delegate_methods:
1984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            setattr(self, method, dummy)
1994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    close.__doc__ = _realsocket.close.__doc__
2004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def accept(self):
2024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        sock, addr = self._sock.accept()
2034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return _socketobject(_sock=sock), addr
2044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    accept.__doc__ = _realsocket.accept.__doc__
2054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def dup(self):
2074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        """dup() -> socket object
2084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Return a new socket object connected to the same system resource."""
2104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return _socketobject(_sock=self._sock)
2114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def makefile(self, mode='r', bufsize=-1):
2134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        """makefile([mode[, bufsize]]) -> file object
2144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Return a regular file object corresponding to the socket.  The mode
2164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        and bufsize arguments are as for the built-in open() function."""
2174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return _fileobject(self._sock, mode, bufsize)
2184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    family = property(lambda self: self._sock.family, doc="the socket family")
2204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    type = property(lambda self: self._sock.type, doc="the socket type")
2214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    proto = property(lambda self: self._sock.proto, doc="the socket protocol")
2224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef meth(name,self,*args):
2244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return getattr(self._sock,name)(*args)
2254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfor _m in _socketmethods:
2274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    p = partial(meth,_m)
2284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    p.__name__ = _m
2294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    p.__doc__ = getattr(_realsocket,_m).__doc__
2304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    m = MethodType(p,None,_socketobject)
2314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    setattr(_socketobject,_m,m)
2324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsocket = SocketType = _socketobject
2344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass _fileobject(object):
2364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Faux file object attached to a socket object."""
2374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    default_bufsize = 8192
2394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    name = "<socket>"
2404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    __slots__ = ["mode", "bufsize", "softspace",
2424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                 # "closed" is a property, see below
2434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                 "_sock", "_rbufsize", "_wbufsize", "_rbuf", "_wbuf", "_wbuf_len",
2444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                 "_close"]
2454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def __init__(self, sock, mode='rb', bufsize=-1, close=False):
2474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self._sock = sock
2484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.mode = mode # Not actually used in this version
2494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if bufsize < 0:
2504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            bufsize = self.default_bufsize
2514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.bufsize = bufsize
2524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.softspace = False
2534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # _rbufsize is the suggested recv buffer size.  It is *strictly*
2544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # obeyed within readline() for recv calls.  If it is larger than
2554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # default_bufsize it will be used for recv calls within read().
2564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if bufsize == 0:
2574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self._rbufsize = 1
2584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        elif bufsize == 1:
2594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self._rbufsize = self.default_bufsize
2604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else:
2614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self._rbufsize = bufsize
2624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self._wbufsize = bufsize
2634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # We use StringIO for the read buffer to avoid holding a list
2644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # of variously sized string objects which have been known to
2654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # fragment the heap due to how they are malloc()ed and often
2664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # realloc()ed down much smaller than their original allocation.
2674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self._rbuf = StringIO()
2684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self._wbuf = [] # A list of strings
2694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self._wbuf_len = 0
2704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self._close = close
2714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def _getclosed(self):
2734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return self._sock is None
2744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    closed = property(_getclosed, doc="True if the file is closed")
2754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def close(self):
2774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        try:
2784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if self._sock:
2794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self.flush()
2804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        finally:
2814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if self._close:
2824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self._sock.close()
2834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self._sock = None
2844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def __del__(self):
2864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        try:
2874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.close()
2884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        except:
2894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            # close() may fail if __init__ didn't complete
2904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            pass
2914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def flush(self):
2934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if self._wbuf:
2944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            data = "".join(self._wbuf)
2954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self._wbuf = []
2964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self._wbuf_len = 0
2974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            buffer_size = max(self._rbufsize, self.default_bufsize)
2984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            data_size = len(data)
2994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            write_offset = 0
3004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            view = memoryview(data)
3014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            try:
3024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                while write_offset < data_size:
3034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    self._sock.sendall(view[write_offset:write_offset+buffer_size])
3044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    write_offset += buffer_size
3054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            finally:
3064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if write_offset < data_size:
3074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    remainder = data[write_offset:]
3084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    del view, data  # explicit free
3094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    self._wbuf.append(remainder)
3104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    self._wbuf_len = len(remainder)
3114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def fileno(self):
3134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return self._sock.fileno()
3144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def write(self, data):
3164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        data = str(data) # XXX Should really reject non-string non-buffers
3174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if not data:
3184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return
3194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self._wbuf.append(data)
3204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self._wbuf_len += len(data)
3214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (self._wbufsize == 0 or
3224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self._wbufsize == 1 and '\n' in data or
3234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self._wbuf_len >= self._wbufsize):
3244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.flush()
3254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def writelines(self, list):
3274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # XXX We could do better here for very long lists
3284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # XXX Should really reject non-string non-buffers
3294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        lines = filter(None, map(str, list))
3304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self._wbuf_len += sum(map(len, lines))
3314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self._wbuf.extend(lines)
3324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (self._wbufsize <= 1 or
3334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self._wbuf_len >= self._wbufsize):
3344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.flush()
3354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def read(self, size=-1):
3374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # Use max, disallow tiny reads in a loop as they are very inefficient.
3384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # We never leave read() with any leftover data from a new recv() call
3394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # in our internal buffer.
3404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        rbufsize = max(self._rbufsize, self.default_bufsize)
3414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # Our use of StringIO rather than lists of string objects returned by
3424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # recv() minimizes memory usage and fragmentation that occurs when
3434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # rbufsize is large compared to the typical return value of recv().
3444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        buf = self._rbuf
3454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        buf.seek(0, 2)  # seek end
3464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if size < 0:
3474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            # Read until EOF
3484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self._rbuf = StringIO()  # reset _rbuf.  we consume it via buf.
3494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            while True:
3504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                try:
3514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    data = self._sock.recv(rbufsize)
3524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                except error, e:
3534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    if e.args[0] == EINTR:
3544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        continue
3554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    raise
3564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if not data:
3574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    break
3584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                buf.write(data)
3594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return buf.getvalue()
3604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else:
3614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            # Read until size bytes or EOF seen, whichever comes first
3624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            buf_len = buf.tell()
3634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if buf_len >= size:
3644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                # Already have size bytes in our buffer?  Extract and return.
3654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                buf.seek(0)
3664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                rv = buf.read(size)
3674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self._rbuf = StringIO()
3684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self._rbuf.write(buf.read())
3694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return rv
3704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self._rbuf = StringIO()  # reset _rbuf.  we consume it via buf.
3724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            while True:
3734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                left = size - buf_len
3744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                # recv() will malloc the amount of memory given as its
3754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                # parameter even though it often returns much less data
3764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                # than that.  The returned data string is short lived
3774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                # as we copy it into a StringIO and free it.  This avoids
3784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                # fragmentation issues on many platforms.
3794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                try:
3804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    data = self._sock.recv(left)
3814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                except error, e:
3824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    if e.args[0] == EINTR:
3834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        continue
3844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    raise
3854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if not data:
3864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    break
3874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                n = len(data)
3884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if n == size and not buf_len:
3894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    # Shortcut.  Avoid buffer data copies when:
3904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    # - We have no data in our buffer.
3914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    # AND
3924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    # - Our call to recv returned exactly the
3934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    #   number of bytes we were asked to read.
3944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return data
3954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if n == left:
3964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    buf.write(data)
3974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    del data  # explicit free
3984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    break
3994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                assert n <= left, "recv(%d) returned %d bytes" % (left, n)
4004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                buf.write(data)
4014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                buf_len += n
4024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                del data  # explicit free
4034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                #assert buf_len == buf.tell()
4044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return buf.getvalue()
4054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def readline(self, size=-1):
4074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        buf = self._rbuf
4084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        buf.seek(0, 2)  # seek end
4094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if buf.tell() > 0:
4104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            # check if we already have it in our buffer
4114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            buf.seek(0)
4124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            bline = buf.readline(size)
4134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if bline.endswith('\n') or len(bline) == size:
4144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self._rbuf = StringIO()
4154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self._rbuf.write(buf.read())
4164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return bline
4174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            del bline
4184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if size < 0:
4194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            # Read until \n or EOF, whichever comes first
4204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if self._rbufsize <= 1:
4214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                # Speed up unbuffered case
4224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                buf.seek(0)
4234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                buffers = [buf.read()]
4244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self._rbuf = StringIO()  # reset _rbuf.  we consume it via buf.
4254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                data = None
4264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                recv = self._sock.recv
4274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                while True:
4284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    try:
4294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        while data != "\n":
4304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            data = recv(1)
4314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            if not data:
4324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                break
4334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            buffers.append(data)
4344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    except error, e:
4354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        # The try..except to catch EINTR was moved outside the
4364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        # recv loop to avoid the per byte overhead.
4374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        if e.args[0] == EINTR:
4384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            continue
4394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        raise
4404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    break
4414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return "".join(buffers)
4424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            buf.seek(0, 2)  # seek end
4444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self._rbuf = StringIO()  # reset _rbuf.  we consume it via buf.
4454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            while True:
4464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                try:
4474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    data = self._sock.recv(self._rbufsize)
4484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                except error, e:
4494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    if e.args[0] == EINTR:
4504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        continue
4514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    raise
4524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if not data:
4534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    break
4544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                nl = data.find('\n')
4554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if nl >= 0:
4564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    nl += 1
4574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    buf.write(data[:nl])
4584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    self._rbuf.write(data[nl:])
4594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    del data
4604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    break
4614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                buf.write(data)
4624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return buf.getvalue()
4634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else:
4644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            # Read until size bytes or \n or EOF seen, whichever comes first
4654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            buf.seek(0, 2)  # seek end
4664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            buf_len = buf.tell()
4674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if buf_len >= size:
4684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                buf.seek(0)
4694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                rv = buf.read(size)
4704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self._rbuf = StringIO()
4714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self._rbuf.write(buf.read())
4724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return rv
4734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self._rbuf = StringIO()  # reset _rbuf.  we consume it via buf.
4744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            while True:
4754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                try:
4764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    data = self._sock.recv(self._rbufsize)
4774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                except error, e:
4784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    if e.args[0] == EINTR:
4794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        continue
4804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    raise
4814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if not data:
4824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    break
4834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                left = size - buf_len
4844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                # did we just receive a newline?
4854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                nl = data.find('\n', 0, left)
4864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if nl >= 0:
4874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    nl += 1
4884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    # save the excess data to _rbuf
4894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    self._rbuf.write(data[nl:])
4904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    if buf_len:
4914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        buf.write(data[:nl])
4924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        break
4934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    else:
4944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        # Shortcut.  Avoid data copy through buf when returning
4954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        # a substring of our first recv().
4964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        return data[:nl]
4974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                n = len(data)
4984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if n == size and not buf_len:
4994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    # Shortcut.  Avoid data copy through buf when
5004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    # returning exactly all of our first recv().
5014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return data
5024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if n >= left:
5034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    buf.write(data[:left])
5044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    self._rbuf.write(data[left:])
5054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    break
5064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                buf.write(data)
5074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                buf_len += n
5084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                #assert buf_len == buf.tell()
5094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return buf.getvalue()
5104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def readlines(self, sizehint=0):
5124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        total = 0
5134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        list = []
5144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        while True:
5154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            line = self.readline()
5164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if not line:
5174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                break
5184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            list.append(line)
5194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            total += len(line)
5204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if sizehint and total >= sizehint:
5214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                break
5224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return list
5234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # Iterator protocols
5254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def __iter__(self):
5274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return self
5284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def next(self):
5304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        line = self.readline()
5314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if not line:
5324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            raise StopIteration
5334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return line
5344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm_GLOBAL_DEFAULT_TIMEOUT = object()
5364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef create_connection(address, timeout=_GLOBAL_DEFAULT_TIMEOUT,
5384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                      source_address=None):
5394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Connect to *address* and return the socket object.
5404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Convenience function.  Connect to *address* (a 2-tuple ``(host,
5424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    port)``) and return the socket object.  Passing the optional
5434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    *timeout* parameter will set the timeout on the socket instance
5444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    before attempting to connect.  If no *timeout* is supplied, the
5454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    global default timeout setting returned by :func:`getdefaulttimeout`
5464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    is used.  If *source_address* is set it must be a tuple of (host, port)
5474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for the socket to bind as a source address before making the connection.
5484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    An host of '' or port 0 tells the OS to use the default.
5494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
5504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    host, port = address
5524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    err = None
5534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for res in getaddrinfo(host, port, 0, SOCK_STREAM):
5544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        af, socktype, proto, canonname, sa = res
5554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        sock = None
5564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        try:
5574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            sock = socket(af, socktype, proto)
5584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if timeout is not _GLOBAL_DEFAULT_TIMEOUT:
5594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                sock.settimeout(timeout)
5604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if source_address:
5614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                sock.bind(source_address)
5624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            sock.connect(sa)
5634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return sock
5644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        except error as _:
5664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            err = _
5674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if sock is not None:
5684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                sock.close()
5694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if err is not None:
5714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        raise err
5724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else:
5734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        raise error("getaddrinfo returns an empty list")
574