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