2009-02-08 8 views
1

Comment annuler un transfert en pycurl? J'utilise pour retourner -1 dans libcurl mais pycurl ne semble pas aimer cela ("pycurl.error: valeur de retour invalide pour écrire callback -1 17") retour 0 ne fonctionne pas non plus, j'obtiens "erreur: (23, 'corps d'écriture Échec ') ". Aussi comment faire un essai/excepté avec pycurl? Je ne vois aucun exemple en ligne ni les exemples de pycurl du sitepycurl annuler un transfert et essayer & sauf

Répondre

3

Exemple de code aiderait ici. À en juger par le message d'erreur, et en l'affichant dans le code source, vous avez configuré un callback en écriture. Ceci est configuré, je pense, par CURLOPT_WRITEFUNCTION et la documentation qui dit:

Return the number of bytes actually taken care of. If that amount differs from the amount passed to your function, it'll signal an error to the library and it will abort the transfer and return CURLE_WRITE_ERROR.

Le code wrapper pycurl vérifie que la valeur est comprise entre 0 et le nombre qui lui est passé. C'est pourquoi -1 a échoué, et pourquoi 0, déclenche CURLE_WRITE_ERROR, déclenche l'exception "corps d'écriture ayant échoué". Le code pycurl est:

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

Je ne vois aucune façon pycurl pour cette fonction pour soutenir une autre valeur de retour. Il pourrait y avoir d'autres moyens, comme la mise en place d'un rappel de progression, qui semble permettre les interruptions.

Le code correspondant à boucle est lui-même:

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

afin que vous puissiez voir que pycurl ne supporte pas le retour CURL_WRITEFUNC_PAUSE qui déferlent lui-même permet. Vous pouvez également voir que curl n'a aucun moyen de prendre en charge les interruptions grâce à la fonction de rappel d'écriture. Vous devrez utiliser autre chose.