API Overview
 Docs  
API: easy  API: multi  API: share  API: URL  API: WebSocket  Environment vars  Errors  Examples  Security  Symbols  Tutorial  

easy setopt options  easy getinfo options  multi setopt options  TLS options  


Functions  
All functions  curl_easy_getinfo  curl_easy_init  curl_easy_perform  curl_easy_reset  curl_easy_setopt  curl_multi_add_handle  curl_multi_init  curl_multi_perform  curl_multi_remove_handle  curl_multi_setopt  




curl / libcurl / API / curl_easy_setopt / CURLOPT_HTTP_VERSION

 CURLOPT_HTTP_VERSION explained 


Related:
easy options
getinfo options
multi options
File a bug about this page
View man page source

Name


CURLOPT_HTTP_VERSION - HTTP protocol version to use 

Synopsis

#include <curl/curl.h>
 
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HTTP_VERSION, long version);

Description


Pass version a long, set to one of the values described below. They ask libcurl to use the specific HTTP versions. 

Note that the HTTP version is just a request. libcurl still prioritizes to reuse existing connections so it might then reuse a connection using an HTTP version you have not asked for. 

CURL_HTTP_VERSION_NONE 

We do not care about what version the library uses. libcurl uses whatever it thinks fit. 

CURL_HTTP_VERSION_1_0 

Enforce HTTP 1.0 requests. 

CURL_HTTP_VERSION_1_1 

Enforce HTTP 1.1 requests. 

CURL_HTTP_VERSION_2_0 

Attempt HTTP 2 requests. libcurl falls back to HTTP 1.1 if HTTP 2 cannot be negotiated with the server. 

When libcurl uses HTTP/2 over HTTPS, it does not itself insist on TLS 1.2 or higher even though that is required by the specification. A user can add this version requirement with CURLOPT_SSLVERSION. 

The alias CURL_HTTP_VERSION_2 was added to better reflect the actual protocol name. 

CURL_HTTP_VERSION_2TLS 

Attempt HTTP 2 over TLS (HTTPS) only. libcurl falls back to HTTP 1.1 if HTTP 2 cannot be negotiated with the HTTPS server. For clear text HTTP servers, libcurl uses 1.1. 

CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE 

Issue non-TLS HTTP requests using HTTP/2 without HTTP/1.1 Upgrade. It requires prior knowledge that the server supports HTTP/2 straight away. HTTPS requests still do HTTP/2 the standard way with negotiated protocol version in the TLS handshake. 

Since 8.10.0 if this option is set for an HTTPS request then the application layer protocol version (ALPN) offered to the server is only HTTP/2. Prior to that both HTTP/1.1 and HTTP/2 were offered. 

CURL_HTTP_VERSION_3 

(Added in 7.66.0) This option makes libcurl attempt to use HTTP/3 to the host given in the URL, with fallback to earlier HTTP versions if needed. 

CURL_HTTP_VERSION_3ONLY 

(Added in 7.88.0) Setting this makes libcurl attempt to use HTTP/3 directly to server given in the URL and does not downgrade to earlier HTTP version if the server does not support HTTP/3. 

Default


Since curl 8.13.0: CURL_HTTP_VERSION_NONE 

Since curl 7.62.0: CURL_HTTP_VERSION_2TLS 

Before that: CURL_HTTP_VERSION_1_1 

Protocols


This functionality affects http only 

Example

int main(void)
{
  CURL *curl = curl_easy_init();
  if(curl) {
    CURLcode result;
    curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
    curl_easy_setopt(curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2TLS);
    result = curl_easy_perform(curl);
    if(result == CURLE_HTTP_RETURNED_ERROR) {
      /* an HTTP response error problem */
    }
  }
}

History


CURL_HTTP_VERSION_* enums became long types in 8.13.0, prior to this version a long cast was necessary when passed to curl_easy_setopt. 

Availability


Added in curl 7.9.1 

Return value


curl_easy_setopt returns a CURLcode indicating success or error. 

CURLE_OK (0) means everything was OK, non-zero means an error occurred, see libcurl-errors. 

See also


CURLOPT_ALTSVC(3), CURLOPT_HTTP09_ALLOWED(3), CURLOPT_HTTP200ALIASES(3), CURLOPT_SSLVERSION(3) 
This HTML page was made with roffit.