annotate Lib/socket.py @ 39940:dfd809dcf680 2.5

Bug #1446043: correctly raise a LookupError if an encoding name given to encodings.search_function() contains a dot. (backport from rev. 52075)
author Georg Brandl <georg@python.org>
date Sat, 30 Sep 2006 11:22:35 +0000
parents 9c6dc6d09b07
children 2fa6e82b1f17
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
14007
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
1 # Wrapper module for _socket, providing some additional facilities
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
2 # implemented in Python.
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
3
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
4 """\
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
5 This module provides socket operations and some related functions.
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
6 On Unix, it supports IP (Internet Protocol) and Unix domain sockets.
15872
3685ef2a55a4 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14935
diff changeset
7 On other systems, it only supports IP. Functions specific for a
14935
13488539f02b Mention in the module's doc string that other functions of the socket API
Martin v. Löwis <martin@v.loewis.de>
parents: 14682
diff changeset
8 socket are available as methods of the socket object.
14007
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
9
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
10 Functions:
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
11
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
12 socket() -- create a new socket object
33063
90da70986407 Patch #1003700: Add socketpair function to socket module.
Dave Cole <djc@object-craft.com.au>
parents: 32160
diff changeset
13 socketpair() -- create a pair of new socket objects [*]
14007
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
14 fromfd() -- create a socket object from an open file descriptor [*]
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
15 gethostname() -- return the current hostname
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
16 gethostbyname() -- map a hostname to its IP number
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
17 gethostbyaddr() -- map an IP number or hostname to DNS info
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
18 getservbyname() -- map a service name and a protocol name to a port number
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
19 getprotobyname() -- mape a protocol name (e.g. 'tcp') to a number
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
20 ntohs(), ntohl() -- convert 16, 32 bit int from network to host byte order
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
21 htons(), htonl() -- convert 16, 32 bit int from host to network byte order
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
22 inet_aton() -- convert IP addr string (123.45.67.89) to 32-bit packed format
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
23 inet_ntoa() -- convert 32-bit packed format IP to string (123.45.67.89)
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
24 ssl() -- secure socket layer support (only available if configured)
24293
640370f08e2a Add default timeout functionality. This adds setdefaulttimeout() and
Guido van Rossum <guido@python.org>
parents: 23844
diff changeset
25 socket.getdefaulttimeout() -- get the default timeout value
640370f08e2a Add default timeout functionality. This adds setdefaulttimeout() and
Guido van Rossum <guido@python.org>
parents: 23844
diff changeset
26 socket.setdefaulttimeout() -- set the default timeout value
14007
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
27
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
28 [*] not available on all platforms!
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
29
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
30 Special objects:
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
31
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
32 SocketType -- type object for socket objects
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
33 error -- exception raised for I/O errors
28818
57e61588571b Patch by Jp Calderone:
Guido van Rossum <guido@python.org>
parents: 28443
diff changeset
34 has_ipv6 -- boolean value indicating if IPv6 is supported
14007
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
35
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
36 Integer constants:
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
37
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
38 AF_INET, AF_UNIX -- socket domains (first argument to socket() call)
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
39 SOCK_STREAM, SOCK_DGRAM, SOCK_RAW -- socket types (second argument)
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
40
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
41 Many other constants may be defined; these may be used in calls to
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
42 the setsockopt() and getsockopt() methods.
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
43 """
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
44
21971
fce7278d46b0 Repair so that importing socket doesn't blow up on platforms that lack
Tim Peters <tim.peters@gmail.com>
parents: 21962
diff changeset
45 import _socket
14007
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
46 from _socket import *
21971
fce7278d46b0 Repair so that importing socket doesn't blow up on platforms that lack
Tim Peters <tim.peters@gmail.com>
parents: 21962
diff changeset
47
24661
2f411f2d791a Another refactoring. Changed 'socket' from being a factory function
Guido van Rossum <guido@python.org>
parents: 24656
diff changeset
48 _have_ssl = False
21959
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents: 21473
diff changeset
49 try:
24663
b265e76bab88 Extend __all__ with the exports list of the _ssl module.
Guido van Rossum <guido@python.org>
parents: 24662
diff changeset
50 import _ssl
21959
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents: 21473
diff changeset
51 from _ssl import *
24661
2f411f2d791a Another refactoring. Changed 'socket' from being a factory function
Guido van Rossum <guido@python.org>
parents: 24656
diff changeset
52 _have_ssl = True
21959
3957d155f8c5 Break SSL support out of _socket module and place it into a new
Marc-André Lemburg <mal@egenix.com>
parents: 21473
diff changeset
53 except ImportError:
24661
2f411f2d791a Another refactoring. Changed 'socket' from being a factory function
Guido van Rossum <guido@python.org>
parents: 24656
diff changeset
54 pass
14007
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
55
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
56 import os, sys
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
57
28890
39f4b97ce828 Extract the errno value to use from the errno module if possible.
Fred Drake <fdrake@acm.org>
parents: 28888
diff changeset
58 try:
39f4b97ce828 Extract the errno value to use from the errno module if possible.
Fred Drake <fdrake@acm.org>
parents: 28888
diff changeset
59 from errno import EBADF
39f4b97ce828 Extract the errno value to use from the errno module if possible.
Fred Drake <fdrake@acm.org>
parents: 28888
diff changeset
60 except ImportError:
39f4b97ce828 Extract the errno value to use from the errno module if possible.
Fred Drake <fdrake@acm.org>
parents: 28888
diff changeset
61 EBADF = 9
39f4b97ce828 Extract the errno value to use from the errno module if possible.
Fred Drake <fdrake@acm.org>
parents: 28888
diff changeset
62
16613
f68dbffff927 bunch more __all__ lists
Skip Montanaro <skip@pobox.com>
parents: 15872
diff changeset
63 __all__ = ["getfqdn"]
f68dbffff927 bunch more __all__ lists
Skip Montanaro <skip@pobox.com>
parents: 15872
diff changeset
64 __all__.extend(os._get_exports_list(_socket))
24663
b265e76bab88 Extend __all__ with the exports list of the _ssl module.
Guido van Rossum <guido@python.org>
parents: 24662
diff changeset
65 if _have_ssl:
b265e76bab88 Extend __all__ with the exports list of the _ssl module.
Guido van Rossum <guido@python.org>
parents: 24662
diff changeset
66 __all__.extend(os._get_exports_list(_ssl))
16613
f68dbffff927 bunch more __all__ lists
Skip Montanaro <skip@pobox.com>
parents: 15872
diff changeset
67
24661
2f411f2d791a Another refactoring. Changed 'socket' from being a factory function
Guido van Rossum <guido@python.org>
parents: 24656
diff changeset
68 _realsocket = socket
29465
1e2e54821785 Always unwrap _socketobj in socket.ssl. Revert httplib.py 1.25.
Martin v. Löwis <martin@v.loewis.de>
parents: 29311
diff changeset
69 if _have_ssl:
1e2e54821785 Always unwrap _socketobj in socket.ssl. Revert httplib.py 1.25.
Martin v. Löwis <martin@v.loewis.de>
parents: 29311
diff changeset
70 _realssl = ssl
1e2e54821785 Always unwrap _socketobj in socket.ssl. Revert httplib.py 1.25.
Martin v. Löwis <martin@v.loewis.de>
parents: 29311
diff changeset
71 def ssl(sock, keyfile=None, certfile=None):
1e2e54821785 Always unwrap _socketobj in socket.ssl. Revert httplib.py 1.25.
Martin v. Löwis <martin@v.loewis.de>
parents: 29311
diff changeset
72 if hasattr(sock, "_sock"):
1e2e54821785 Always unwrap _socketobj in socket.ssl. Revert httplib.py 1.25.
Martin v. Löwis <martin@v.loewis.de>
parents: 29311
diff changeset
73 sock = sock._sock
1e2e54821785 Always unwrap _socketobj in socket.ssl. Revert httplib.py 1.25.
Martin v. Löwis <martin@v.loewis.de>
parents: 29311
diff changeset
74 return _realssl(sock, keyfile, certfile)
14007
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
75
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
76 # WSA error codes
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
77 if sys.platform.lower().startswith("win"):
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
78 errorTab = {}
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
79 errorTab[10004] = "The operation was interrupted."
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
80 errorTab[10009] = "A bad file handle was passed."
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
81 errorTab[10013] = "Permission denied."
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
82 errorTab[10014] = "A fault occurred on the network??" # WSAEFAULT
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
83 errorTab[10022] = "An invalid operation was attempted."
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
84 errorTab[10035] = "The socket operation would block"
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
85 errorTab[10036] = "A blocking operation is already in progress."
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
86 errorTab[10048] = "The network address is in use."
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
87 errorTab[10054] = "The connection has been reset."
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
88 errorTab[10058] = "The network has been shut down."
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
89 errorTab[10060] = "The operation timed out."
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
90 errorTab[10061] = "Connection refused."
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
91 errorTab[10063] = "The name is too long."
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
92 errorTab[10064] = "The host is down."
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
93 errorTab[10065] = "The host is unreachable."
17071
b45ae8c467aa add errorTab to __all__ on win*
Skip Montanaro <skip@pobox.com>
parents: 16949
diff changeset
94 __all__.append("errorTab")
24663
b265e76bab88 Extend __all__ with the exports list of the _ssl module.
Guido van Rossum <guido@python.org>
parents: 24662
diff changeset
95
14007
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
96
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
97
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
98 def getfqdn(name=''):
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
99 """Get fully qualified domain name from name.
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
100
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
101 An empty argument is interpreted as meaning the local host.
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
102
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
103 First the hostname returned by gethostbyaddr() is checked, then
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
104 possibly existing aliases. In case no FQDN is available, hostname
34733
e83309d43a82 Fix test for socket.getfqdn() to also include the name returned by
Brett Cannon <bcannon@gmail.com>
parents: 33063
diff changeset
105 from gethostname() is returned.
14007
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
106 """
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
107 name = name.strip()
14014
3d68d5bccd40 updated occurences of fqdn algorithm (closes patch #101197)
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 14007
diff changeset
108 if not name or name == '0.0.0.0':
14007
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
109 name = gethostname()
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
110 try:
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
111 hostname, aliases, ipaddrs = gethostbyaddr(name)
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
112 except error:
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
113 pass
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
114 else:
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
115 aliases.insert(0, hostname)
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
116 for name in aliases:
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
117 if '.' in name:
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
118 break
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
119 else:
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
120 name = hostname
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
121 return name
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
122
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
123
19364
b738428238f1 When the socket is closed, don't just assign 0 to self._sock.
Guido van Rossum <guido@python.org>
parents: 17245
diff changeset
124 _socketmethods = (
b738428238f1 When the socket is closed, don't just assign 0 to self._sock.
Guido van Rossum <guido@python.org>
parents: 17245
diff changeset
125 'bind', 'connect', 'connect_ex', 'fileno', 'listen',
b738428238f1 When the socket is closed, don't just assign 0 to self._sock.
Guido van Rossum <guido@python.org>
parents: 17245
diff changeset
126 'getpeername', 'getsockname', 'getsockopt', 'setsockopt',
28888
d3164a304598 Regain throughput lost with the _socketobject wrapper. The
Skip Montanaro <skip@pobox.com>
parents: 28818
diff changeset
127 'sendall', 'setblocking',
23715
c2733e8f6612 SF patch 555085 (timeout socket implementation) by Michael Gilfix.
Guido van Rossum <guido@python.org>
parents: 21971
diff changeset
128 'settimeout', 'gettimeout', 'shutdown')
19364
b738428238f1 When the socket is closed, don't just assign 0 to self._sock.
Guido van Rossum <guido@python.org>
parents: 17245
diff changeset
129
29066
90342f395721 Patch #734231: Update RiscOS support. In particular, correct
Martin v. Löwis <martin@v.loewis.de>
parents: 28890
diff changeset
130 if sys.platform == "riscos":
90342f395721 Patch #734231: Update RiscOS support. In particular, correct
Martin v. Löwis <martin@v.loewis.de>
parents: 28890
diff changeset
131 _socketmethods = _socketmethods + ('sleeptaskw',)
90342f395721 Patch #734231: Update RiscOS support. In particular, correct
Martin v. Löwis <martin@v.loewis.de>
parents: 28890
diff changeset
132
38976
c547f6e91c58 Release all forwarded functions in .close. Fixes #1513223.
Martin v. Löwis <martin@v.loewis.de>
parents: 38580
diff changeset
133 # All the method names that must be delegated to either the real socket
c547f6e91c58 Release all forwarded functions in .close. Fixes #1513223.
Martin v. Löwis <martin@v.loewis.de>
parents: 38580
diff changeset
134 # object or the _closedsocket object.
c547f6e91c58 Release all forwarded functions in .close. Fixes #1513223.
Martin v. Löwis <martin@v.loewis.de>
parents: 38580
diff changeset
135 _delegate_methods = ("recv", "recvfrom", "recv_into", "recvfrom_into",
c547f6e91c58 Release all forwarded functions in .close. Fixes #1513223.
Martin v. Löwis <martin@v.loewis.de>
parents: 38580
diff changeset
136 "send", "sendto")
c547f6e91c58 Release all forwarded functions in .close. Fixes #1513223.
Martin v. Löwis <martin@v.loewis.de>
parents: 38580
diff changeset
137
24666
4fbf534211b9 The _socketobject class has no need for a __del__ method: all it did was
Guido van Rossum <guido@python.org>
parents: 24665
diff changeset
138 class _closedsocket(object):
4fbf534211b9 The _socketobject class has no need for a __del__ method: all it did was
Guido van Rossum <guido@python.org>
parents: 24665
diff changeset
139 __slots__ = []
28888
d3164a304598 Regain throughput lost with the _socketobject wrapper. The
Skip Montanaro <skip@pobox.com>
parents: 28818
diff changeset
140 def _dummy(*args):
28890
39f4b97ce828 Extract the errno value to use from the errno module if possible.
Fred Drake <fdrake@acm.org>
parents: 28888
diff changeset
141 raise error(EBADF, 'Bad file descriptor')
39190
9c6dc6d09b07 Bug #978833: Really close underlying socket in _socketobject.close.
Martin v. Löwis <martin@v.loewis.de>
parents: 38976
diff changeset
142 def close(self):
9c6dc6d09b07 Bug #978833: Really close underlying socket in _socketobject.close.
Martin v. Löwis <martin@v.loewis.de>
parents: 38976
diff changeset
143 pass
38976
c547f6e91c58 Release all forwarded functions in .close. Fixes #1513223.
Martin v. Löwis <martin@v.loewis.de>
parents: 38580
diff changeset
144 # All _delegate_methods must also be initialized here.
c547f6e91c58 Release all forwarded functions in .close. Fixes #1513223.
Martin v. Löwis <martin@v.loewis.de>
parents: 38580
diff changeset
145 send = recv = recv_into = sendto = recvfrom = recvfrom_into = _dummy
c547f6e91c58 Release all forwarded functions in .close. Fixes #1513223.
Martin v. Löwis <martin@v.loewis.de>
parents: 38580
diff changeset
146 __getattr__ = _dummy
24666
4fbf534211b9 The _socketobject class has no need for a __del__ method: all it did was
Guido van Rossum <guido@python.org>
parents: 24665
diff changeset
147
24661
2f411f2d791a Another refactoring. Changed 'socket' from being a factory function
Guido van Rossum <guido@python.org>
parents: 24656
diff changeset
148 class _socketobject(object):
2f411f2d791a Another refactoring. Changed 'socket' from being a factory function
Guido van Rossum <guido@python.org>
parents: 24656
diff changeset
149
2f411f2d791a Another refactoring. Changed 'socket' from being a factory function
Guido van Rossum <guido@python.org>
parents: 24656
diff changeset
150 __doc__ = _realsocket.__doc__
14007
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
151
38976
c547f6e91c58 Release all forwarded functions in .close. Fixes #1513223.
Martin v. Löwis <martin@v.loewis.de>
parents: 38580
diff changeset
152 __slots__ = ["_sock", "__weakref__"] + list(_delegate_methods)
24661
2f411f2d791a Another refactoring. Changed 'socket' from being a factory function
Guido van Rossum <guido@python.org>
parents: 24656
diff changeset
153
2f411f2d791a Another refactoring. Changed 'socket' from being a factory function
Guido van Rossum <guido@python.org>
parents: 24656
diff changeset
154 def __init__(self, family=AF_INET, type=SOCK_STREAM, proto=0, _sock=None):
2f411f2d791a Another refactoring. Changed 'socket' from being a factory function
Guido van Rossum <guido@python.org>
parents: 24656
diff changeset
155 if _sock is None:
24662
a61893d7cef2 Oops, stupid tabs. Sorry again.
Guido van Rossum <guido@python.org>
parents: 24661
diff changeset
156 _sock = _realsocket(family, type, proto)
24661
2f411f2d791a Another refactoring. Changed 'socket' from being a factory function
Guido van Rossum <guido@python.org>
parents: 24656
diff changeset
157 self._sock = _sock
38976
c547f6e91c58 Release all forwarded functions in .close. Fixes #1513223.
Martin v. Löwis <martin@v.loewis.de>
parents: 38580
diff changeset
158 for method in _delegate_methods:
c547f6e91c58 Release all forwarded functions in .close. Fixes #1513223.
Martin v. Löwis <martin@v.loewis.de>
parents: 38580
diff changeset
159 setattr(self, method, getattr(_sock, method))
14007
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
160
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
161 def close(self):
39190
9c6dc6d09b07 Bug #978833: Really close underlying socket in _socketobject.close.
Martin v. Löwis <martin@v.loewis.de>
parents: 38976
diff changeset
162 self._sock.close()
24666
4fbf534211b9 The _socketobject class has no need for a __del__ method: all it did was
Guido van Rossum <guido@python.org>
parents: 24665
diff changeset
163 self._sock = _closedsocket()
38976
c547f6e91c58 Release all forwarded functions in .close. Fixes #1513223.
Martin v. Löwis <martin@v.loewis.de>
parents: 38580
diff changeset
164 dummy = self._sock._dummy
c547f6e91c58 Release all forwarded functions in .close. Fixes #1513223.
Martin v. Löwis <martin@v.loewis.de>
parents: 38580
diff changeset
165 for method in _delegate_methods:
c547f6e91c58 Release all forwarded functions in .close. Fixes #1513223.
Martin v. Löwis <martin@v.loewis.de>
parents: 38580
diff changeset
166 setattr(self, method, dummy)
24661
2f411f2d791a Another refactoring. Changed 'socket' from being a factory function
Guido van Rossum <guido@python.org>
parents: 24656
diff changeset
167 close.__doc__ = _realsocket.close.__doc__
14007
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
168
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
169 def accept(self):
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
170 sock, addr = self._sock.accept()
24661
2f411f2d791a Another refactoring. Changed 'socket' from being a factory function
Guido van Rossum <guido@python.org>
parents: 24656
diff changeset
171 return _socketobject(_sock=sock), addr
2f411f2d791a Another refactoring. Changed 'socket' from being a factory function
Guido van Rossum <guido@python.org>
parents: 24656
diff changeset
172 accept.__doc__ = _realsocket.accept.__doc__
14007
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
173
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
174 def dup(self):
24661
2f411f2d791a Another refactoring. Changed 'socket' from being a factory function
Guido van Rossum <guido@python.org>
parents: 24656
diff changeset
175 """dup() -> socket object
2f411f2d791a Another refactoring. Changed 'socket' from being a factory function
Guido van Rossum <guido@python.org>
parents: 24656
diff changeset
176
2f411f2d791a Another refactoring. Changed 'socket' from being a factory function
Guido van Rossum <guido@python.org>
parents: 24656
diff changeset
177 Return a new socket object connected to the same system resource."""
2f411f2d791a Another refactoring. Changed 'socket' from being a factory function
Guido van Rossum <guido@python.org>
parents: 24656
diff changeset
178 return _socketobject(_sock=self._sock)
14007
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
179
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
180 def makefile(self, mode='r', bufsize=-1):
24661
2f411f2d791a Another refactoring. Changed 'socket' from being a factory function
Guido van Rossum <guido@python.org>
parents: 24656
diff changeset
181 """makefile([mode[, bufsize]]) -> file object
2f411f2d791a Another refactoring. Changed 'socket' from being a factory function
Guido van Rossum <guido@python.org>
parents: 24656
diff changeset
182
2f411f2d791a Another refactoring. Changed 'socket' from being a factory function
Guido van Rossum <guido@python.org>
parents: 24656
diff changeset
183 Return a regular file object corresponding to the socket. The mode
2f411f2d791a Another refactoring. Changed 'socket' from being a factory function
Guido van Rossum <guido@python.org>
parents: 24656
diff changeset
184 and bufsize arguments are as for the built-in open() function."""
14007
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
185 return _fileobject(self._sock, mode, bufsize)
37136
71c5694e3423 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 37123
diff changeset
186
37123
251ecec04f1b Correct API design mistake from rev. 43126: make socket attributes readonly properties.
Georg Brandl <georg@python.org>
parents: 37069
diff changeset
187 family = property(lambda self: self._sock.family, doc="the socket family")
251ecec04f1b Correct API design mistake from rev. 43126: make socket attributes readonly properties.
Georg Brandl <georg@python.org>
parents: 37069
diff changeset
188 type = property(lambda self: self._sock.type, doc="the socket type")
251ecec04f1b Correct API design mistake from rev. 43126: make socket attributes readonly properties.
Georg Brandl <georg@python.org>
parents: 37069
diff changeset
189 proto = property(lambda self: self._sock.proto, doc="the socket protocol")
37069
dd49847a60d3 RFE #567972: Socket objects' family, type and proto properties are
Georg Brandl <georg@python.org>
parents: 34733
diff changeset
190
24661
2f411f2d791a Another refactoring. Changed 'socket' from being a factory function
Guido van Rossum <guido@python.org>
parents: 24656
diff changeset
191 _s = ("def %s(self, *args): return self._sock.%s(*args)\n\n"
2f411f2d791a Another refactoring. Changed 'socket' from being a factory function
Guido van Rossum <guido@python.org>
parents: 24656
diff changeset
192 "%s.__doc__ = _realsocket.%s.__doc__\n")
19364
b738428238f1 When the socket is closed, don't just assign 0 to self._sock.
Guido van Rossum <guido@python.org>
parents: 17245
diff changeset
193 for _m in _socketmethods:
24661
2f411f2d791a Another refactoring. Changed 'socket' from being a factory function
Guido van Rossum <guido@python.org>
parents: 24656
diff changeset
194 exec _s % (_m, _m, _m, _m)
24673
3796d39f0b80 Delete junk attributes left behind by _socketobject class construction.
Tim Peters <tim.peters@gmail.com>
parents: 24666
diff changeset
195 del _m, _s
14007
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
196
28443
161b8bd8a226 The socket module now always uses the _socketobject wrapper class, even on
Skip Montanaro <skip@pobox.com>
parents: 24944
diff changeset
197 socket = SocketType = _socketobject
14007
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
198
24661
2f411f2d791a Another refactoring. Changed 'socket' from being a factory function
Guido van Rossum <guido@python.org>
parents: 24656
diff changeset
199 class _fileobject(object):
24656
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
200 """Faux file object attached to a socket object."""
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
201
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
202 default_bufsize = 8192
24661
2f411f2d791a Another refactoring. Changed 'socket' from being a factory function
Guido van Rossum <guido@python.org>
parents: 24656
diff changeset
203 name = "<socket>"
2f411f2d791a Another refactoring. Changed 'socket' from being a factory function
Guido van Rossum <guido@python.org>
parents: 24656
diff changeset
204
2f411f2d791a Another refactoring. Changed 'socket' from being a factory function
Guido van Rossum <guido@python.org>
parents: 24656
diff changeset
205 __slots__ = ["mode", "bufsize", "softspace",
2f411f2d791a Another refactoring. Changed 'socket' from being a factory function
Guido van Rossum <guido@python.org>
parents: 24656
diff changeset
206 # "closed" is a property, see below
2f411f2d791a Another refactoring. Changed 'socket' from being a factory function
Guido van Rossum <guido@python.org>
parents: 24656
diff changeset
207 "_sock", "_rbufsize", "_wbufsize", "_rbuf", "_wbuf"]
14007
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
208
24634
778093533a46 "Unbuffered" mode of class _fileobject wasn't actually unbuffered,
Guido van Rossum <guido@python.org>
parents: 24454
diff changeset
209 def __init__(self, sock, mode='rb', bufsize=-1):
14007
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
210 self._sock = sock
24661
2f411f2d791a Another refactoring. Changed 'socket' from being a factory function
Guido van Rossum <guido@python.org>
parents: 24656
diff changeset
211 self.mode = mode # Not actually used in this version
24656
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
212 if bufsize < 0:
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
213 bufsize = self.default_bufsize
24662
a61893d7cef2 Oops, stupid tabs. Sorry again.
Guido van Rossum <guido@python.org>
parents: 24661
diff changeset
214 self.bufsize = bufsize
a61893d7cef2 Oops, stupid tabs. Sorry again.
Guido van Rossum <guido@python.org>
parents: 24661
diff changeset
215 self.softspace = False
24656
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
216 if bufsize == 0:
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
217 self._rbufsize = 1
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
218 elif bufsize == 1:
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
219 self._rbufsize = self.default_bufsize
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
220 else:
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
221 self._rbufsize = bufsize
14007
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
222 self._wbufsize = bufsize
24664
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
223 self._rbuf = "" # A string
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
224 self._wbuf = [] # A list of strings
14007
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
225
24661
2f411f2d791a Another refactoring. Changed 'socket' from being a factory function
Guido van Rossum <guido@python.org>
parents: 24656
diff changeset
226 def _getclosed(self):
31833
a910b822b12c SF bug 924242: socket._fileobject._getclosed() returns wrong value
Tim Peters <tim.peters@gmail.com>
parents: 29465
diff changeset
227 return self._sock is None
24661
2f411f2d791a Another refactoring. Changed 'socket' from being a factory function
Guido van Rossum <guido@python.org>
parents: 24656
diff changeset
228 closed = property(_getclosed, doc="True if the file is closed")
2f411f2d791a Another refactoring. Changed 'socket' from being a factory function
Guido van Rossum <guido@python.org>
parents: 24656
diff changeset
229
14007
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
230 def close(self):
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
231 try:
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
232 if self._sock:
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
233 self.flush()
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
234 finally:
23715
c2733e8f6612 SF patch 555085 (timeout socket implementation) by Michael Gilfix.
Guido van Rossum <guido@python.org>
parents: 21971
diff changeset
235 self._sock = None
14007
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
236
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
237 def __del__(self):
29311
ed70779f6402 I saw errors from _fileobject.__del__ about missing self._sock. This
Guido van Rossum <guido@python.org>
parents: 29066
diff changeset
238 try:
ed70779f6402 I saw errors from _fileobject.__del__ about missing self._sock. This
Guido van Rossum <guido@python.org>
parents: 29066
diff changeset
239 self.close()
ed70779f6402 I saw errors from _fileobject.__del__ about missing self._sock. This
Guido van Rossum <guido@python.org>
parents: 29066
diff changeset
240 except:
ed70779f6402 I saw errors from _fileobject.__del__ about missing self._sock. This
Guido van Rossum <guido@python.org>
parents: 29066
diff changeset
241 # close() may fail if __init__ didn't complete
ed70779f6402 I saw errors from _fileobject.__del__ about missing self._sock. This
Guido van Rossum <guido@python.org>
parents: 29066
diff changeset
242 pass
14007
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
243
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
244 def flush(self):
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
245 if self._wbuf:
24656
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
246 buffer = "".join(self._wbuf)
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
247 self._wbuf = []
23715
c2733e8f6612 SF patch 555085 (timeout socket implementation) by Michael Gilfix.
Guido van Rossum <guido@python.org>
parents: 21971
diff changeset
248 self._sock.sendall(buffer)
14007
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
249
23844
bd37eb4daf3b Cleanup a little
Neal Norwitz <nnorwitz@gmail.com>
parents: 23715
diff changeset
250 def fileno(self):
14007
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
251 return self._sock.fileno()
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
252
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
253 def write(self, data):
24656
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
254 data = str(data) # XXX Should really reject non-string non-buffers
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
255 if not data:
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
256 return
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
257 self._wbuf.append(data)
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
258 if (self._wbufsize == 0 or
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
259 self._wbufsize == 1 and '\n' in data or
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
260 self._get_wbuf_len() >= self._wbufsize):
23715
c2733e8f6612 SF patch 555085 (timeout socket implementation) by Michael Gilfix.
Guido van Rossum <guido@python.org>
parents: 21971
diff changeset
261 self.flush()
14007
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
262
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
263 def writelines(self, list):
24656
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
264 # XXX We could do better here for very long lists
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
265 # XXX Should really reject non-string non-buffers
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
266 self._wbuf.extend(filter(None, map(str, list)))
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
267 if (self._wbufsize <= 1 or
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
268 self._get_wbuf_len() >= self._wbufsize):
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
269 self.flush()
14007
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
270
24656
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
271 def _get_wbuf_len(self):
23715
c2733e8f6612 SF patch 555085 (timeout socket implementation) by Michael Gilfix.
Guido van Rossum <guido@python.org>
parents: 21971
diff changeset
272 buf_len = 0
24656
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
273 for x in self._wbuf:
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
274 buf_len += len(x)
23715
c2733e8f6612 SF patch 555085 (timeout socket implementation) by Michael Gilfix.
Guido van Rossum <guido@python.org>
parents: 21971
diff changeset
275 return buf_len
c2733e8f6612 SF patch 555085 (timeout socket implementation) by Michael Gilfix.
Guido van Rossum <guido@python.org>
parents: 21971
diff changeset
276
c2733e8f6612 SF patch 555085 (timeout socket implementation) by Michael Gilfix.
Guido van Rossum <guido@python.org>
parents: 21971
diff changeset
277 def read(self, size=-1):
24664
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
278 data = self._rbuf
24656
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
279 if size < 0:
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
280 # Read until EOF
24664
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
281 buffers = []
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
282 if data:
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
283 buffers.append(data)
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
284 self._rbuf = ""
24656
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
285 if self._rbufsize <= 1:
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
286 recv_size = self.default_bufsize
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
287 else:
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
288 recv_size = self._rbufsize
24664
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
289 while True:
24656
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
290 data = self._sock.recv(recv_size)
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
291 if not data:
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
292 break
24664
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
293 buffers.append(data)
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
294 return "".join(buffers)
24656
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
295 else:
24664
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
296 # Read until size bytes or EOF seen, whichever comes first
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
297 buf_len = len(data)
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
298 if buf_len >= size:
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
299 self._rbuf = data[size:]
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
300 return data[:size]
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
301 buffers = []
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
302 if data:
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
303 buffers.append(data)
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
304 self._rbuf = ""
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
305 while True:
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
306 left = size - buf_len
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
307 recv_size = max(self._rbufsize, left)
24656
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
308 data = self._sock.recv(recv_size)
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
309 if not data:
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
310 break
24664
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
311 buffers.append(data)
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
312 n = len(data)
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
313 if n >= left:
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
314 self._rbuf = data[left:]
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
315 buffers[-1] = data[:left]
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
316 break
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
317 buf_len += n
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
318 return "".join(buffers)
14007
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
319
23715
c2733e8f6612 SF patch 555085 (timeout socket implementation) by Michael Gilfix.
Guido van Rossum <guido@python.org>
parents: 21971
diff changeset
320 def readline(self, size=-1):
24664
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
321 data = self._rbuf
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
322 if size < 0:
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
323 # Read until \n or EOF, whichever comes first
24665
d25cf94d20b1 OK, one more hack: speed up the case of readline() in unbuffered mode.
Guido van Rossum <guido@python.org>
parents: 24664
diff changeset
324 if self._rbufsize <= 1:
d25cf94d20b1 OK, one more hack: speed up the case of readline() in unbuffered mode.
Guido van Rossum <guido@python.org>
parents: 24664
diff changeset
325 # Speed up unbuffered case
d25cf94d20b1 OK, one more hack: speed up the case of readline() in unbuffered mode.
Guido van Rossum <guido@python.org>
parents: 24664
diff changeset
326 assert data == ""
d25cf94d20b1 OK, one more hack: speed up the case of readline() in unbuffered mode.
Guido van Rossum <guido@python.org>
parents: 24664
diff changeset
327 buffers = []
d25cf94d20b1 OK, one more hack: speed up the case of readline() in unbuffered mode.
Guido van Rossum <guido@python.org>
parents: 24664
diff changeset
328 recv = self._sock.recv
d25cf94d20b1 OK, one more hack: speed up the case of readline() in unbuffered mode.
Guido van Rossum <guido@python.org>
parents: 24664
diff changeset
329 while data != "\n":
d25cf94d20b1 OK, one more hack: speed up the case of readline() in unbuffered mode.
Guido van Rossum <guido@python.org>
parents: 24664
diff changeset
330 data = recv(1)
d25cf94d20b1 OK, one more hack: speed up the case of readline() in unbuffered mode.
Guido van Rossum <guido@python.org>
parents: 24664
diff changeset
331 if not data:
d25cf94d20b1 OK, one more hack: speed up the case of readline() in unbuffered mode.
Guido van Rossum <guido@python.org>
parents: 24664
diff changeset
332 break
d25cf94d20b1 OK, one more hack: speed up the case of readline() in unbuffered mode.
Guido van Rossum <guido@python.org>
parents: 24664
diff changeset
333 buffers.append(data)
d25cf94d20b1 OK, one more hack: speed up the case of readline() in unbuffered mode.
Guido van Rossum <guido@python.org>
parents: 24664
diff changeset
334 return "".join(buffers)
24664
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
335 nl = data.find('\n')
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
336 if nl >= 0:
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
337 nl += 1
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
338 self._rbuf = data[nl:]
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
339 return data[:nl]
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
340 buffers = []
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
341 if data:
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
342 buffers.append(data)
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
343 self._rbuf = ""
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
344 while True:
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
345 data = self._sock.recv(self._rbufsize)
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
346 if not data:
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
347 break
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
348 buffers.append(data)
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
349 nl = data.find('\n')
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
350 if nl >= 0:
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
351 nl += 1
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
352 self._rbuf = data[nl:]
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
353 buffers[-1] = data[:nl]
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
354 break
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
355 return "".join(buffers)
23715
c2733e8f6612 SF patch 555085 (timeout socket implementation) by Michael Gilfix.
Guido van Rossum <guido@python.org>
parents: 21971
diff changeset
356 else:
24664
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
357 # Read until size bytes or \n or EOF seen, whichever comes first
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
358 nl = data.find('\n', 0, size)
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
359 if nl >= 0:
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
360 nl += 1
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
361 self._rbuf = data[nl:]
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
362 return data[:nl]
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
363 buf_len = len(data)
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
364 if buf_len >= size:
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
365 self._rbuf = data[size:]
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
366 return data[:size]
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
367 buffers = []
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
368 if data:
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
369 buffers.append(data)
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
370 self._rbuf = ""
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
371 while True:
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
372 data = self._sock.recv(self._rbufsize)
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
373 if not data:
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
374 break
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
375 buffers.append(data)
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
376 left = size - buf_len
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
377 nl = data.find('\n', 0, left)
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
378 if nl >= 0:
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
379 nl += 1
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
380 self._rbuf = data[nl:]
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
381 buffers[-1] = data[:nl]
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
382 break
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
383 n = len(data)
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
384 if n >= left:
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
385 self._rbuf = data[left:]
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
386 buffers[-1] = data[:left]
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
387 break
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
388 buf_len += n
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
389 return "".join(buffers)
23715
c2733e8f6612 SF patch 555085 (timeout socket implementation) by Michael Gilfix.
Guido van Rossum <guido@python.org>
parents: 21971
diff changeset
390
c2733e8f6612 SF patch 555085 (timeout socket implementation) by Michael Gilfix.
Guido van Rossum <guido@python.org>
parents: 21971
diff changeset
391 def readlines(self, sizehint=0):
14682
295126433856 Support sizehint in _fileobject.readlines, as documented.
Martin v. Löwis <martin@v.loewis.de>
parents: 14592
diff changeset
392 total = 0
14007
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
393 list = []
24664
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
394 while True:
14007
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
395 line = self.readline()
23844
bd37eb4daf3b Cleanup a little
Neal Norwitz <nnorwitz@gmail.com>
parents: 23715
diff changeset
396 if not line:
bd37eb4daf3b Cleanup a little
Neal Norwitz <nnorwitz@gmail.com>
parents: 23715
diff changeset
397 break
14007
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
398 list.append(line)
14682
295126433856 Support sizehint in _fileobject.readlines, as documented.
Martin v. Löwis <martin@v.loewis.de>
parents: 14592
diff changeset
399 total += len(line)
295126433856 Support sizehint in _fileobject.readlines, as documented.
Martin v. Löwis <martin@v.loewis.de>
parents: 14592
diff changeset
400 if sizehint and total >= sizehint:
295126433856 Support sizehint in _fileobject.readlines, as documented.
Martin v. Löwis <martin@v.loewis.de>
parents: 14592
diff changeset
401 break
14007
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
402 return list
24656
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
403
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
404 # Iterator protocols
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
405
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
406 def __iter__(self):
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
407 return self
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
408
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
409 def next(self):
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
410 line = self.readline()
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
411 if not line:
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
412 raise StopIteration
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
413 return line