2013-10-26 22 views
7

Sto eseguendo il porting di sdk su python3 e mi sono imbattuto nel seguente problema.Pycurl e io.StringIO - pycurl.error: (23, 'Impossibile scrivere il corpo)

Sto usando pycurl per inviare alcune richieste HTTP. Ecco come configuro che:

self._curl = pycurl.Curl() 
    self._curl.setopt(pycurl.FOLLOWLOCATION, 1) 
    self._curl.setopt(pycurl.URL, str(request_url)) 
    self._curl.setopt(pycurl.SSL_VERIFYPEER, 0) 

    self._response_header = io.StringIO() 
    self._response_body = io.StringIO() 

    self._curl.setopt(pycurl.CONNECTTIMEOUT, self.timeout) 
    self._curl.setopt(pycurl.TIMEOUT, self.timeout) 

    self._curl.setopt(pycurl.HEADERFUNCTION, self._response_header.write) 
    self._curl.setopt(pycurl.WRITEFUNCTION, self._response_body.write) 

Quando chiamo self._curl.perform() ottengo il seguente errore:

pycurl.error: (23, 'Failed writing body (1457 != 1460)') 

Per quanto ne so questo significa che c'è un problema con la funzione di scrittura, ma non riesco a capire cosa sia esattamente. Potrebbe essere correlato alla migrazione dal modulo StringIO a io, ma non ne sono sicuro.

UPD: Ho provato la seguente:

def body(buf): 
     self._response_body.write(buf) 

    def header(buf): 
     self._response_header.write(buf) 

    self._curl.setopt(pycurl.HEADERFUNCTION, header) 
    self._curl.setopt(pycurl.WRITEFUNCTION, body) 

e funziona. Ho provato a fare lo stesso trucco con lambdas (invece di definire quelle funzioni imbarazzanti, ma non ha funzionato

risposta

13

Credo che il problema è che pycurl non funziona più con StringIO come si desidera. . io.BytesIO invece si può quindi ottenere informazioni scritte nel buffer e decodificarlo in una stringa

Utilizzando BytesIO con pycurl invece di StringIO:.

e = io.BytesIO() 
c.setopt(pycurl.WRITEFUNCTION, e.write) 

decodifica le informazioni di byte dall'oggetto BytesIO:

htmlString = e.getvalue().decode('UTF-8') 

È possibile utilizzare qualsiasi tipo di decodifica desiderata, ma questo dovrebbe fornire un oggetto stringa che è possibile analizzare.

Spero che questo aiuti le persone che utilizzano Python 3.

+0

http://pycurl.sourceforge.net/doc/unicode.html#writing-to-stringio-bytesio –