Thanks, I also finally figured it out (after many hours of banging my head into 
the wall), and was just about to answer myself on the list :)

Annoying that a tool like RequestBin isn’t accurate, it makes it kinda 
pointless…

Sorry for the noise, and thanks for your time!

Erik



> 30 aug 2015 kl. 20:53 skrev Aaron Meriwether <[email protected]>:
> 
> RequestBin seems to be unable to deal properly with chunked posts.
> I tried your example against my own server (Apache+mod_cgi+Perl), and it 
> works:
> https://gist.github.com/p120ph37/9490dc9a8a1b5a38b9a2 
> <https://gist.github.com/p120ph37/9490dc9a8a1b5a38b9a2>
> 
> -Aaron
> 
>> On Aug 30, 2015, at 3:40 AM, Erik Ronström <[email protected] 
>> <mailto:[email protected]>> wrote:
>> 
>> Hi curlers,
>> 
>> I’m trying to do a chunked POST, taking the post-callback example as a 
>> starting point. However, it appears that unless I provide a content length 
>> (with CURLOPT_POSTFIELDSIZE), the post data is being sent. The read callback 
>> is being called, but no body data is actually being sent to the server.
>> 
>> Below is the code used, and its output. libcurl says the request is 65525 
>> bytes, but RequestBin says ”Form/Post Parameters: None” and ”Raw Body: 
>> None”. (http://requestb.in/1glodpr1?inspect#1mtrcf 
>> <http://requestb.in/1glodpr1?inspect#1mtrcf>)
>> 
>> What am I missing here? Probably something trivial, but I cannot figure it 
>> out!
>> 
>> Many thanks
>> Erik
>> 
>> 
>> static size_t _upload_read_function(void *ptr, size_t size, size_t nmemb, 
>> void *data)
>> {
>>    struct WriteThis *pooh = (struct WriteThis *)data;
>>    size_t max_bytes = size*nmemb;
>>    if (max_bytes < 1)
>>        return 0;
>> 
>>    if (pooh->sizeleft) {
>>        size_t bytes = max_bytes < pooh->sizeleft ? max_bytes : 
>> pooh->sizeleft;
>>        memcpy(ptr, pooh->readptr, bytes);
>>        pooh->readptr += bytes;
>>        pooh->sizeleft -= bytes;
>>        printf("upload_read_function: %zu bytes (%ld left)\n", bytes, 
>> pooh->sizeleft);
>>        return size*nmemb;
>>    }
>> 
>>    return 0;
>> }
>> 
>> 
>> int main(int argc, char const *argv[])
>> {
>>  curl_version_info_data *curl_version = curl_version_info(CURLVERSION_NOW);
>>  printf("libcurl: %s\n", curl_version->version);
>> 
>>  size_t buffer_size = ... ;
>>  unsigned char *ogg_buffer = ... ;
>> 
>>  struct WriteThis pooh;
>>  pooh.readptr = ogg_buffer;
>>  pooh.sizeleft = buffer_size;
>> 
>>  CURL *curl = curl_easy_init();
>>  if (curl) {
>>      curl_easy_setopt(curl, CURLOPT_URL, "http://requestb.in/1glodpr1 
>> <http://requestb.in/1glodpr1>");
>>      curl_easy_setopt(curl, CURLOPT_POST, 1L);
>>      struct curl_slist *chunk = NULL;
>>      chunk = curl_slist_append(chunk, "Transfer-Encoding: chunked");
>>      curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk);
>>      // curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, buffer_size);   // <-- 
>> if this line is enabled, data is sent correctly
>>      curl_easy_setopt(curl, CURLOPT_READDATA, &pooh);
>>      curl_easy_setopt(curl, CURLOPT_READFUNCTION, _upload_read_function);
>>      curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
>>      CURLcode res = curl_easy_perform(curl);
>> 
>>      if (res == CURLE_OK) {
>>          long response_code;
>>          double request_size;
>>          curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response_code);
>>          curl_easy_getinfo(curl, CURLINFO_SIZE_UPLOAD, &request_size);
>>          printf("Server responeded with %d, request was %f bytes\n", 
>> response_code, request_size);
>>      } else {
>>          fprintf(stderr, "curl_easy_perform() failed: %s\n", 
>> curl_easy_strerror(res));
>>      }
>> 
>>      // Cleanup
>>      curl_slist_free_all(chunk);
>>      curl_easy_cleanup(curl);
>>  }
>> 
>> 
>> libcurl: 7.37.1
>> * Hostname was NOT found in DNS cache
>> *   Trying 54.225.217.107...
>> * Connected to requestb.in (54.225.217.107) port 80 (#0)
>>> POST /1glodpr1 HTTP/1.1
>> Host: requestb.in
>> Accept: */*
>> Transfer-Encoding: chunked
>> Content-Type: application/x-www-form-urlencoded
>> Expect: 100-continue
>> 
>> < HTTP/1.1 100 Continue
>> upload_read_function: 16372 bytes (48988 left)
>> upload_read_function: 16372 bytes (32616 left)
>> upload_read_function: 16372 bytes (16244 left)
>> upload_read_function: 16244 bytes (0 left)
>> < HTTP/1.1 200 OK
>> < Connection: close
>> * Server gunicorn/19.3.0 is not blacklisted
>> < Server: gunicorn/19.3.0
>> < Date: Sun, 30 Aug 2015 08:33:07 GMT
>> < Content-Type: text/html; charset=utf-8
>> < Content-Length: 2
>> < Sponsored-By: https://www.runscope.com <https://www.runscope.com/>
>> < Via: 1.1 vegur
>> < 
>> * Closing connection 0
>> ok
>> Server responeded with 200, request was 65525.000000 bytes
>> 
>> 
>> 
>> 
>> -------------------------------------------------------------------
>> List admin: http://cool.haxx.se/list/listinfo/curl-library 
>> <http://cool.haxx.se/list/listinfo/curl-library>
>> Etiquette:  http://curl.haxx.se/mail/etiquette.html 
>> <http://curl.haxx.se/mail/etiquette.html>
> -------------------------------------------------------------------
> List admin: http://cool.haxx.se/list/listinfo/curl-library
> Etiquette:  http://curl.haxx.se/mail/etiquette.html

-------------------------------------------------------------------
List admin: http://cool.haxx.se/list/listinfo/curl-library
Etiquette:  http://curl.haxx.se/mail/etiquette.html

Reply via email to