.\" generated by cd2nroff 0.1 from CURLOPT_POST.md .TH CURLOPT_POST 3 "2026-06-24" libcurl .SH NAME CURLOPT_POST \- make an HTTP POST .SH SYNOPSIS .nf #include CURLcode curl_easy_setopt(CURL *handle, CURLOPT_POST, long post); .fi .SH DESCRIPTION A parameter set to 1 tells libcurl to do a regular HTTP post. This also makes libcurl use a "Content\-Type: application/x\-www\-form\-urlencoded" header. This is the most commonly used POST method. Use one of \fICURLOPT_POSTFIELDS(3)\fP or \fICURLOPT_COPYPOSTFIELDS(3)\fP options to specify what data to post and \fICURLOPT_POSTFIELDSIZE(3)\fP or \fICURLOPT_POSTFIELDSIZE_LARGE(3)\fP to set the data size. Optionally, you can provide data to POST using the \fICURLOPT_READFUNCTION(3)\fP and \fICURLOPT_READDATA(3)\fP options but then you must make sure to not set \fICURLOPT_POSTFIELDS(3)\fP to anything but NULL. When providing data with a callback, you must transmit it using chunked transfer\-encoding or you must set the size of the data with the \fICURLOPT_POSTFIELDSIZE(3)\fP or \fICURLOPT_POSTFIELDSIZE_LARGE(3)\fP options. To enable chunked encoding, pass in the appropriate Transfer\-Encoding header, see the post\-callback.c example. You can override the default POST Content\-Type: header by setting your own with \fICURLOPT_HTTPHEADER(3)\fP. Using POST with HTTP 1.1 implies the use of a "Expect: 100\-continue" header. You can disable this header with \fICURLOPT_HTTPHEADER(3)\fP as usual. If you use POST to an HTTP 1.1 server, you can send data without knowing the size before starting the POST if you use chunked encoding. You enable this by adding a header like "Transfer\-Encoding: chunked" with \fICURLOPT_HTTPHEADER(3)\fP. With HTTP 1.0 or without chunked transfer, you must specify the size in the request. libcurl automatically uses chunked encoding for POSTs if the size is unknown. When setting \fICURLOPT_POST(3)\fP to 1, libcurl automatically sets \fICURLOPT_NOBODY(3)\fP and \fICURLOPT_HTTPGET(3)\fP to 0. If you issue a POST request and then want to make a HEAD or GET using the same reused handle, you must explicitly set the new request type using \fICURLOPT_NOBODY(3)\fP or \fICURLOPT_HTTPGET(3)\fP or similar. When setting \fICURLOPT_POST(3)\fP to 0, libcurl resets the request type to the default to disable the POST. Typically that means gets reset to GET. Instead you should set a new request type explicitly as described above. .SH DEFAULT 0, disabled .SH PROTOCOLS This functionality affects http only .SH EXAMPLE .nf int main(void) { CURL *curl = curl_easy_init(); if(curl) { CURLcode result; curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin"); curl_easy_setopt(curl, CURLOPT_POST, 1L); /* set up the read callback with CURLOPT_READFUNCTION */ result = curl_easy_perform(curl); curl_easy_cleanup(curl); } } .fi .SH AVAILABILITY Added in curl 7.1 .SH RETURN VALUE \fIcurl_easy_setopt(3)\fP returns a CURLcode indicating success or error. CURLE_OK (0) means everything was OK, non\-zero means an error occurred, see \fIlibcurl\-errors(3)\fP. .SH SEE ALSO .BR CURLOPT_HTTPPOST (3), .BR CURLOPT_POSTFIELDS (3), .BR CURLOPT_UPLOAD (3)