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

# [NAME](#NAME)

CURLOPT\_HSTSWRITEFUNCTION - write callback for HSTS hosts

# [SYNOPSIS](#SYNOPSIS)

```
#include <curl/curl.h>
struct curl_hstsentry {


  char *name;


  size_t namelen;


  unsigned int includeSubDomains:1;


  char expire[18]; /* YYYYMMDD HH:MM:SS [null-terminated] */
};
struct curl_index {


  size_t index; /* the provided entry's "index" or count */


  size_t total; /* total number of entries to save */
};
CURLSTScode hstswrite(CURL *easy, struct curl_hstsentry *sts,


                      struct curl_index *count, void *clientp);
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HSTSWRITEFUNCTION, hstswrite);
```

# [DESCRIPTION](#DESCRIPTION)

Pass a pointer to your callback function, as the prototype shows above.

This callback function gets called by libcurl repeatedly to allow the application to store the in-memory HSTS cache when libcurl is about to discard it.

Set the *clientp* argument with the [*CURLOPT\_HSTSWRITEDATA(3)*](/man/os/curl/CURLOPT_HSTSWRITEDATA.3) option or it is NULL. When the callback is invoked, the *sts* pointer points to a populated struct: Read the hostname to 'name' (it is *namelen* bytes long and null-terminated. The *includeSubDomains* field is non-zero if the entry matches subdomains. The *expire* string is a date stamp null-terminated string using the syntax YYYYMMDD HH:MM:SS.

The callback should return *CURLSTS\_OK* if it succeeded and is prepared to be called again (for another host) or *CURLSTS\_DONE* if there is nothing more to do. It can also return *CURLSTS\_FAIL* to signal error.

This option does not enable HSTS, you need to use [*CURLOPT\_HSTS\_CTRL(3)*](/man/os/curl/CURLOPT_HSTS_CTRL.3) to do that.

# [DEFAULT](#DEFAULT)

NULL - no callback.

# [PROTOCOLS](#PROTOCOLS)

This functionality affects http only

# [EXAMPLE](#EXAMPLE)

```
struct priv {


  void *custom;
};
static CURLSTScode hswr_cb(CURL *easy, struct curl_hstsentry *sts,


                           struct curl_index *count, void *clientp)
{


  /* save the passed in HSTS data somewhere */


  return CURLSTS_OK;
}
int main(void)
{


  CURL *curl = curl_easy_init();


  if(curl) {


    struct priv my_stuff;


    CURLcode result;


    /* set HSTS read callback */


    curl_easy_setopt(curl, CURLOPT_HSTSWRITEFUNCTION, hswr_cb);


    /* pass in suitable argument to the callback */


    curl_easy_setopt(curl, CURLOPT_HSTSWRITEDATA, &my_stuff);


    result = curl_easy_perform(curl);


  }
}
```

# [AVAILABILITY](#AVAILABILITY)

Added in curl 7.74.0

# [RETURN VALUE](#RETURN_VALUE)

This returns CURLE\_OK.

# [SEE ALSO](#SEE_ALSO)

[**CURLOPT\_HSTS**(3)](/man/os/curl/CURLOPT_HSTS.3), [**CURLOPT\_HSTSWRITEDATA**(3)](/man/os/curl/CURLOPT_HSTSWRITEDATA.3), [**CURLOPT\_HSTSWRITEFUNCTION**(3)](/man/os/curl/CURLOPT_HSTSWRITEFUNCTION.3), [**CURLOPT\_HSTS\_CTRL**(3)](/man/os/curl/CURLOPT_HSTS_CTRL.3)

2026-10-31 libcurl

---

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