Pycurl y io.StringIO – pycurl.error: (23, ‘Fallido cuerpo de escritura)

Estoy portando ebay sdk a python3 y me he topado con el siguiente problema.

Estoy usando pycurl para enviar algunas solicitudes HTTP. Así es como lo configuro:

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) 

Cuando llamo self._curl.perform () obtengo el siguiente error:

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

Por lo que sé, esto significa que hay un problema con la función de escritura, pero no puedo entender qué es exactamente. Podría estar relacionado con la migración desde el módulo StringIO a io, pero no estoy seguro.

UPD : He intentado lo siguiente:

  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) 

y funciona. He intentado hacer el mismo truco con las lambdas (en lugar de definir esas funciones torpes, pero no funcionó).

Creo que el problema es que pycurl ya no funciona con StringIO como lo desea. Una solución es utilizar io.BytesIO en su lugar. A continuación, puede obtener información escrita en el búfer y decodificarla en una cadena.

Usando BytesIO con pycurl en lugar de StringIO:

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

Deencoding de la información de bytes del objeto BytesIO:

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

Puede usar cualquier tipo de deencoding que desee, pero esto debería proporcionarle un objeto de cadena que puede analizar.

Espero que esto ayude a las personas que usan Python 3.