Mercurial > repos > guerler > springsuite
comparison planemo/lib/python3.7/site-packages/future/backports/socket.py @ 0:d30785e31577 draft
"planemo upload commit 6eee67778febed82ddd413c3ca40b3183a3898f1"
author | guerler |
---|---|
date | Fri, 31 Jul 2020 00:18:57 -0400 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:d30785e31577 |
---|---|
1 # Wrapper module for _socket, providing some additional facilities | |
2 # implemented in Python. | |
3 | |
4 """\ | |
5 This module provides socket operations and some related functions. | |
6 On Unix, it supports IP (Internet Protocol) and Unix domain sockets. | |
7 On other systems, it only supports IP. Functions specific for a | |
8 socket are available as methods of the socket object. | |
9 | |
10 Functions: | |
11 | |
12 socket() -- create a new socket object | |
13 socketpair() -- create a pair of new socket objects [*] | |
14 fromfd() -- create a socket object from an open file descriptor [*] | |
15 fromshare() -- create a socket object from data received from socket.share() [*] | |
16 gethostname() -- return the current hostname | |
17 gethostbyname() -- map a hostname to its IP number | |
18 gethostbyaddr() -- map an IP number or hostname to DNS info | |
19 getservbyname() -- map a service name and a protocol name to a port number | |
20 getprotobyname() -- map a protocol name (e.g. 'tcp') to a number | |
21 ntohs(), ntohl() -- convert 16, 32 bit int from network to host byte order | |
22 htons(), htonl() -- convert 16, 32 bit int from host to network byte order | |
23 inet_aton() -- convert IP addr string (123.45.67.89) to 32-bit packed format | |
24 inet_ntoa() -- convert 32-bit packed format IP to string (123.45.67.89) | |
25 socket.getdefaulttimeout() -- get the default timeout value | |
26 socket.setdefaulttimeout() -- set the default timeout value | |
27 create_connection() -- connects to an address, with an optional timeout and | |
28 optional source address. | |
29 | |
30 [*] not available on all platforms! | |
31 | |
32 Special objects: | |
33 | |
34 SocketType -- type object for socket objects | |
35 error -- exception raised for I/O errors | |
36 has_ipv6 -- boolean value indicating if IPv6 is supported | |
37 | |
38 Integer constants: | |
39 | |
40 AF_INET, AF_UNIX -- socket domains (first argument to socket() call) | |
41 SOCK_STREAM, SOCK_DGRAM, SOCK_RAW -- socket types (second argument) | |
42 | |
43 Many other constants may be defined; these may be used in calls to | |
44 the setsockopt() and getsockopt() methods. | |
45 """ | |
46 | |
47 from __future__ import unicode_literals | |
48 from __future__ import print_function | |
49 from __future__ import division | |
50 from __future__ import absolute_import | |
51 from future.builtins import super | |
52 | |
53 import _socket | |
54 from _socket import * | |
55 | |
56 import os, sys, io | |
57 | |
58 try: | |
59 import errno | |
60 except ImportError: | |
61 errno = None | |
62 EBADF = getattr(errno, 'EBADF', 9) | |
63 EAGAIN = getattr(errno, 'EAGAIN', 11) | |
64 EWOULDBLOCK = getattr(errno, 'EWOULDBLOCK', 11) | |
65 | |
66 __all__ = ["getfqdn", "create_connection"] | |
67 __all__.extend(os._get_exports_list(_socket)) | |
68 | |
69 | |
70 _realsocket = socket | |
71 | |
72 # WSA error codes | |
73 if sys.platform.lower().startswith("win"): | |
74 errorTab = {} | |
75 errorTab[10004] = "The operation was interrupted." | |
76 errorTab[10009] = "A bad file handle was passed." | |
77 errorTab[10013] = "Permission denied." | |
78 errorTab[10014] = "A fault occurred on the network??" # WSAEFAULT | |
79 errorTab[10022] = "An invalid operation was attempted." | |
80 errorTab[10035] = "The socket operation would block" | |
81 errorTab[10036] = "A blocking operation is already in progress." | |
82 errorTab[10048] = "The network address is in use." | |
83 errorTab[10054] = "The connection has been reset." | |
84 errorTab[10058] = "The network has been shut down." | |
85 errorTab[10060] = "The operation timed out." | |
86 errorTab[10061] = "Connection refused." | |
87 errorTab[10063] = "The name is too long." | |
88 errorTab[10064] = "The host is down." | |
89 errorTab[10065] = "The host is unreachable." | |
90 __all__.append("errorTab") | |
91 | |
92 | |
93 class socket(_socket.socket): | |
94 | |
95 """A subclass of _socket.socket adding the makefile() method.""" | |
96 | |
97 __slots__ = ["__weakref__", "_io_refs", "_closed"] | |
98 | |
99 def __init__(self, family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None): | |
100 if fileno is None: | |
101 _socket.socket.__init__(self, family, type, proto) | |
102 else: | |
103 _socket.socket.__init__(self, family, type, proto, fileno) | |
104 self._io_refs = 0 | |
105 self._closed = False | |
106 | |
107 def __enter__(self): | |
108 return self | |
109 | |
110 def __exit__(self, *args): | |
111 if not self._closed: | |
112 self.close() | |
113 | |
114 def __repr__(self): | |
115 """Wrap __repr__() to reveal the real class name.""" | |
116 s = _socket.socket.__repr__(self) | |
117 if s.startswith("<socket object"): | |
118 s = "<%s.%s%s%s" % (self.__class__.__module__, | |
119 self.__class__.__name__, | |
120 getattr(self, '_closed', False) and " [closed] " or "", | |
121 s[7:]) | |
122 return s | |
123 | |
124 def __getstate__(self): | |
125 raise TypeError("Cannot serialize socket object") | |
126 | |
127 def dup(self): | |
128 """dup() -> socket object | |
129 | |
130 Return a new socket object connected to the same system resource. | |
131 """ | |
132 fd = dup(self.fileno()) | |
133 sock = self.__class__(self.family, self.type, self.proto, fileno=fd) | |
134 sock.settimeout(self.gettimeout()) | |
135 return sock | |
136 | |
137 def accept(self): | |
138 """accept() -> (socket object, address info) | |
139 | |
140 Wait for an incoming connection. Return a new socket | |
141 representing the connection, and the address of the client. | |
142 For IP sockets, the address info is a pair (hostaddr, port). | |
143 """ | |
144 fd, addr = self._accept() | |
145 sock = socket(self.family, self.type, self.proto, fileno=fd) | |
146 # Issue #7995: if no default timeout is set and the listening | |
147 # socket had a (non-zero) timeout, force the new socket in blocking | |
148 # mode to override platform-specific socket flags inheritance. | |
149 if getdefaulttimeout() is None and self.gettimeout(): | |
150 sock.setblocking(True) | |
151 return sock, addr | |
152 | |
153 def makefile(self, mode="r", buffering=None, **_3to2kwargs): | |
154 """makefile(...) -> an I/O stream connected to the socket | |
155 | |
156 The arguments are as for io.open() after the filename, | |
157 except the only mode characters supported are 'r', 'w' and 'b'. | |
158 The semantics are similar too. (XXX refactor to share code?) | |
159 """ | |
160 if 'newline' in _3to2kwargs: newline = _3to2kwargs['newline']; del _3to2kwargs['newline'] | |
161 else: newline = None | |
162 if 'errors' in _3to2kwargs: errors = _3to2kwargs['errors']; del _3to2kwargs['errors'] | |
163 else: errors = None | |
164 if 'encoding' in _3to2kwargs: encoding = _3to2kwargs['encoding']; del _3to2kwargs['encoding'] | |
165 else: encoding = None | |
166 for c in mode: | |
167 if c not in ("r", "w", "b"): | |
168 raise ValueError("invalid mode %r (only r, w, b allowed)") | |
169 writing = "w" in mode | |
170 reading = "r" in mode or not writing | |
171 assert reading or writing | |
172 binary = "b" in mode | |
173 rawmode = "" | |
174 if reading: | |
175 rawmode += "r" | |
176 if writing: | |
177 rawmode += "w" | |
178 raw = SocketIO(self, rawmode) | |
179 self._io_refs += 1 | |
180 if buffering is None: | |
181 buffering = -1 | |
182 if buffering < 0: | |
183 buffering = io.DEFAULT_BUFFER_SIZE | |
184 if buffering == 0: | |
185 if not binary: | |
186 raise ValueError("unbuffered streams must be binary") | |
187 return raw | |
188 if reading and writing: | |
189 buffer = io.BufferedRWPair(raw, raw, buffering) | |
190 elif reading: | |
191 buffer = io.BufferedReader(raw, buffering) | |
192 else: | |
193 assert writing | |
194 buffer = io.BufferedWriter(raw, buffering) | |
195 if binary: | |
196 return buffer | |
197 text = io.TextIOWrapper(buffer, encoding, errors, newline) | |
198 text.mode = mode | |
199 return text | |
200 | |
201 def _decref_socketios(self): | |
202 if self._io_refs > 0: | |
203 self._io_refs -= 1 | |
204 if self._closed: | |
205 self.close() | |
206 | |
207 def _real_close(self, _ss=_socket.socket): | |
208 # This function should not reference any globals. See issue #808164. | |
209 _ss.close(self) | |
210 | |
211 def close(self): | |
212 # This function should not reference any globals. See issue #808164. | |
213 self._closed = True | |
214 if self._io_refs <= 0: | |
215 self._real_close() | |
216 | |
217 def detach(self): | |
218 """detach() -> file descriptor | |
219 | |
220 Close the socket object without closing the underlying file descriptor. | |
221 The object cannot be used after this call, but the file descriptor | |
222 can be reused for other purposes. The file descriptor is returned. | |
223 """ | |
224 self._closed = True | |
225 return super().detach() | |
226 | |
227 def fromfd(fd, family, type, proto=0): | |
228 """ fromfd(fd, family, type[, proto]) -> socket object | |
229 | |
230 Create a socket object from a duplicate of the given file | |
231 descriptor. The remaining arguments are the same as for socket(). | |
232 """ | |
233 nfd = dup(fd) | |
234 return socket(family, type, proto, nfd) | |
235 | |
236 if hasattr(_socket.socket, "share"): | |
237 def fromshare(info): | |
238 """ fromshare(info) -> socket object | |
239 | |
240 Create a socket object from a the bytes object returned by | |
241 socket.share(pid). | |
242 """ | |
243 return socket(0, 0, 0, info) | |
244 | |
245 if hasattr(_socket, "socketpair"): | |
246 | |
247 def socketpair(family=None, type=SOCK_STREAM, proto=0): | |
248 """socketpair([family[, type[, proto]]]) -> (socket object, socket object) | |
249 | |
250 Create a pair of socket objects from the sockets returned by the platform | |
251 socketpair() function. | |
252 The arguments are the same as for socket() except the default family is | |
253 AF_UNIX if defined on the platform; otherwise, the default is AF_INET. | |
254 """ | |
255 if family is None: | |
256 try: | |
257 family = AF_UNIX | |
258 except NameError: | |
259 family = AF_INET | |
260 a, b = _socket.socketpair(family, type, proto) | |
261 a = socket(family, type, proto, a.detach()) | |
262 b = socket(family, type, proto, b.detach()) | |
263 return a, b | |
264 | |
265 | |
266 _blocking_errnos = set([EAGAIN, EWOULDBLOCK]) | |
267 | |
268 class SocketIO(io.RawIOBase): | |
269 | |
270 """Raw I/O implementation for stream sockets. | |
271 | |
272 This class supports the makefile() method on sockets. It provides | |
273 the raw I/O interface on top of a socket object. | |
274 """ | |
275 | |
276 # One might wonder why not let FileIO do the job instead. There are two | |
277 # main reasons why FileIO is not adapted: | |
278 # - it wouldn't work under Windows (where you can't used read() and | |
279 # write() on a socket handle) | |
280 # - it wouldn't work with socket timeouts (FileIO would ignore the | |
281 # timeout and consider the socket non-blocking) | |
282 | |
283 # XXX More docs | |
284 | |
285 def __init__(self, sock, mode): | |
286 if mode not in ("r", "w", "rw", "rb", "wb", "rwb"): | |
287 raise ValueError("invalid mode: %r" % mode) | |
288 io.RawIOBase.__init__(self) | |
289 self._sock = sock | |
290 if "b" not in mode: | |
291 mode += "b" | |
292 self._mode = mode | |
293 self._reading = "r" in mode | |
294 self._writing = "w" in mode | |
295 self._timeout_occurred = False | |
296 | |
297 def readinto(self, b): | |
298 """Read up to len(b) bytes into the writable buffer *b* and return | |
299 the number of bytes read. If the socket is non-blocking and no bytes | |
300 are available, None is returned. | |
301 | |
302 If *b* is non-empty, a 0 return value indicates that the connection | |
303 was shutdown at the other end. | |
304 """ | |
305 self._checkClosed() | |
306 self._checkReadable() | |
307 if self._timeout_occurred: | |
308 raise IOError("cannot read from timed out object") | |
309 while True: | |
310 try: | |
311 return self._sock.recv_into(b) | |
312 except timeout: | |
313 self._timeout_occurred = True | |
314 raise | |
315 # except InterruptedError: | |
316 # continue | |
317 except error as e: | |
318 if e.args[0] in _blocking_errnos: | |
319 return None | |
320 raise | |
321 | |
322 def write(self, b): | |
323 """Write the given bytes or bytearray object *b* to the socket | |
324 and return the number of bytes written. This can be less than | |
325 len(b) if not all data could be written. If the socket is | |
326 non-blocking and no bytes could be written None is returned. | |
327 """ | |
328 self._checkClosed() | |
329 self._checkWritable() | |
330 try: | |
331 return self._sock.send(b) | |
332 except error as e: | |
333 # XXX what about EINTR? | |
334 if e.args[0] in _blocking_errnos: | |
335 return None | |
336 raise | |
337 | |
338 def readable(self): | |
339 """True if the SocketIO is open for reading. | |
340 """ | |
341 if self.closed: | |
342 raise ValueError("I/O operation on closed socket.") | |
343 return self._reading | |
344 | |
345 def writable(self): | |
346 """True if the SocketIO is open for writing. | |
347 """ | |
348 if self.closed: | |
349 raise ValueError("I/O operation on closed socket.") | |
350 return self._writing | |
351 | |
352 def seekable(self): | |
353 """True if the SocketIO is open for seeking. | |
354 """ | |
355 if self.closed: | |
356 raise ValueError("I/O operation on closed socket.") | |
357 return super().seekable() | |
358 | |
359 def fileno(self): | |
360 """Return the file descriptor of the underlying socket. | |
361 """ | |
362 self._checkClosed() | |
363 return self._sock.fileno() | |
364 | |
365 @property | |
366 def name(self): | |
367 if not self.closed: | |
368 return self.fileno() | |
369 else: | |
370 return -1 | |
371 | |
372 @property | |
373 def mode(self): | |
374 return self._mode | |
375 | |
376 def close(self): | |
377 """Close the SocketIO object. This doesn't close the underlying | |
378 socket, except if all references to it have disappeared. | |
379 """ | |
380 if self.closed: | |
381 return | |
382 io.RawIOBase.close(self) | |
383 self._sock._decref_socketios() | |
384 self._sock = None | |
385 | |
386 | |
387 def getfqdn(name=''): | |
388 """Get fully qualified domain name from name. | |
389 | |
390 An empty argument is interpreted as meaning the local host. | |
391 | |
392 First the hostname returned by gethostbyaddr() is checked, then | |
393 possibly existing aliases. In case no FQDN is available, hostname | |
394 from gethostname() is returned. | |
395 """ | |
396 name = name.strip() | |
397 if not name or name == '0.0.0.0': | |
398 name = gethostname() | |
399 try: | |
400 hostname, aliases, ipaddrs = gethostbyaddr(name) | |
401 except error: | |
402 pass | |
403 else: | |
404 aliases.insert(0, hostname) | |
405 for name in aliases: | |
406 if '.' in name: | |
407 break | |
408 else: | |
409 name = hostname | |
410 return name | |
411 | |
412 | |
413 # Re-use the same sentinel as in the Python stdlib socket module: | |
414 from socket import _GLOBAL_DEFAULT_TIMEOUT | |
415 # Was: _GLOBAL_DEFAULT_TIMEOUT = object() | |
416 | |
417 | |
418 def create_connection(address, timeout=_GLOBAL_DEFAULT_TIMEOUT, | |
419 source_address=None): | |
420 """Connect to *address* and return the socket object. | |
421 | |
422 Convenience function. Connect to *address* (a 2-tuple ``(host, | |
423 port)``) and return the socket object. Passing the optional | |
424 *timeout* parameter will set the timeout on the socket instance | |
425 before attempting to connect. If no *timeout* is supplied, the | |
426 global default timeout setting returned by :func:`getdefaulttimeout` | |
427 is used. If *source_address* is set it must be a tuple of (host, port) | |
428 for the socket to bind as a source address before making the connection. | |
429 An host of '' or port 0 tells the OS to use the default. | |
430 """ | |
431 | |
432 host, port = address | |
433 err = None | |
434 for res in getaddrinfo(host, port, 0, SOCK_STREAM): | |
435 af, socktype, proto, canonname, sa = res | |
436 sock = None | |
437 try: | |
438 sock = socket(af, socktype, proto) | |
439 if timeout is not _GLOBAL_DEFAULT_TIMEOUT: | |
440 sock.settimeout(timeout) | |
441 if source_address: | |
442 sock.bind(source_address) | |
443 sock.connect(sa) | |
444 return sock | |
445 | |
446 except error as _: | |
447 err = _ | |
448 if sock is not None: | |
449 sock.close() | |
450 | |
451 if err is not None: | |
452 raise err | |
453 else: | |
454 raise error("getaddrinfo returns an empty list") |