int curl_trailer_callback(struct curl_slist ** list, void *userdata);
This callback function will be called once right before sending the final CR LF in an HTTP chunked transfer to fill a list of trailing headers to be sent before finishing the HTTP transfer.
You can set the userdata argument with the CURLOPT_TRAILERDATA option.
The trailing headers included in the linked list must not be CRLF-terminated, because libcurl will add the appropriate line termination characters after each header item.
If you use curl_slist_append to add trailing headers to the curl_slist then libcurl will duplicate the strings, and will free the curl_slist and the duplicates once the trailers have been sent.
If one of the trailing headers is not formatted correctly (i.e. HeaderName: headerdata) it will be ignored and an info message will be emitted.
The return value can either be CURL_TRAILERFUNC_OK or CURL_TRAILERFUNC_ABORT which would respectively instruct libcurl to either continue with sending the trailers or to abort the request.
static int trailer_cb(struct curl_slist **tr, void *data)
/* libcurl will free the list */
tr = curl_slist_append(*tr, "My-super-awesome-trailer: trailer-stuff");
return CURL_TRAILERFUNC_OK; }
CURL *curl = curl_easy_init();
/* Set the URL of the request */
curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/");
/* Now set it as a put */
curl_easy_setopt(curl, CURLOPT_PUT, 1L);
/* Assuming we have a function that will return the data to be pushed
Let that function be read_cb */
curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_cb);
struct curl_slist *headers = NULL;
headers = curl_slist_append(headers, "Trailer: My-super-awsome-trailer");
res = curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
/* Set the trailers filling callback */
curl_easy_setopt(curl, CURLOPT_TRAILERFUNCTION, trailer_cb);
/* Perform the request, res will get the return code */
res = curl_easy_perform(curl);