mirror of
				https://github.com/python/cpython.git
				synced 2025-10-30 21:21:22 +00:00 
			
		
		
		
	RFE #567972: Socket objects' family, type and proto properties are
now exposed via new get...() methods.
This commit is contained in:
		
							parent
							
								
									5c170fd4a9
								
							
						
					
					
						commit
						bc45a3f821
					
				
					 5 changed files with 55 additions and 2 deletions
				
			
		|  | @ -626,7 +626,7 @@ timeouts on socket operations. | ||||||
| \end{methoddesc} | \end{methoddesc} | ||||||
| 
 | 
 | ||||||
| \begin{methoddesc}[socket]{gettimeout}{} | \begin{methoddesc}[socket]{gettimeout}{} | ||||||
| Returns the timeout in floating seconds associated with socket | Return the timeout in floating seconds associated with socket | ||||||
| operations, or \code{None} if no timeout is set.  This reflects | operations, or \code{None} if no timeout is set.  This reflects | ||||||
| the last call to \method{setblocking()} or \method{settimeout()}. | the last call to \method{setblocking()} or \method{settimeout()}. | ||||||
| \versionadded{2.3} | \versionadded{2.3} | ||||||
|  | @ -654,6 +654,21 @@ Note that the \method{connect()} operation is subject to the timeout | ||||||
| setting, and in general it is recommended to call | setting, and in general it is recommended to call | ||||||
| \method{settimeout()} before calling \method{connect()}. | \method{settimeout()} before calling \method{connect()}. | ||||||
| 
 | 
 | ||||||
|  | \begin{methoddesc}[socket]{getfamily}{} | ||||||
|  | Return the socket family, as given to the \class{socket} constructor. | ||||||
|  | \versionadded{2.5} | ||||||
|  | \end{methoddesc} | ||||||
|  | 
 | ||||||
|  | \begin{methoddesc}[socket]{gettype}{} | ||||||
|  | Return the socket type, as given to the \class{socket} constructor. | ||||||
|  | \versionadded{2.5} | ||||||
|  | \end{methoddesc} | ||||||
|  | 
 | ||||||
|  | \begin{methoddesc}[socket]{getproto}{} | ||||||
|  | Return the socket protocol, as given to the \class{socket} constructor. | ||||||
|  | \versionadded{2.5} | ||||||
|  | \end{methoddesc} | ||||||
|  | 
 | ||||||
| \begin{methoddesc}[socket]{setsockopt}{level, optname, value} | \begin{methoddesc}[socket]{setsockopt}{level, optname, value} | ||||||
| Set the value of the given socket option (see the \UNIX{} manual page | Set the value of the given socket option (see the \UNIX{} manual page | ||||||
| \manpage{setsockopt}{2}).  The needed symbolic constants are defined in | \manpage{setsockopt}{2}).  The needed symbolic constants are defined in | ||||||
|  |  | ||||||
|  | @ -183,6 +183,24 @@ def makefile(self, mode='r', bufsize=-1): | ||||||
|         and bufsize arguments are as for the built-in open() function.""" |         and bufsize arguments are as for the built-in open() function.""" | ||||||
|         return _fileobject(self._sock, mode, bufsize) |         return _fileobject(self._sock, mode, bufsize) | ||||||
| 
 | 
 | ||||||
|  |     def getfamily(self): | ||||||
|  |         """getfamily() -> socket family | ||||||
|  | 
 | ||||||
|  |         Return the socket family.""" | ||||||
|  |         return self._sock.family | ||||||
|  | 
 | ||||||
|  |     def gettype(self): | ||||||
|  |         """gettype() -> socket type | ||||||
|  | 
 | ||||||
|  |         Return the socket type.""" | ||||||
|  |         return self._sock.type | ||||||
|  | 
 | ||||||
|  |     def getproto(self): | ||||||
|  |         """getproto() -> socket protocol | ||||||
|  | 
 | ||||||
|  |         Return the socket protocol.""" | ||||||
|  |         return self._sock.proto | ||||||
|  | 
 | ||||||
