Pergunta sobre urllib2, cookies, httplib, python – Como "keep-alive" com cookielib e httplib em python?

1

Em python, estou usando httplib porque "mantém viva" a conexão http (como opor a urllib (2)). Agora, eu quero usar cookielib com httplib mas eles parecem odiar um ao outro !! (não há como interligá-los).

Alguém sabe de uma solução para esse problema?

está usando o httplib como um requisito? O cookielib funciona muito bem com o urllib2 e você pode adicionar seus próprios cabeçalhos keep-alive. Corey Goldberg
Para manter tudo consistente, você pode querer alterar todas as referências a capitalize () por lower () e has_header e get_headers key convertidas para lower well user414742

Sua resposta

2   a resposta
2

Você deve considerar usar oRequests biblioteca, na melhor das hipóteses, você tem que refatorar seu código. Enquanto isso;

HACK ALERTA! :)

Eu iria outra maneira sugerida, mas eu fiz um hack (feito por razões diferentes, embora), o que cria uma interface entrehttplib ecookielib.

O que eu fiz foi criar um falsoHTTPRequest com o mínimo necessário conjunto de métodos, de modo queCookieJar iria reconhecê-lo e processar cookies conforme necessário. Eu usei esse objeto de pedido falso, definindo todos os dados necessários para o cookielib.

Aqui está o código da classe:

<code>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
</code>

Por favor, note que a classe tem suporte apenas para o protocolo HTTPS (tudo o que eu precisava no momento).

O código que usou esta classe foi (por favor note outro hack para tornar a resposta compatível com cookielib):

<code>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...
</code>
Bem vindo Zack! Essa é a principal razão para compartilhar. :) Serge Broslavsky
Este hack apenas me salvou algumas horas de reimplementar mais ou menos a mesma coisa. Obrigado. zwol

Perguntas relacionadas