Ich portiere ebay sdk zu python3 und ich bin auf das folgende Problem gestoßen.Pycurl und io.StringIO - pycurl.error: (23, 'Fehler beim Schreiben von Körper)
Ich verwende pycurl, um einige HTTP-Anfragen zu senden. Hier ist, wie ich es konfigurieren:
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)
Wenn ich rufe self._curl.perform() bekomme ich folgende Fehlermeldung:
pycurl.error: (23, 'Failed writing body (1457 != 1460)')
Soweit ich weiß, dass dies bedeutet, dass es ein Problem ist mit der Schreibfunktion, aber ich kann nicht herausfinden, was es genau ist. Könnte mit der Migration vom StringIO-Modul zu io zusammenhängen, bin mir aber nicht sicher.
UPD: Ich habe versucht, die folgenden:
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)
und es funktioniert. Ich habe versucht, den gleichen Trick mit Lambdas zu tun (anstatt diese peinliche Funktion zu definieren, aber es hat nicht funktioniert.
http://pycurl.sourceforge.net/doc/unicode.html#writing-to-stringio-bytesio –