Пример кода поможет здесь. Судя по сообщению об ошибке и обращаясь к нему в исходном коде, вы установили обратный вызов записи. Это настроено, я думаю, CURLOPT_WRITEFUNCTION, и документация для этого гласит:
Возвращает количество байтов на самом деле
взят под опеку. Если эта сумма отличается
от суммы, переданной вашему
функция, она сообщит об ошибке
библиотека и она прервет передачу
и верните CURLE_WRITE_ERROR.
Код оболочки Pycurl проверяет, что значение находится между 0 и числом, переданным ему. Вот почему -1 не удалось, и почему 0, запускает CURLE_WRITE_ERROR, вызывает исключение «ошибка записи тела». Код Pycurl:
/* run callback */
arglist = Py_BuildValue("(s#)", ptr, total_size);
if (arglist == NULL)
goto verbose_error;
result = PyEval_CallObject(cb, arglist);
Py_DECREF(arglist);
if (result == NULL)
goto verbose_error;
/* handle result */
if (result == Py_None) {
ret = total_size; /* None means success */
}
else if (PyInt_Check(result)) {
long obj_size = PyInt_AsLong(result);
if (obj_size < 0 || obj_size > total_size) {
PyErr_Format(ErrorObject, "invalid return value for write callback %ld %ld", (long)obj_size, (long)total_size);
goto verbose_error;
}
ret = (size_t) obj_size; /* success */
}
else if (PyLong_Check(result)) {
... identical code for Long ...
}
else {
PyErr_SetString(ErrorObject, "write callback must return int or None");
goto verbose_error;
}
Я не вижу способа в pycurl для этой функции поддерживать другое возвращаемое значение. Могут быть и другие способы, например, настройка обратного вызова хода выполнения, который, по-видимому, разрешает прерывания.
Соответствующий код в самом curl:
/* If the previous block of data ended with CR and this block of data is
just a NL, then the length might be zero */
if(len) {
wrote = data->set.fwrite_func(ptr, 1, len, data->set.out);
}
else {
wrote = len;
}
if(CURL_WRITEFUNC_PAUSE == wrote)
return pausewrite(data, type, ptr, len);
if(wrote != len) {
failf(data, "Failed writing body (%d != %d)", (int)wrote, (int)len);
return CURLE_WRITE_ERROR;
}
так что вы можете видеть, что pycurl не поддерживает возврат CURL_WRITEFUNC_PAUSE, который позволяет сам curl. Вы также можете видеть, что curl не имеет возможности поддерживать прерывания через функцию обратного вызова write. Вам придется использовать что-то еще.