pycurl отменить перевод и попробовать & кроме - PullRequest
1 голос
/ 08 февраля 2009

Как мне отменить перевод в pycurl? Я использую для возврата -1 в libcurl, но pycurl, похоже, не так ("pycurl.error: неверное возвращаемое значение для обратного вызова записи -1 17"), возвращать 0 тоже не работает, я получаю "ошибка: (23, 'Ошибка записи тела ') ". Кроме того, как я могу попробовать / кроме с Pycurl? я не вижу ни примеров в интернете, ни примеров pycurl с сайта

1 Ответ

3 голосов
/ 08 марта 2009

Пример кода поможет здесь. Судя по сообщению об ошибке и обращаясь к нему в исходном коде, вы установили обратный вызов записи. Это настроено, я думаю, 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. Вам придется использовать что-то еще.

...