Как отменить запрос скручивания от WRITEFUNCTION? - PullRequest
3 голосов
/ 25 февраля 2011

У меня есть запрос curl в python, который выводит большой объем данных в функцию записи (CURLOPT_WRITEFUNCTION). Я хочу иметь возможность отменить запрос curl от функции write, если определенное условие выполнено. Я пытался использовать ch.close (), но это ошибки, говорящие о том, что он не может закрыть запрос во время его выполнения. Любой другой способ заставить это остановиться от функции записи? Вот мой код:

    self.ch = pycurl.Curl()

    self.ch.setopt(pycurl.URL, file_url)
    self.ch.setopt(pycurl.CONNECTTIMEOUT, 60)
    self.ch.setopt(pycurl.WRITEFUNCTION, self.WriteWrapper)
    self.ch.setopt(pycurl.HEADERFUNCTION, self.ParseHeaders)
    self.ch.setopt(pycurl.FOLLOWLOCATION, True)
    self.ch.setopt(pycurl.COOKIE, cookies[file_host])
    self.ch.setopt(pycurl.HTTPHEADER, self.headers_received)

    self.ch.perform()
    self.ch.close()


def do_POST(self):
    return self.do_GET()

def WriteWrapper(self, data):
    if self.do_curl_request:
        try:
            return self.wfile.write(data)
        except:
            self.ch.close() # This doesn't work :(

1 Ответ

2 голосов
/ 25 февраля 2011

pycurl вызывает ошибку, если число, возвращаемое вашей функцией записи, не равно числу, которое, по ее мнению, она записывает, поэтому возвращение -1 или создание исключения внутри вашей функции записи вызовет появление pycurl.error.Обратите внимание, что возвращение None интерпретируется как «все записанные байты».

>>> class Writer:
...   def __init__(self):
...     self.count = 0
...   def write(self, data):
...     print "Write called", len(data)
...     return -1
...
>>> curl = pycurl.Curl()
>>> writer = Writer()
>>> curl.setopt(pycurl.WRITEFUNCTION, writer.write)
>>> curl.setopt(pycurl.URL, "file:///some_big_file.txt")
>>> curl.perform()
Write called 16383
pycurl.error: invalid return value for write callback -1 16383
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
pycurl.error: (23, 'Failed writing body (0 != 16383)')
...