annotate Lib/socket.py @ 34161:ca2ca1aeb080 2.4

Check in missing png version of pyfav.gif.
author Johannes Gijsbers <jlg@dds.nl>
date Mon, 13 Dec 2004 13:11:42 +0000
parents 90da70986407
children 0c82a7ef9554 e83309d43a82
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
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
105 is returned.
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
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
124 #
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
125 # These classes are used by the socket() defined on Windows and BeOS
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
126 # platforms to provide a best-effort implementation of the cleanup
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
127 # semantics needed when sockets can't be dup()ed.
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
128 #
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
129 # These are not actually used on other platforms.
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
130 #
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
131
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
132 _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
133 '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
134 'getpeername', 'getsockname', 'getsockopt', 'setsockopt',
28888
d3164a304598 Regain throughput lost with the _socketobject wrapper. The
Skip Montanaro <skip@pobox.com>
parents: 28818
diff changeset
135 'sendall', 'setblocking',
23715
c2733e8f6612 SF patch 555085 (timeout socket implementation) by Michael Gilfix.
Guido van Rossum <guido@python.org>
parents: 21971
diff changeset
136 '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
137
29066
90342f395721 Patch #734231: Update RiscOS support. In particular, correct
Martin v. Löwis <martin@v.loewis.de>
parents: 28890
diff changeset
138 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
139 _socketmethods = _socketmethods + ('sleeptaskw',)
90342f395721 Patch #734231: Update RiscOS support. In particular, correct
Martin v. Löwis <martin@v.loewis.de>
parents: 28890
diff changeset
140
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
141 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
142 __slots__ = []
28888
d3164a304598 Regain throughput lost with the _socketobject wrapper. The
Skip Montanaro <skip@pobox.com>
parents: 28818
diff changeset
143 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
144 raise error(EBADF, 'Bad file descriptor')
28888
d3164a304598 Regain throughput lost with the _socketobject wrapper. The
Skip Montanaro <skip@pobox.com>
parents: 28818
diff changeset
145 send = recv = sendto = recvfrom = __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
146
24661
2f411f2d791a Another refactoring. Changed 'socket' from being a factory function
Guido van Rossum <guido@python.org>
parents: 24656
diff changeset
147 class _socketobject(object):
2f411f2d791a Another refactoring. Changed 'socket' from being a factory function
Guido van Rossum <guido@python.org>
parents: 24656
diff changeset
148
2f411f2d791a Another refactoring. Changed 'socket' from being a factory function
Guido van Rossum <guido@python.org>
parents: 24656
diff changeset
149 __doc__ = _realsocket.__doc__
14007
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
150
32160
aec9c98a47d2 Add weakref support to sockets and re pattern objects.
Raymond Hettinger <python@rcn.com>
parents: 31833
diff changeset
151 __slots__ = ["_sock", "send", "recv", "sendto", "recvfrom",
aec9c98a47d2 Add weakref support to sockets and re pattern objects.
Raymond Hettinger <python@rcn.com>
parents: 31833
diff changeset
152 "__weakref__"]
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
28888
d3164a304598 Regain throughput lost with the _socketobject wrapper. The
Skip Montanaro <skip@pobox.com>
parents: 28818
diff changeset
158 self.send = self._sock.send
d3164a304598 Regain throughput lost with the _socketobject wrapper. The
Skip Montanaro <skip@pobox.com>
parents: 28818
diff changeset
159 self.recv = self._sock.recv
d3164a304598 Regain throughput lost with the _socketobject wrapper. The
Skip Montanaro <skip@pobox.com>
parents: 28818
diff changeset
160 self.sendto = self._sock.sendto
d3164a304598 Regain throughput lost with the _socketobject wrapper. The
Skip Montanaro <skip@pobox.com>
parents: 28818
diff changeset
161 self.recvfrom = self._sock.recvfrom
14007
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
162
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
163 def close(self):
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
164 self._sock = _closedsocket()
28888
d3164a304598 Regain throughput lost with the _socketobject wrapper. The
Skip Montanaro <skip@pobox.com>
parents: 28818
diff changeset
165 self.send = self.recv = self.sendto = self.recvfrom = self._sock._dummy
24661
2f411f2d791a Another refactoring. Changed 'socket' from being a factory function
Guido van Rossum <guido@python.org>
parents: 24656
diff changeset
166 close.__doc__ = _realsocket.close.__doc__
14007
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
167
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
168 def accept(self):
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
169 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
170 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
171 accept.__doc__ = _realsocket.accept.__doc__
14007
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
172
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
173 def dup(self):
24661
2f411f2d791a Another refactoring. Changed 'socket' from being a factory function
Guido van Rossum <guido@python.org>
parents: 24656
diff changeset
174 """dup() -> socket object
2f411f2d791a Another refactoring. Changed 'socket' from being a factory function
Guido van Rossum <guido@python.org>
parents: 24656
diff changeset
175
2f411f2d791a Another refactoring. Changed 'socket' from being a factory function
Guido van Rossum <guido@python.org>
parents: 24656
diff changeset
176 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
177 return _socketobject(_sock=self._sock)
14007
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
178
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
179 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
180 """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
181
2f411f2d791a Another refactoring. Changed 'socket' from being a factory function
Guido van Rossum <guido@python.org>
parents: 24656
diff changeset
182 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
183 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
184 return _fileobject(self._sock, mode, bufsize)
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
185
24661
2f411f2d791a Another refactoring. Changed 'socket' from being a factory function
Guido van Rossum <guido@python.org>
parents: 24656
diff changeset
186 _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
187 "%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
188 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
189 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
190 del _m, _s
14007
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
191
28443
161b8bd8a226 The socket module now always uses the _socketobject wrapper class, even on
Skip Montanaro <skip@pobox.com>
parents: 24944
diff changeset
192 socket = SocketType = _socketobject
14007
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
193
24661
2f411f2d791a Another refactoring. Changed 'socket' from being a factory function
Guido van Rossum <guido@python.org>
parents: 24656
diff changeset
194 class _fileobject(object):
24656
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
195 """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
196
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
197 default_bufsize = 8192
24661
2f411f2d791a Another refactoring. Changed 'socket' from being a factory function
Guido van Rossum <guido@python.org>
parents: 24656
diff changeset
198 name = "<socket>"
2f411f2d791a Another refactoring. Changed 'socket' from being a factory function
Guido van Rossum <guido@python.org>
parents: 24656
diff changeset
199
2f411f2d791a Another refactoring. Changed 'socket' from being a factory function
Guido van Rossum <guido@python.org>
parents: 24656
diff changeset
200 __slots__ = ["mode", "bufsize", "softspace",
2f411f2d791a Another refactoring. Changed 'socket' from being a factory function
Guido van Rossum <guido@python.org>
parents: 24656
diff changeset
201 # "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
202 "_sock", "_rbufsize", "_wbufsize", "_rbuf", "_wbuf"]
14007
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
203
24634
778093533a46 "Unbuffered" mode of class _fileobject wasn't actually unbuffered,
Guido van Rossum <guido@python.org>
parents: 24454
diff changeset
204 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
205 self._sock = sock
24661
2f411f2d791a Another refactoring. Changed 'socket' from being a factory function
Guido van Rossum <guido@python.org>
parents: 24656
diff changeset
206 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
207 if bufsize < 0:
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
208 bufsize = self.default_bufsize
24662
a61893d7cef2 Oops, stupid tabs. Sorry again.
Guido van Rossum <guido@python.org>
parents: 24661
diff changeset
209 self.bufsize = bufsize
a61893d7cef2 Oops, stupid tabs. Sorry again.
Guido van Rossum <guido@python.org>
parents: 24661
diff changeset
210 self.softspace = False
24656
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
211 if bufsize == 0:
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
212 self._rbufsize = 1
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
213 elif bufsize == 1:
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
214 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
215 else:
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
216 self._rbufsize = bufsize
14007
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
217 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
218 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
219 self._wbuf = [] # A list of strings
14007
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
220
24661
2f411f2d791a Another refactoring. Changed 'socket' from being a factory function
Guido van Rossum <guido@python.org>
parents: 24656
diff changeset
221 def _getclosed(self):
31833
a910b822b12c SF bug 924242: socket._fileobject._getclosed() returns wrong value
Tim Peters <tim.peters@gmail.com>
parents: 29465
diff changeset
222 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
223 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
224
14007
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
225 def close(self):
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
226 try:
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
227 if self._sock:
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
228 self.flush()
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
229 finally:
23715
c2733e8f6612 SF patch 555085 (timeout socket implementation) by Michael Gilfix.
Guido van Rossum <guido@python.org>
parents: 21971
diff changeset
230 self._sock = None
14007
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
231
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
232 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
233 try:
ed70779f6402 I saw errors from _fileobject.__del__ about missing self._sock. This
Guido van Rossum <guido@python.org>
parents: 29066
diff changeset
234 self.close()
ed70779f6402 I saw errors from _fileobject.__del__ about missing self._sock. This
Guido van Rossum <guido@python.org>
parents: 29066
diff changeset
235 except:
ed70779f6402 I saw errors from _fileobject.__del__ about missing self._sock. This
Guido van Rossum <guido@python.org>
parents: 29066
diff changeset
236 # 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
237 pass
14007
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
238
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
239 def flush(self):
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
240 if self._wbuf:
24656
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
241 buffer = "".join(self._wbuf)
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
242 self._wbuf = []
23715
c2733e8f6612 SF patch 555085 (timeout socket implementation) by Michael Gilfix.
Guido van Rossum <guido@python.org>
parents: 21971
diff changeset
243 self._sock.sendall(buffer)
14007
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
244
23844
bd37eb4daf3b Cleanup a little
Neal Norwitz <nnorwitz@gmail.com>
parents: 23715
diff changeset
245 def fileno(self):
14007
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
246 return self._sock.fileno()
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
247
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
248 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
249 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
250 if not data:
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
251 return
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
252 self._wbuf.append(data)
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
253 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
254 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
255 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
256 self.flush()
14007
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
257
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
258 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
259 # 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
260 # 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
261 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
262 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
263 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
264 self.flush()
14007
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
265
24656
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
266 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
267 buf_len = 0
24656
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
268 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
269 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
270 return buf_len
c2733e8f6612 SF patch 555085 (timeout socket implementation) by Michael Gilfix.
Guido van Rossum <guido@python.org>
parents: 21971
diff changeset
271
c2733e8f6612 SF patch 555085 (timeout socket implementation) by Michael Gilfix.
Guido van Rossum <guido@python.org>
parents: 21971
diff changeset
272 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
273 data = self._rbuf
24656
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
274 if size < 0:
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
275 # 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
276 buffers = []
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
277 if data:
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
278 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
279 self._rbuf = ""
24656
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
280 if self._rbufsize <= 1:
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
281 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
282 else:
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
283 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
284 while True:
24656
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
285 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
286 if not data:
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
287 break
24664
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
288 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
289 return "".join(buffers)
24656
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
290 else:
24664
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
291 # 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
292 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
293 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
294 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
295 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
296 buffers = []
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
297 if data:
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
298 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
299 self._rbuf = ""
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
300 while True:
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
301 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
302 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
303 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
304 if not data:
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
305 break
24664
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
306 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
307 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
308 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
309 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
310 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
311 break
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
312 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
313 return "".join(buffers)
14007
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
314
23715
c2733e8f6612 SF patch 555085 (timeout socket implementation) by Michael Gilfix.
Guido van Rossum <guido@python.org>
parents: 21971
diff changeset
315 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
316 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
317 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
318 # 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
319 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
320 # 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
321 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
322 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
323 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
324 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
325 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
326 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
327 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
328 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
329 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
330 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
331 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
332 nl += 1
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
333 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
334 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
335 buffers = []
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
336 if data:
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
337 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
338 self._rbuf = ""
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
339 while True:
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
340 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
341 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
342 break
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
343 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
344 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
345 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
346 nl += 1
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
347 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
348 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
349 break
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
350 return "".join(buffers)
23715
c2733e8f6612 SF patch 555085 (timeout socket implementation) by Michael Gilfix.
Guido van Rossum <guido@python.org>
parents: 21971
diff changeset
351 else:
24664
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
352 # 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
353 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
354 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
355 nl += 1
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
356 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
357 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
358 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
359 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
360 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
361 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
362 buffers = []
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
363 if data:
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
364 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
365 self._rbuf = ""
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
366 while True:
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
367 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
368 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
369 break
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
370 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
371 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
372 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
373 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
374 nl += 1
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
375 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
376 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
377 break
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
378 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
379 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
380 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
381 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
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 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
384 return "".join(buffers)
23715
c2733e8f6612 SF patch 555085 (timeout socket implementation) by Michael Gilfix.
Guido van Rossum <guido@python.org>
parents: 21971
diff changeset
385
c2733e8f6612 SF patch 555085 (timeout socket implementation) by Michael Gilfix.
Guido van Rossum <guido@python.org>
parents: 21971
diff changeset
386 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
387 total = 0
14007
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
388 list = []
24664
6a6d02be321c Another refactoring of read() and readline(), this time based on the
Guido van Rossum <guido@python.org>
parents: 24663
diff changeset
389 while True:
14007
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
390 line = self.readline()
23844
bd37eb4daf3b Cleanup a little
Neal Norwitz <nnorwitz@gmail.com>
parents: 23715
diff changeset
391 if not line:
bd37eb4daf3b Cleanup a little
Neal Norwitz <nnorwitz@gmail.com>
parents: 23715
diff changeset
392 break
14007
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
393 list.append(line)
14682
295126433856 Support sizehint in _fileobject.readlines, as documented.
Martin v. Löwis <martin@v.loewis.de>
parents: 14592
diff changeset
394 total += len(line)
295126433856 Support sizehint in _fileobject.readlines, as documented.
Martin v. Löwis <martin@v.loewis.de>
parents: 14592
diff changeset
395 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
396 break
14007
eda09f824a9f Revise the wrapper structure for the socket module:
Fred Drake <fdrake@acm.org>
parents:
diff changeset
397 return list
24656
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
398
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
399 # Iterator protocols
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
400
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
401 def __iter__(self):
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
402 return self
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 def next(self):
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
405 line = self.readline()
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
406 if not line:
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
407 raise StopIteration
e61b118e9cab Major restructuring of _fileobject. Hopefully several things now work
Guido van Rossum <guido@python.org>
parents: 24649
diff changeset
408 return line