|     _s = ("def %s(self, *args): return self._sock.%s(*args)\n\n" |     _s = ("def %s(self, *args): return self._sock.%s(*args)\n\n" | ||||||
|           "%s.__doc__ = _realsocket.%s.__doc__\n") |           "%s.__doc__ = _realsocket.%s.__doc__\n") | ||||||
|     for _m in _socketmethods: |     for _m in _socketmethods: | ||||||
|  |  | ||||||
|  | @ -469,6 +469,14 @@ def testSendAfterClose(self): | ||||||
|         sock.close() |         sock.close() | ||||||
|         self.assertRaises(socket.error, sock.send, "spam") |         self.assertRaises(socket.error, sock.send, "spam") | ||||||
| 
 | 
 | ||||||
|  |     def testNewGetMethods(self): | ||||||
|  |         # testing getfamily(), gettype() and getprotocol() | ||||||
|  |         sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | ||||||
|  |         self.assertEqual(sock.getfamily(), socket.AF_INET) | ||||||
|  |         self.assertEqual(sock.gettype(), socket.SOCK_STREAM) | ||||||
|  |         self.assertEqual(sock.getproto(), 0) | ||||||
|  |         sock.close() | ||||||
|  | 
 | ||||||
| class BasicTCPTest(SocketConnectedTest): | class BasicTCPTest(SocketConnectedTest): | ||||||
| 
 | 
 | ||||||
|     def __init__(self, methodName='runTest'): |     def __init__(self, methodName='runTest'): | ||||||
|  |  | ||||||
|  | @ -291,6 +291,9 @@ Core and builtins | ||||||
| Extension Modules | Extension Modules | ||||||
| ----------------- | ----------------- | ||||||
| 
 | 
 | ||||||
|  | - RFE #567972: Socket objects' family, type and proto properties are | ||||||
|  |   now exposed via new get...() methods. | ||||||
|  | 
 | ||||||
| - Everything under lib-old was removed.  This includes the following modules: | - Everything under lib-old was removed.  This includes the following modules: | ||||||
|     Para, addpack, cmp, cmpcache, codehack, dircmp, dump, find, fmt, grep, |     Para, addpack, cmp, cmpcache, codehack, dircmp, dump, find, fmt, grep, | ||||||
|     lockfile, newdir, ni, packmail, poly, rand, statcache, tb, tzparse,  |     lockfile, newdir, ni, packmail, poly, rand, statcache, tb, tzparse,  | ||||||
|  |  | ||||||
|  | @ -62,6 +62,7 @@ Local naming conventions: | ||||||
| */ | */ | ||||||
| 
 | 
 | ||||||
| #include "Python.h" | #include "Python.h" | ||||||
|  | #include "structmember.h" | ||||||
| 
 | 
 | ||||||
| #undef MAX | #undef MAX | ||||||
| #define MAX(x, y) ((x) < (y) ? (y) : (x)) | #define MAX(x, y) ((x) < (y) ? (y) : (x)) | ||||||
|  | @ -2502,6 +2503,14 @@ static PyMethodDef sock_methods[] = { | ||||||
| 	{NULL,			NULL}		/* sentinel */ | 	{NULL,			NULL}		/* sentinel */ | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | /* SockObject members */ | ||||||
|  | static PyMemberDef sock_memberlist[] = { | ||||||
|  |        {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"}, | ||||||
|  |        {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"}, | ||||||
|  |        {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"}, | ||||||
|  |        {"timeout", T_DOUBLE, offsetof(PySocketSockObject, sock_timeout), READONLY, "the socket timeout"}, | ||||||
|  |        {0}, | ||||||
|  | }; | ||||||
| 
 | 
 | ||||||
| /* Deallocate a socket object in response to the last Py_DECREF().
 | /* Deallocate a socket object in response to the last Py_DECREF().
 | ||||||
|    First close the file description. */ |    First close the file description. */ | ||||||
|  | @ -2625,7 +2634,7 @@ static PyTypeObject sock_type = { | ||||||
| 	0,					/* tp_iter */ | 	0,					/* tp_iter */ | ||||||
| 	0,					/* tp_iternext */ | 	0,					/* tp_iternext */ | ||||||
| 	sock_methods,				/* tp_methods */ | 	sock_methods,				/* tp_methods */ | ||||||
| 	0,					/* tp_members */ | 	sock_memberlist,			/* tp_members */ | ||||||
| 	0,					/* tp_getset */ | 	0,					/* tp_getset */ | ||||||
| 	0,					/* tp_base */ | 	0,					/* tp_base */ | ||||||
| 	0,					/* tp_dict */ | 	0,					/* tp_dict */ | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Georg Brandl
						Georg Brandl