Set string options
There are currently over 80 options for
curl_easy_setopt()that accept a string as its third argument.
When a string is set in a handle, libcurl immediately copies that data so that the application does not have to keep the data around for the time the transfer is being done - with one notable exception:
Set a URL in the handle:
curl_easy_setopt(handle, CURLOPT_URL, "https://example.com");
The exception to the rule that libcurl always copies data,
CURLOPT_POSTFIELDSonly stores the pointer to the data, meaning an application using this option must keep the memory around for the entire duration of the associated transfer.
If that is problematic, an alternative is to instead use
CURLOPT_COPYPOSTFIELDSwhich copies the data. If the data is binary and does not stop at the first presence of a null byte, make sure that
CURLOPT_POSTFIELDSIZEis set before this option is used.
CURLOPT_POSTFIELDSis an exception is due to legacy. Originally (before curl 7.17.0), libcurl did not copy any string arguments and when this current behavior was introduced, this option could not be converted over without breaking behavior so it had to keep working like before. Which now sticks out, as no other option does...
If you use libcurl from a C++ program, it is important to remember that you cannot pass in a string object where libcurl expects a string. It has to be a null terminated C string. Usually you can make this happen with the
For example, keep the URL in a string object and set that in the handle:
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());