Une implémentation alternative qui serait compatible avec Python 2.7 serait le suivant (avec un commentaire contenant ce que vous voulez si vous utilisez Python 2.6):
import socket
import xmlrpclib
class TimeoutTransport (xmlrpclib.Transport):
"""
Custom XML-RPC transport class for HTTP connections, allowing a timeout in
the base connection.
"""
def __init__(self, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, use_datetime=0):
xmlrpclib.Transport.__init__(self, use_datetime)
self._timeout = timeout
def make_connection(self, host):
# If using python 2.6, since that implementation normally returns the
# HTTP compatibility class, which doesn't have a timeout feature.
#import httplib
#host, extra_headers, x509 = self.get_host_info(host)
#return httplib.HTTPConnection(host, timeout=self._timeout)
conn = xmlrpclib.Transport.make_connection(self, host)
conn.timeout = self._timeout
return conn
# Example use
t = TimeoutTransport(timeout=10)
server = xmlrpclib.ServerProxy('http://time.xmlrpc.com/RPC2', transport=t)
Utilisation du super-méthode permettrait l'implémentation sous-jacente 2.7 pour maintenir sa fonctionnalité HTTP/1.1 keep-alive qu'elle définit.
Une chose à noter est que si vous essayez d'utiliser XML-RPC via une connexion https/adresse, remplacer xmlrpc.SafeTransport
références avec xmlrpc.Transport
à la place, et, si vous utilisez la mise en œuvre 2.6, utilisez httplib.HTTPSConnection
.
cet exemple ne fonctionne pas sur python 2.5, 2.6 (l'instance de TimeoutTransport n'a pas d'attribut 'proxy') aussi httplib.HTTP n'a pas de valeur de timeout. – Ib33X
J'ai remarqué que la méthode 'Transport.make_connection' d'origine dans Python 2.7 a plus de logique pour gérer keep-alive, en-têtes supplémentaires, etc., et qu'elle utilise aussi' httplib.HTTPConnection' et non 'httplib.HTTP'. Je ne sais pas est-ce important dans les cas d'utilisation typiques, mais j'ai décidé de copier le code original et de le changer pour utiliser les délais d'expiration comme indiqué dans la réponse ci-dessus. –