---
name: "CURLOPT_HSTSREADFUNCTION"
section: "3"
platform: "linux"
package: "curl"
version: "8.23.0-1"
release: "Arch Linux 2026-11-01"
platforms: ["linux", "macos"]
url: "https://new.carta.tech/CURLOPT_HSTSREADFUNCTION"
---

# CURLOPT\_HSTSREADFUNCTION(3)

read callback for HSTS hosts

## NAME

CURLOPT\_HSTSREADFUNCTION - read callback for HSTS hosts

## 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

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)](/CURLOPT_HSTSREADDATA/3.md)* 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)](/CURLOPT_HSTS_CTRL/3.md)* to do that.

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

## DEFAULT

NULL - no callback.

## PROTOCOLS

This functionality affects http only

## 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

Added in curl 7.74.0

## RETURN VALUE

This returns CURLE\_OK.

## SEE ALSO

[**CURLOPT\_HSTS**(3)](/CURLOPT_HSTS/3.md), [**CURLOPT\_HSTSREADDATA**(3)](/CURLOPT_HSTSREADDATA/3.md), [**CURLOPT\_HSTSWRITEFUNCTION**(3)](/CURLOPT_HSTSWRITEFUNCTION/3.md), [**CURLOPT\_HSTS\_CTRL**(3)](/CURLOPT_HSTS_CTRL/3.md)
