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