2010-06-09 5 views
0

J'utilise libcurl pour une bibliothèque RESTful. J'ai deux problèmes avec un message PUT, j'essaie juste d'envoyer un petit contenu comme "bonjour" via put.libcurl (c api) READFUNCTION pour le blocage http PUT à jamais

  1. Mon READFUNCTION pour les blocs de PUT pour une très grande quantité de temps (minutes) quand je suis le manuel à curl.haxx.se et retourner un 0 indiquant que j'ai fini le contenu. (sur os X) Quand je retourne quelque chose> 0 ceci réussit beaucoup plus vite (< 1 sec)

  2. Quand je l'exécute sur ma machine Linux (Ubuntu 10.4) cet événement bloquant semble ne JAMAIS retourner quand je renvoies 0, si Je change le comportement pour retourner la taille écrite libcurl ajoute toutes les données dans le corps http envoyant beaucoup plus de données et il échoue avec un message "trop ​​de données" du serveur. mon readfunction est ci-dessous, toute aide serait grandement appréciée. J'utilise libcurl 7.20.1


    typedef struct{ 
     void *data; 
     int body_size; 
     int bytes_remaining; 
     int bytes_written; 
    } postdata;

size_t readfunc(void *ptr, size_t size, size_t nmemb, void *stream) { 

if(stream) { 
    postdata *ud = (postdata*)stream; 

    if(ud->bytes_remaining) { 
     if(ud->body_size > size*nmemb) { 
      memcpy(ptr, ud->data+ud->bytes_written, size*nmemb); 
      ud->bytes_written+=size+nmemb; 
    ud->bytes_remaining = ud->body_size-size*nmemb; 
      return size*nmemb; 
} else { 
    memcpy(ptr, ud->data+ud->bytes_written, ud->bytes_remaining); 
      ud->bytes_remaining=0; 
    return 0; 
     } 
    } 

Répondre

0

du manuel (man curl_easy_setopt):

 CURLOPT_READFUNCTION 
      Function pointer that should match the following prototype: size_t function(void *ptr, size_t size, size_t nmemb, void *stream); This function gets called by libcurl as soon as 
      it needs to read data in order to send it to the peer. The data area pointed at by the pointer ptr may be filled with at most size multiplied with nmemb number of bytes. Your 
      function must return the actual number of bytes that you stored in that memory area. Returning 0 will signal end-of-file to the library and cause it to stop the current trans- 
      fer. 

      If you stop the current transfer by returning 0 "pre-maturely" (i.e before the server expected it, like when you've told you will upload N bytes and you upload less than N 
      bytes), you may experience that the server "hangs" waiting for the rest of the data that won't come. 

      The read callback may return CURL_READFUNC_ABORT to stop the current operation immediately, resulting in a CURLE_ABORTED_BY_CALLBACK error code from the transfer (Added in 
      7.12.1) 

      If you set the callback pointer to NULL, or doesn't set it at all, the default internal read function will be used. It is simply doing an fread() on the FILE * stream set with 
      CURLOPT_READDATA. 

retour si CURL_READFUNC_ABORT pour arrêter l'opération