source: titan/mediathek/localhoster/lib/python2.7/socket.py @ 40114

Last change on this file since 40114 was 40094, checked in by obi, 7 years ago

tithek add yoztube-dl support

File size: 20.1 KB
Line 
1# Wrapper module for _socket, providing some additional facilities
2# implemented in Python.
3
4"""\
5This module provides socket operations and some related functions.
6On Unix, it supports IP (Internet Protocol) and Unix domain sockets.
7On other systems, it only supports IP. Functions specific for a
8socket are available as methods of the socket object.
9
10Functions:
11
12socket() -- create a new socket object
13socketpair() -- create a pair of new socket objects [*]
14fromfd() -- create a socket object from an open file descriptor [*]
15gethostname() -- return the current hostname
16gethostbyname() -- map a hostname to its IP number
17gethostbyaddr() -- map an IP number or hostname to DNS info
18getservbyname() -- map a service name and a protocol name to a port number
19getprotobyname() -- map a protocol name (e.g. 'tcp') to a number
20ntohs(), ntohl() -- convert 16, 32 bit int from network to host byte order
21htons(), htonl() -- convert 16, 32 bit int from host to network byte order
22inet_aton() -- convert IP addr string (123.45.67.89) to 32-bit packed format
23inet_ntoa() -- convert 32-bit packed format IP to string (123.45.67.89)
24ssl() -- secure socket layer support (only available if configured)
25socket.getdefaulttimeout() -- get the default timeout value
26socket.setdefaulttimeout() -- set the default timeout value
27create_connection() -- connects to an address, with an optional timeout and
28                       optional source address.
29
30 [*] not available on all platforms!
31
32Special objects:
33
34SocketType -- type object for socket objects
35error -- exception raised for I/O errors
36has_ipv6 -- boolean value indicating if IPv6 is supported
37
38Integer constants:
39
40AF_INET, AF_UNIX -- socket domains (first argument to socket() call)
41SOCK_STREAM, SOCK_DGRAM, SOCK_RAW -- socket types (second argument)
42
43Many other constants may be defined; these may be used in calls to
44the setsockopt() and getsockopt() methods.
45"""
46
47import _socket
48from _socket import *
49from functools import partial
50from types import MethodType
51
52try:
53    import _ssl
54except ImportError:
55    # no SSL support
56    pass
57else:
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
86import os, sys, warnings
87
88try:
89    from cStringIO import StringIO
90except ImportError:
91    from StringIO import StringIO
92
93try:
94    import errno
95except ImportError:
96    errno = None
97EBADF = getattr(errno, 'EBADF', 9)
98EINTR = 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
107if 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
128def 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
160if os.name == "nt":
161    _socketmethods = _socketmethods + ('ioctl',)
162
163if 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
171class _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.
183class _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
227def meth(name,self,*args):
228    return getattr(self._sock,name)(*args)
229
230for _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
237socket = SocketType = _socketobject
238
239class _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
541def 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    An 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")
Note: See TracBrowser for help on using the repository browser.