Home | History | Annotate | Download | only in Lib
      1 # Wrapper module for _socket, providing some additional facilities
      2 # implemented in Python.
      3 
      4 """\
      5 This module provides socket operations and some related functions.
      6 On Unix, it supports IP (Internet Protocol) and Unix domain sockets.
      7 On other systems, it only supports IP. Functions specific for a
      8 socket are available as methods of the socket object.
      9 
     10 Functions:
     11 
     12 socket() -- create a new socket object
     13 socketpair() -- create a pair of new socket objects [*]
     14 fromfd() -- create a socket object from an open file descriptor [*]
     15 gethostname() -- return the current hostname
     16 gethostbyname() -- map a hostname to its IP number
     17 gethostbyaddr() -- map an IP number or hostname to DNS info
     18 getservbyname() -- map a service name and a protocol name to a port number
     19 getprotobyname() -- map a protocol name (e.g. 'tcp') to a number
     20 ntohs(), ntohl() -- convert 16, 32 bit int from network to host byte order
     21 htons(), htonl() -- convert 16, 32 bit int from host to network byte order
     22 inet_aton() -- convert IP addr string (123.45.67.89) to 32-bit packed format
     23 inet_ntoa() -- convert 32-bit packed format IP to string (123.45.67.89)
     24 ssl() -- secure socket layer support (only available if configured)
     25 socket.getdefaulttimeout() -- get the default timeout value
     26 socket.setdefaulttimeout() -- set the default timeout value
     27 create_connection() -- connects to an address, with an optional timeout and
     28                        optional source address.
     29 
     30  [*] not available on all platforms!
     31 
     32 Special objects:
     33 
     34 SocketType -- type object for socket objects
     35 error -- exception raised for I/O errors
     36 has_ipv6 -- boolean value indicating if IPv6 is supported
     37 
     38 Integer constants:
     39 
     40 AF_INET, AF_UNIX -- socket domains (first argument to socket() call)
     41 SOCK_STREAM, SOCK_DGRAM, SOCK_RAW -- socket types (second argument)
     42 
     43 Many other constants may be defined; these may be used in calls to
     44 the setsockopt() and getsockopt() methods.
     45 """
     46 
     47 import _socket
     48 from _socket import *
     49 from functools import partial
     50 from types import MethodType
     51 
     52 try:
     53     import _ssl
     54 except ImportError:
     55     # no SSL support
     56     pass
     57 else:
     58     def ssl(sock, keyfile=None, certfile=None):
     59         # we do an internal import here because the ssl
     60         # module imports the socket module
     61         import ssl as _realssl
     62         warnings.warn("socket.ssl() is deprecated.  Use ssl.wrap_socket() instead.",
     63                       DeprecationWarning, stacklevel=2)
     64         return _realssl.sslwrap_simple(sock, keyfile, certfile)
     65 
     66     # we need to import the same constants we used to...
     67     from _ssl import SSLError as sslerror
     68     from _ssl import \
     69          RAND_add, \
     70          RAND_status, \
     71          SSL_ERROR_ZERO_RETURN, \
     72          SSL_ERROR_WANT_READ, \
     73          SSL_ERROR_WANT_WRITE, \
     74          SSL_ERROR_WANT_X509_LOOKUP, \
     75          SSL_ERROR_SYSCALL, \
     76          SSL_ERROR_SSL, \
     77          SSL_ERROR_WANT_CONNECT, \
     78          SSL_ERROR_EOF, \
     79          SSL_ERROR_INVALID_ERROR_CODE
     80     try:
     81         from _ssl import RAND_egd
     82     except ImportError:
     83         # LibreSSL does not provide RAND_egd
     84         pass
     85 
     86 import os, sys, warnings
     87 
     88 try:
     89     from cStringIO import StringIO
     90 except ImportError:
     91     from StringIO import StringIO
     92 
     93 try:
     94     import errno
     95 except ImportError:
     96     errno = None
     97 EBADF = getattr(errno, 'EBADF', 9)
     98 EINTR = getattr(errno, 'EINTR', 4)
     99 
    100 __all__ = ["getfqdn", "create_connection"]
    101 __all__.extend(os._get_exports_list(_socket))
    102 
    103 
    104 _realsocket = socket
    105 
    106 # WSA error codes
    107 if sys.platform.lower().startswith("win"):
    108     errorTab = {}
    109     errorTab[10004] = "The operation was interrupted."
    110     errorTab[10009] = "A bad file handle was passed."
    111     errorTab[10013] = "Permission denied."
    112     errorTab[10014] = "A fault occurred on the network??" # WSAEFAULT
    113     errorTab[10022] = "An invalid operation was attempted."
    114     errorTab[10035] = "The socket operation would block"
    115     errorTab[10036] = "A blocking operation is already in progress."
    116     errorTab[10048] = "The network address is in use."
    117     errorTab[10054] = "The connection has been reset."
    118     errorTab[10058] = "The network has been shut down."
    119     errorTab[10060] = "The operation timed out."
    120     errorTab[10061] = "Connection refused."
    121     errorTab[10063] = "The name is too long."
    122     errorTab[10064] = "The host is down."
    123     errorTab[10065] = "The host is unreachable."
    124     __all__.append("errorTab")
    125 
    126 
    127 
    128 def getfqdn(name=''):
    129     """Get fully qualified domain name from name.
    130 
    131     An empty argument is interpreted as meaning the local host.
    132 
    133     First the hostname returned by gethostbyaddr() is checked, then
    134     possibly existing aliases. In case no FQDN is available, hostname
    135     from gethostname() is returned.
    136     """
    137     name = name.strip()
    138     if not name or name == '0.0.0.0':
    139         name = gethostname()
    140     try:
    141         hostname, aliases, ipaddrs = gethostbyaddr(name)
    142     except error:
    143         pass
    144     else:
    145         aliases.insert(0, hostname)
    146         for name in aliases:
    147             if '.' in name:
    148                 break
    149         else:
    150             name = hostname
    151     return name
    152 
    153 
    154 _socketmethods = (
    155     'bind', 'connect', 'connect_ex', 'fileno', 'listen',
    156     'getpeername', 'getsockname', 'getsockopt', 'setsockopt',
    157     'sendall', 'setblocking',
    158     'settimeout', 'gettimeout', 'shutdown')
    159 
    160 if os.name == "nt":
    161     _socketmethods = _socketmethods + ('ioctl',)
    162 
    163 if sys.platform == "riscos":
    164     _socketmethods = _socketmethods + ('sleeptaskw',)
    165 
    166 # All the method names that must be delegated to either the real socket
    167 # object or the _closedsocket object.
    168 _delegate_methods = ("recv", "recvfrom", "recv_into", "recvfrom_into",
    169                      "send", "sendto")
    170 
    171 class _closedsocket(object):
    172     __slots__ = []
    173     def _dummy(*args):
    174         raise error(EBADF, 'Bad file descriptor')
    175     # All _delegate_methods must also be initialized here.
    176     send = recv = recv_into = sendto = recvfrom = recvfrom_into = _dummy
    177     __getattr__ = _dummy
    178 
    179 # Wrapper around platform socket objects. This implements
    180 # a platform-independent dup() functionality. The
    181 # implementation currently relies on reference counting
    182 # to close the underlying socket object.
    183 class _socketobject(object):
    184 
    185     __doc__ = _realsocket.__doc__
    186 
    187     __slots__ = ["_sock", "__weakref__"] + list(_delegate_methods)
    188 
    189     def __init__(self, family=AF_INET, type=SOCK_STREAM, proto=0, _sock=None):
    190         if _sock is None:
    191             _sock = _realsocket(family, type, proto)
    192         self._sock = _sock
    193         for method in _delegate_methods:
    194             setattr(self, method, getattr(_sock, method))
    195 
    196     def close(self, _closedsocket=_closedsocket,
    197               _delegate_methods=_delegate_methods, setattr=setattr):
    198         # This function should not reference any globals. See issue #808164.
    199         self._sock = _closedsocket()
    200         dummy = self._sock._dummy
    201         for method in _delegate_methods:
    202             setattr(self, method, dummy)
    203     close.__doc__ = _realsocket.close.__doc__
    204 
    205     def accept(self):
    206         sock, addr = self._sock.accept()
    207         return _socketobject(_sock=sock), addr
    208     accept.__doc__ = _realsocket.accept.__doc__
    209 
    210     def dup(self):
    211         """dup() -> socket object
    212 
    213         Return a new socket object connected to the same system resource."""
    214         return _socketobject(_sock=self._sock)
    215 
    216     def makefile(self, mode='r', bufsize=-1):
    217         """makefile([mode[, bufsize]]) -> file object
    218 
    219         Return a regular file object corresponding to the socket.  The mode
    220         and bufsize arguments are as for the built-in open() function."""
    221         return _fileobject(self._sock, mode, bufsize)
    222 
    223     family = property(lambda self: self._sock.family, doc="the socket family")
    224     type = property(lambda self: self._sock.type, doc="the socket type")
    225     proto = property(lambda self: self._sock.proto, doc="the socket protocol")
    226 
    227 def meth(name,self,*args):
    228     return getattr(self._sock,name)(*args)
    229 
    230 for _m in _socketmethods:
    231     p = partial(meth,_m)
    232     p.__name__ = _m
    233     p.__doc__ = getattr(_realsocket,_m).__doc__
    234     m = MethodType(p,None,_socketobject)
    235     setattr(_socketobject,_m,m)
    236 
    237 socket = SocketType = _socketobject
    238 
    239 class _fileobject(object):
    240     """Faux file object attached to a socket object."""
    241 
    242     default_bufsize = 8192
    243     name = "<socket>"
    244 
    245     __slots__ = ["mode", "bufsize", "softspace",
    246                  # "closed" is a property, see below
    247                  "_sock", "_rbufsize", "_wbufsize", "_rbuf", "_wbuf", "_wbuf_len",
    248                  "_close"]
    249 
    250     def __init__(self, sock, mode='rb', bufsize=-1, close=False):
    251         self._sock = sock
    252         self.mode = mode # Not actually used in this version
    253         if bufsize < 0:
    254             bufsize = self.default_bufsize
    255         self.bufsize = bufsize
    256         self.softspace = False
    257         # _rbufsize is the suggested recv buffer size.  It is *strictly*
    258         # obeyed within readline() for recv calls.  If it is larger than
    259         # default_bufsize it will be used for recv calls within read().
    260         if bufsize == 0:
    261             self._rbufsize = 1
    262         elif bufsize == 1:
    263             self._rbufsize = self.default_bufsize
    264         else:
    265             self._rbufsize = bufsize
    266         self._wbufsize = bufsize
    267         # We use StringIO for the read buffer to avoid holding a list
    268         # of variously sized string objects which have been known to
    269         # fragment the heap due to how they are malloc()ed and often
    270         # realloc()ed down much smaller than their original allocation.
    271         self._rbuf = StringIO()
    272         self._wbuf = [] # A list of strings
    273         self._wbuf_len = 0
    274         self._close = close
    275 
    276     def _getclosed(self):
    277         return self._sock is None
    278     closed = property(_getclosed, doc="True if the file is closed")
    279 
    280     def close(self):
    281         try:
    282             if self._sock:
    283                 self.flush()
    284         finally:
    285             if self._close:
    286                 self._sock.close()
    287             self._sock = None
    288 
    289     def __del__(self):
    290         try:
    291             self.close()
    292         except:
    293             # close() may fail if __init__ didn't complete
    294             pass
    295 
    296     def flush(self):
    297         if self._wbuf:
    298             data = "".join(self._wbuf)
    299             self._wbuf = []
    300             self._wbuf_len = 0
    301             buffer_size = max(self._rbufsize, self.default_bufsize)
    302             data_size = len(data)
    303             write_offset = 0
    304             view = memoryview(data)
    305             try:
    306                 while write_offset < data_size:
    307                     self._sock.sendall(view[write_offset:write_offset+buffer_size])
    308                     write_offset += buffer_size
    309             finally:
    310                 if write_offset < data_size:
    311                     remainder = data[write_offset:]
    312                     del view, data  # explicit free
    313                     self._wbuf.append(remainder)
    314                     self._wbuf_len = len(remainder)
    315 
    316     def fileno(self):
    317         return self._sock.fileno()
    318 
    319     def write(self, data):
    320         data = str(data) # XXX Should really reject non-string non-buffers
    321         if not data:
    322             return
    323         self._wbuf.append(data)
    324         self._wbuf_len += len(data)
    325         if (self._wbufsize == 0 or
    326             (self._wbufsize == 1 and '\n' in data) or
    327             (self._wbufsize > 1 and self._wbuf_len >= self._wbufsize)):
    328             self.flush()
    329 
    330     def writelines(self, list):
    331         # XXX We could do better here for very long lists
    332         # XXX Should really reject non-string non-buffers
    333         lines = filter(None, map(str, list))
    334         self._wbuf_len += sum(map(len, lines))
    335         self._wbuf.extend(lines)
    336         if (self._wbufsize <= 1 or
    337             self._wbuf_len >= self._wbufsize):
    338             self.flush()
    339 
    340     def read(self, size=-1):
    341         # Use max, disallow tiny reads in a loop as they are very inefficient.
    342         # We never leave read() with any leftover data from a new recv() call
    343         # in our internal buffer.
    344         rbufsize = max(self._rbufsize, self.default_bufsize)
    345         # Our use of StringIO rather than lists of string objects returned by
    346         # recv() minimizes memory usage and fragmentation that occurs when
    347         # rbufsize is large compared to the typical return value of recv().
    348         buf = self._rbuf
    349         buf.seek(0, 2)  # seek end
    350         if size < 0:
    351             # Read until EOF
    352             self._rbuf = StringIO()  # reset _rbuf.  we consume it via buf.
    353             while True:
    354                 try:
    355                     data = self._sock.recv(rbufsize)
    356                 except error, e:
    357                     if e.args[0] == EINTR:
    358                         continue
    359                     raise
    360                 if not data:
    361                     break
    362                 buf.write(data)
    363             return buf.getvalue()
    364         else:
    365             # Read until size bytes or EOF seen, whichever comes first
    366             buf_len = buf.tell()
    367             if buf_len >= size:
    368                 # Already have size bytes in our buffer?  Extract and return.
    369                 buf.seek(0)
    370                 rv = buf.read(size)
    371                 self._rbuf = StringIO()
    372                 self._rbuf.write(buf.read())
    373                 return rv
    374 
    375             self._rbuf = StringIO()  # reset _rbuf.  we consume it via buf.
    376             while True:
    377                 left = size - buf_len
    378                 # recv() will malloc the amount of memory given as its
    379                 # parameter even though it often returns much less data
    380                 # than that.  The returned data string is short lived
    381                 # as we copy it into a StringIO and free it.  This avoids
    382                 # fragmentation issues on many platforms.
    383                 try:
    384                     data = self._sock.recv(left)
    385                 except error, e:
    386                     if e.args[0] == EINTR:
    387                         continue
    388                     raise
    389                 if not data:
    390                     break
    391                 n = len(data)
    392                 if n == size and not buf_len:
    393                     # Shortcut.  Avoid buffer data copies when:
    394                     # - We have no data in our buffer.
    395                     # AND
    396                     # - Our call to recv returned exactly the
    397                     #   number of bytes we were asked to read.
    398                     return data
    399                 if n == left:
    400                     buf.write(data)
    401                     del data  # explicit free
    402                     break
    403                 assert n <= left, "recv(%d) returned %d bytes" % (left, n)
    404                 buf.write(data)
    405                 buf_len += n
    406                 del data  # explicit free
    407                 #assert buf_len == buf.tell()
    408             return buf.getvalue()
    409 
    410     def readline(self, size=-1):
    411         buf = self._rbuf
    412         buf.seek(0, 2)  # seek end
    413         if buf.tell() > 0:
    414             # check if we already have it in our buffer
    415             buf.seek(0)
    416             bline = buf.readline(size)
    417             if bline.endswith('\n') or len(bline) == size:
    418                 self._rbuf = StringIO()
    419                 self._rbuf.write(buf.read())
    420                 return bline
    421             del bline
    422         if size < 0:
    423             # Read until \n or EOF, whichever comes first
    424             if self._rbufsize <= 1:
    425                 # Speed up unbuffered case
    426                 buf.seek(0)
    427                 buffers = [buf.read()]
    428                 self._rbuf = StringIO()  # reset _rbuf.  we consume it via buf.
    429                 data = None
    430                 recv = self._sock.recv
    431                 while True:
    432                     try:
    433                         while data != "\n":
    434                             data = recv(1)
    435                             if not data:
    436                                 break
    437                             buffers.append(data)
    438                     except error, e:
    439                         # The try..except to catch EINTR was moved outside the
    440                         # recv loop to avoid the per byte overhead.
    441                         if e.args[0] == EINTR:
    442                             continue
    443                         raise
    444                     break
    445                 return "".join(buffers)
    446 
    447             buf.seek(0, 2)  # seek end
    448             self._rbuf = StringIO()  # reset _rbuf.  we consume it via buf.
    449             while True:
    450                 try:
    451                     data = self._sock.recv(self._rbufsize)
    452                 except error, e:
    453                     if e.args[0] == EINTR:
    454                         continue
    455                     raise
    456                 if not data:
    457                     break
    458                 nl = data.find('\n')
    459                 if nl >= 0:
    460                     nl += 1
    461                     buf.write(data[:nl])
    462                     self._rbuf.write(data[nl:])
    463                     del data
    464                     break
    465                 buf.write(data)
    466             return buf.getvalue()
    467         else:
    468             # Read until size bytes or \n or EOF seen, whichever comes first
    469             buf.seek(0, 2)  # seek end
    470             buf_len = buf.tell()
    471             if buf_len >= size:
    472                 buf.seek(0)
    473                 rv = buf.read(size)
    474                 self._rbuf = StringIO()
    475                 self._rbuf.write(buf.read())
    476                 return rv
    477             self._rbuf = StringIO()  # reset _rbuf.  we consume it via buf.
    478             while True:
    479                 try:
    480                     data = self._sock.recv(self._rbufsize)
    481                 except error, e:
    482                     if e.args[0] == EINTR:
    483                         continue
    484                     raise
    485                 if not data:
    486                     break
    487                 left = size - buf_len
    488                 # did we just receive a newline?
    489                 nl = data.find('\n', 0, left)
    490                 if nl >= 0:
    491                     nl += 1
    492                     # save the excess data to _rbuf
    493                     self._rbuf.write(data[nl:])
    494                     if buf_len:
    495                         buf.write(data[:nl])
    496                         break
    497                     else:
    498                         # Shortcut.  Avoid data copy through buf when returning
    499                         # a substring of our first recv().
    500                         return data[:nl]
    501                 n = len(data)
    502                 if n == size and not buf_len:
    503                     # Shortcut.  Avoid data copy through buf when
    504                     # returning exactly all of our first recv().
    505                     return data
    506                 if n >= left:
    507                     buf.write(data[:left])
    508                     self._rbuf.write(data[left:])
    509                     break
    510                 buf.write(data)
    511                 buf_len += n
    512                 #assert buf_len == buf.tell()
    513             return buf.getvalue()
    514 
    515     def readlines(self, sizehint=0):
    516         total = 0
    517         list = []
    518         while True:
    519             line = self.readline()
    520             if not line:
    521                 break
    522             list.append(line)
    523             total += len(line)
    524             if sizehint and total >= sizehint:
    525                 break
    526         return list
    527 
    528     # Iterator protocols
    529 
    530     def __iter__(self):
    531         return self
    532 
    533     def next(self):
    534         line = self.readline()
    535         if not line:
    536             raise StopIteration
    537         return line
    538 
    539 _GLOBAL_DEFAULT_TIMEOUT = object()
    540 
    541 def create_connection(address, timeout=_GLOBAL_DEFAULT_TIMEOUT,
    542                       source_address=None):
    543     """Connect to *address* and return the socket object.
    544 
    545     Convenience function.  Connect to *address* (a 2-tuple ``(host,
    546     port)``) and return the socket object.  Passing the optional
    547     *timeout* parameter will set the timeout on the socket instance
    548     before attempting to connect.  If no *timeout* is supplied, the
    549     global default timeout setting returned by :func:`getdefaulttimeout`
    550     is used.  If *source_address* is set it must be a tuple of (host, port)
    551     for the socket to bind as a source address before making the connection.
    552     A host of '' or port 0 tells the OS to use the default.
    553     """
    554 
    555     host, port = address
    556     err = None
    557     for res in getaddrinfo(host, port, 0, SOCK_STREAM):
    558         af, socktype, proto, canonname, sa = res
    559         sock = None
    560         try:
    561             sock = socket(af, socktype, proto)
    562             if timeout is not _GLOBAL_DEFAULT_TIMEOUT:
    563                 sock.settimeout(timeout)
    564             if source_address:
    565                 sock.bind(source_address)
    566             sock.connect(sa)
    567             return sock
    568 
    569         except error as _:
    570             err = _
    571             if sock is not None:
    572                 sock.close()
    573 
    574     if err is not None:
    575         raise err
    576     else:
    577         raise error("getaddrinfo returns an empty list")
    578