2009-06-19 11 views
1

En python, j'utilise httplib car il "maintient" la connexion http (comme opposée à urllib (2)). Maintenant, je veux utiliser cookielib avec httplib mais ils semblent se détester !! (pas moyen de les relier entre eux).Comment "garder en vie" avec cookielib et httplib en python?

Quelqu'un connaît-il une solution à ce problème?

+0

utilise httplib une exigence? cookielib fonctionne très bien avec urllib2 et vous pouvez ajouter vos propres en-têtes keep-alive. –

+0

Pour que tout soit cohérent, vous pouvez changer toutes les références à capitaliser() par lower() et has_header et get_headers converti en plus bas ainsi que la mise à jour du lien –

Répondre

2

Vous devriez envisager d'utiliser la place bibliothèque Requests au plus tôt chance que vous devez factoriser votre code. Pendant ce temps;

HACK ALERTE! :)

J'irais d'une autre manière suggérée, mais j'ai fait un hack (fait pour des raisons différentes cependant), qui crée une interface entre httplib et cookielib. Ce que j'ai fait était de créer un faux HTTPRequest avec un minimum de méthodes requises, de sorte que CookieJar le reconnaîtrait et traiterait les cookies si nécessaire. J'ai utilisé cet objet de demande de faux, définissant toutes les données nécessaires pour cookielib.

Voici le code de la classe:

class HTTPRequest(object): 
""" 
Data container for HTTP request (used for cookie processing). 
""" 

    def __init__(self, host, url, headers={}, secure=False): 
     self._host = host 
     self._url = url 
     self._secure = secure 
     self._headers = {} 
     for key, value in headers.items(): 
      self.add_header(key, value) 

    def has_header(self, name): 
     return name in self._headers 

    def add_header(self, key, val): 
     self._headers[key.capitalize()] = val 

    def add_unredirected_header(self, key, val): 
     self._headers[key.capitalize()] = val 

    def is_unverifiable(self): 
     return True 

    def get_type(self): 
     return 'https' if self._secure else 'http' 

    def get_full_url(self): 
     port_str = "" 
     port = str(self._host[1]) 
     if self._secure: 
      if port != 443: 
       port_str = ":"+port 
     else: 
      if port != 80: 
       port_str = ":"+port 
     return self.get_type() + '://' + self._host[0] + port_str + self._url 

    def get_header(self, header_name, default=None): 
     return self._headers.get(header_name, default) 

    def get_host(self): 
     return self._host[0] 

    get_origin_req_host = get_host 

    def get_headers(self): 
     return self._headers 

S'il vous plaît noter, la classe prend en charge le protocole HTTPS uniquement (tout ce que je avais besoin pour le moment).

Le code, qui a utilisé cette classe a été (s'il vous plaît noter un hack pour faire une réponse compatible avec cookielib):

cookies = CookieJar() 

headers = { 
    # headers that you wish to set 
} 

# construct fake request 
fake_request = HTTPRequest(host, request_url, headers) 

# add cookies to fake request 
cookies.add_cookie_header(fake_request) 

# issue an httplib.HTTPConnection based request using cookies and headers from the fake request 
http_connection.request(type, request_url, body, fake_request.get_headers()) 

response = http_connection.getresponse() 

if response.status == httplib.OK: 
    # HACK: pretend we're urllib2 response 
    response.info = lambda : response.msg 

    # read and store cookies from response 
    cookies.extract_cookies(response, fake_request) 

    # process response... 
+0

Ce hack vient de me sauver quelques heures de réimplémenter plus ou moins la même chose moi-même. Je vous remercie. – zwol

+0

Bienvenue, Zack! C'est la principale raison du partage. :) –

Questions connexes