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
http://pycurl.sourceforge.net/doc/unicode.html#writing-to-stringio-bytesio –