Pergunta

Como faço para cancelar uma transferência em pycurl? i usar para retornar -1 em libcurl mas pycurl não parece assim ( "pycurl.error: valor de retorno inválido para gravação de retorno -1 17") retornará 0 não funciona quer, eu recebo "erro: (23 ', o corpo escrita falhou ')". Além disso, como posso fazer um try / exceto com pycurl? Eu não vejo qualquer exemplos on-line, nem os exemplos pycurl do site

Foi útil?

Solução

Exemplo de código ajudaria aqui. A julgar pela mensagem de erro, e grepping para ele no código-fonte, você configurar uma chamada de retorno gravação. Isso é configurado, eu acho, por CURLOPT_WRITEFUNCTION, e a documentação para que diz:

retornar o número de bytes realmente cuidado. Se essa quantidade difere do montante passou para o seu função, ele vai sinalizar um erro ao biblioteca e ele irá abortar a transferência e retorno CURLE_WRITE_ERROR.

O pycurl invólucro código verifica que o valor está entre 0 e o número passado para ele. É por isso -1 falhou, e por isso 0, gatilhos CURLE_WRITE_ERROR, levanta a exceção "falhou a escrita do corpo". O código 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;
 }

Eu não vejo nenhuma maneira em pycurl para esta função para apoiar outro valor de retorno. Pode haver outras maneiras, como a criação de uma chamada de retorno de progresso, que parece permitir que aborts.

O código relevante em si mesma onda é:

/* 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;
}

para que você possa ver que pycurl não suporta devolver o CURL_WRITEFUNC_PAUSE que enrolar em si permite. Você também pode ver que onda não tem como apoiar aborts através da função de gravação de chamada de retorno. Você terá que usar outra coisa.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top