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

# [NAME](#NAME)

CURLOPT\_HSTSREADFUNCTION - read 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] */
};
CURLSTScode hstsread(CURL *easy, struct curl_hstsentry *sts, void *clientp);
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HSTSREADFUNCTION, hstsread);
```

# [DESCRIPTION](#DESCRIPTION)

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

This callback function gets called by libcurl repeatedly when it populates the in-memory HSTS cache.

Set the *clientp* argument with the [*CURLOPT\_HSTSREADDATA(3)*](/man/os/curl/CURLOPT_HSTSREADDATA.3) option or it is NULL.

When this callback is invoked, the *sts* pointer points to a populated struct: Copy the hostname to *name* (no longer than *namelen* bytes). Make it null-terminated. Set *includeSubDomains* to TRUE or FALSE. Set *expire* to a date stamp or a zero length string for *forever* (wrong date stamp format might cause the name to not get accepted)

The callback should return *CURLSTS\_OK* if it returns a name and is prepared to be called again (for another host) or *CURLSTS\_DONE* if it has no entry to return. It can also return *CURLSTS\_FAIL* to signal error. Returning *CURLSTS\_FAIL* stops the transfer from being performed and make *CURLE\_ABORTED\_BY\_CALLBACK* get returned.

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

The hostname provided to libcurl *should not* have a trailing dot nor leading dot.

# [DEFAULT](#DEFAULT)

NULL - no callback.

# [PROTOCOLS](#PROTOCOLS)

This functionality affects http only

# [EXAMPLE](#EXAMPLE)

```
struct priv {


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


                           void *clientp)
{


  /* populate the struct as documented */


  return CURLSTS_OK;
}
int main(void)
{


  CURL *curl = curl_easy_init();


  if(curl) {


    struct priv my_stuff;


    CURLcode result;


    curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");


    /* set HSTS read callback */


    curl_easy_setopt(curl, CURLOPT_HSTSREADFUNCTION, hsts_cb);


    /* pass in suitable argument to the callback */


    curl_easy_setopt(curl, CURLOPT_HSTSREADDATA, &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\_HSTSREADDATA**(3)](/man/os/curl/CURLOPT_HSTSREADDATA.3), [**CURLOPT\_HSTSWRITEFUNCTION**(3)](/man/os/curl/CURLOPT_HSTSWRITEFUNCTION.3), [**CURLOPT\_HSTS\_CTRL**(3)](/man/os/curl/CURLOPT_HSTS_CTRL.3)

2026-10-19 libcurl

---

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