CURLOPT\_HTTPPOST(3) Library Functions Manual CURLOPT\_HTTPPOST(3)

# [NAME](#NAME)

CURLOPT\_HTTPPOST - multipart formpost content

# [SYNOPSIS](#SYNOPSIS)

```
#include <curl/curl.h>
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HTTPPOST,


                          struct curl_httppost *formpost);
```

# [DESCRIPTION](#DESCRIPTION)

**This option is deprecated.** Use [*CURLOPT\_MIMEPOST(3)*](/man/os/curl/CURLOPT_MIMEPOST.3) instead.

Tells libcurl you want a **multipart/formdata** HTTP POST to be made and you instruct what data to pass on to the server in the *formpost* argument. Pass a pointer to a linked list of *curl\_httppost* structs as parameter. The easiest way to create such a list, is to use [*curl\_formadd(3)*](/man/os/curl/curl_formadd.3) as documented. The data in this list must remain intact as long as the curl transfer is alive and is using it.

Using POST with HTTP 1.1 implies the use of a "Expect: 100-continue" header. You can disable this header with [*CURLOPT\_HTTPHEADER(3)*](/man/os/curl/CURLOPT_HTTPHEADER.3).

When setting [*CURLOPT\_HTTPPOST(3)*](/man/os/curl/CURLOPT_HTTPPOST.3), libcurl automatically sets [*CURLOPT\_NOBODY(3)*](/man/os/curl/CURLOPT_NOBODY.3) to 0.

# [DEFAULT](#DEFAULT)

NULL

# [PROTOCOLS](#PROTOCOLS)

This functionality affects http only

# [EXAMPLE](#EXAMPLE)

```
int main(void)
{


  CURL *curl;


  struct curl_httppost *formpost;


  struct curl_httppost *lastptr;


  /* Fill in the file upload field. This makes libcurl load data from


     the given filename when curl_easy_perform() is called. */


  curl_formadd(&formpost,


               &lastptr,


               CURLFORM_COPYNAME, "sendfile",


               CURLFORM_FILE, "postit2.c",


               CURLFORM_END);


  /* Fill in the filename field */


  curl_formadd(&formpost,


               &lastptr,


               CURLFORM_COPYNAME, "filename",


               CURLFORM_COPYCONTENTS, "postit2.c",


               CURLFORM_END);


  /* Fill in the submit field too, even if this is rarely needed */


  curl_formadd(&formpost,


               &lastptr,


               CURLFORM_COPYNAME, "submit",


               CURLFORM_COPYCONTENTS, "send",


               CURLFORM_END);


  curl = curl_easy_init();


  if(curl) {


    CURLcode result;


    curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);


    result = curl_easy_perform(curl);


    curl_easy_cleanup(curl);


  }


  curl_formfree(formpost);
}
```

# [DEPRECATED](#DEPRECATED)

Deprecated in 7.56.0.

# [AVAILABILITY](#AVAILABILITY)

Added in curl 7.1

# [RETURN VALUE](#RETURN_VALUE)

[*curl\_easy\_setopt(3)*](/man/os/curl/curl_easy_setopt.3) returns a CURLcode indicating success or error.

CURLE\_OK (0) means everything was OK, non-zero means an error occurred, see [*libcurl-errors(3)*](/man/os/curl/libcurl-errors.3).

# [SEE ALSO](#SEE_ALSO)

[**CURLOPT\_MIMEPOST**(3)](/man/os/curl/CURLOPT_MIMEPOST.3), [**CURLOPT\_POST**(3)](/man/os/curl/CURLOPT_POST.3), [**CURLOPT\_POSTFIELDS**(3)](/man/os/curl/CURLOPT_POSTFIELDS.3), [**curl\_formadd**(3)](/man/os/curl/curl_formadd.3), [**curl\_formfree**(3)](/man/os/curl/curl_formfree.3), [**curl\_mime\_init**(3)](/man/os/curl/curl_mime_init.3)

2026-10-19 libcurl

---

Document: CURLOPT_HTTPPOST(3) from curl 8.23.0-r1 (Chainguard OS)
Source: https://github.com/curl/curl.git
