1*6236dae4SAndroid Build Coastguard Worker--- 2*6236dae4SAndroid Build Coastguard Workerc: Copyright (C) Daniel Stenberg, <[email protected]>, et al. 3*6236dae4SAndroid Build Coastguard WorkerSPDX-License-Identifier: curl 4*6236dae4SAndroid Build Coastguard WorkerTitle: curl_easy_header 5*6236dae4SAndroid Build Coastguard WorkerSection: 3 6*6236dae4SAndroid Build Coastguard WorkerSource: libcurl 7*6236dae4SAndroid Build Coastguard WorkerSee-also: 8*6236dae4SAndroid Build Coastguard Worker - CURLINFO_CONTENT_TYPE (3) 9*6236dae4SAndroid Build Coastguard Worker - CURLOPT_HEADERFUNCTION (3) 10*6236dae4SAndroid Build Coastguard Worker - curl_easy_nextheader (3) 11*6236dae4SAndroid Build Coastguard Worker - curl_easy_perform (3) 12*6236dae4SAndroid Build Coastguard Worker - libcurl-errors (3) 13*6236dae4SAndroid Build Coastguard WorkerProtocol: 14*6236dae4SAndroid Build Coastguard Worker - HTTP 15*6236dae4SAndroid Build Coastguard WorkerAdded-in: 7.83.0 16*6236dae4SAndroid Build Coastguard Worker--- 17*6236dae4SAndroid Build Coastguard Worker 18*6236dae4SAndroid Build Coastguard Worker# NAME 19*6236dae4SAndroid Build Coastguard Worker 20*6236dae4SAndroid Build Coastguard Workercurl_easy_header - get an HTTP header 21*6236dae4SAndroid Build Coastguard Worker 22*6236dae4SAndroid Build Coastguard Worker# SYNOPSIS 23*6236dae4SAndroid Build Coastguard Worker 24*6236dae4SAndroid Build Coastguard Worker~~~c 25*6236dae4SAndroid Build Coastguard Worker#include <curl/curl.h> 26*6236dae4SAndroid Build Coastguard Worker 27*6236dae4SAndroid Build Coastguard WorkerCURLHcode curl_easy_header(CURL *easy, 28*6236dae4SAndroid Build Coastguard Worker const char *name, 29*6236dae4SAndroid Build Coastguard Worker size_t index, 30*6236dae4SAndroid Build Coastguard Worker unsigned int origin, 31*6236dae4SAndroid Build Coastguard Worker int request, 32*6236dae4SAndroid Build Coastguard Worker struct curl_header **hout); 33*6236dae4SAndroid Build Coastguard Worker~~~ 34*6236dae4SAndroid Build Coastguard Worker 35*6236dae4SAndroid Build Coastguard Worker# DESCRIPTION 36*6236dae4SAndroid Build Coastguard Worker 37*6236dae4SAndroid Build Coastguard Workercurl_easy_header(3) returns a pointer to a "curl_header" struct in **hout** 38*6236dae4SAndroid Build Coastguard Workerwith data for the HTTP response header *name*. The case insensitive 39*6236dae4SAndroid Build Coastguard Workernull-terminated header name should be specified without colon. 40*6236dae4SAndroid Build Coastguard Worker 41*6236dae4SAndroid Build Coastguard Worker*index* 0 means asking for the first instance of the header. If the returned 42*6236dae4SAndroid Build Coastguard Workerheader struct has **amount** set larger than 1, it means there are more 43*6236dae4SAndroid Build Coastguard Workerinstances of the same header name available to get. Asking for a too big index 44*6236dae4SAndroid Build Coastguard Workermakes **CURLHE_BADINDEX** get returned. 45*6236dae4SAndroid Build Coastguard Worker 46*6236dae4SAndroid Build Coastguard WorkerThe *origin* argument is for specifying which headers to receive, as a single 47*6236dae4SAndroid Build Coastguard WorkerHTTP transfer might provide headers from several different places and they may 48*6236dae4SAndroid Build Coastguard Workerthen have different importance to the user and headers using the same name 49*6236dae4SAndroid Build Coastguard Workermight be used. The *origin* is a bitmask for what header sources you want. See 50*6236dae4SAndroid Build Coastguard Workerthe descriptions below. 51*6236dae4SAndroid Build Coastguard Worker 52*6236dae4SAndroid Build Coastguard WorkerThe *request* argument tells libcurl from which request you want headers 53*6236dae4SAndroid Build Coastguard Workerfrom. A single transfer might consist of a series of HTTP requests and this 54*6236dae4SAndroid Build Coastguard Workerargument lets you specify which particular individual request you want the 55*6236dae4SAndroid Build Coastguard Workerheaders from. 0 being the first request and then the number increases for 56*6236dae4SAndroid Build Coastguard Workerfurther redirects or when multi-state authentication is used. Passing in -1 is 57*6236dae4SAndroid Build Coastguard Workera shortcut to "the last" request in the series, independently of the actual 58*6236dae4SAndroid Build Coastguard Workeramount of requests used. 59*6236dae4SAndroid Build Coastguard Worker 60*6236dae4SAndroid Build Coastguard Workerlibcurl stores and provides the actually used "correct" headers. If for 61*6236dae4SAndroid Build Coastguard Workerexample two headers with the same name arrive and the latter overrides the 62*6236dae4SAndroid Build Coastguard Workerformer, then only the latter is provided. If the first header survives the 63*6236dae4SAndroid Build Coastguard Workersecond, then only the first one is provided. An application using this API 64*6236dae4SAndroid Build Coastguard Workerdoes not have to bother about multiple headers used wrongly. 65*6236dae4SAndroid Build Coastguard Worker 66*6236dae4SAndroid Build Coastguard WorkerThe memory for the returned struct is associated with the easy handle and 67*6236dae4SAndroid Build Coastguard Workersubsequent calls to curl_easy_header(3) clobber the struct used in the 68*6236dae4SAndroid Build Coastguard Workerprevious calls for the same easy handle. The application needs to copy the data if 69*6236dae4SAndroid Build Coastguard Workerit wants to keep it around. The memory used for the struct gets freed with 70*6236dae4SAndroid Build Coastguard Workercalling curl_easy_cleanup(3) of the easy handle. 71*6236dae4SAndroid Build Coastguard Worker 72*6236dae4SAndroid Build Coastguard WorkerThe first line in an HTTP response is called the status line. It is not 73*6236dae4SAndroid Build Coastguard Workerconsidered a header by this function. Headers are the "name: value" lines 74*6236dae4SAndroid Build Coastguard Workerfollowing the status. 75*6236dae4SAndroid Build Coastguard Worker 76*6236dae4SAndroid Build Coastguard WorkerThis function can be used before (all) headers have been received and is fine 77*6236dae4SAndroid Build Coastguard Workerto call from within libcurl callbacks. It returns the state of the headers at 78*6236dae4SAndroid Build Coastguard Workerthe time it is called. 79*6236dae4SAndroid Build Coastguard Worker 80*6236dae4SAndroid Build Coastguard Worker# The header struct 81*6236dae4SAndroid Build Coastguard Worker 82*6236dae4SAndroid Build Coastguard Worker~~~c 83*6236dae4SAndroid Build Coastguard Workerstruct curl_header { 84*6236dae4SAndroid Build Coastguard Worker char *name; 85*6236dae4SAndroid Build Coastguard Worker char *value; 86*6236dae4SAndroid Build Coastguard Worker size_t amount; 87*6236dae4SAndroid Build Coastguard Worker size_t index; 88*6236dae4SAndroid Build Coastguard Worker unsigned int origin; 89*6236dae4SAndroid Build Coastguard Worker void *anchor; 90*6236dae4SAndroid Build Coastguard Worker}; 91*6236dae4SAndroid Build Coastguard Worker~~~ 92*6236dae4SAndroid Build Coastguard Worker 93*6236dae4SAndroid Build Coastguard WorkerThe data **name** field points to, is the same as the requested name, but 94*6236dae4SAndroid Build Coastguard Workermight have a different case. 95*6236dae4SAndroid Build Coastguard Worker 96*6236dae4SAndroid Build Coastguard WorkerThe data **value** field points to, comes exactly as delivered over the 97*6236dae4SAndroid Build Coastguard Workernetwork but with leading and trailing whitespace and newlines stripped 98*6236dae4SAndroid Build Coastguard Workeroff. The `value` data is null-terminated. For legacy HTTP/1 "folded headers", 99*6236dae4SAndroid Build Coastguard Workerthis API provides the full single value in an unfolded manner with a single 100*6236dae4SAndroid Build Coastguard Workerwhitespace between the lines. 101*6236dae4SAndroid Build Coastguard Worker 102*6236dae4SAndroid Build Coastguard Worker**amount** is how many headers using this name that exist, within the origin 103*6236dae4SAndroid Build Coastguard Workerand request scope asked for. 104*6236dae4SAndroid Build Coastguard Worker 105*6236dae4SAndroid Build Coastguard Worker**index** is the zero based entry number of this particular header, which in 106*6236dae4SAndroid Build Coastguard Workercase this header was used more than once in the requested scope can be larger 107*6236dae4SAndroid Build Coastguard Workerthan 0 but is always less than **amount**. 108*6236dae4SAndroid Build Coastguard Worker 109*6236dae4SAndroid Build Coastguard WorkerThe **origin** field in the "curl_header" struct has one of the origin bits 110*6236dae4SAndroid Build Coastguard Workerset, indicating where from the header originates. At the time of this writing, 111*6236dae4SAndroid Build Coastguard Workerthere are 5 bits with defined use. The undocumented 27 remaining bits are 112*6236dae4SAndroid Build Coastguard Workerreserved for future use and must not be assumed to have any particular value. 113*6236dae4SAndroid Build Coastguard Worker 114*6236dae4SAndroid Build Coastguard Worker**anchor** is a private handle used by libcurl internals. Do not modify. 115*6236dae4SAndroid Build Coastguard Worker 116*6236dae4SAndroid Build Coastguard Worker# ORIGINS 117*6236dae4SAndroid Build Coastguard Worker 118*6236dae4SAndroid Build Coastguard Worker## CURLH_HEADER 119*6236dae4SAndroid Build Coastguard Worker 120*6236dae4SAndroid Build Coastguard WorkerThe header arrived as a header from the server. 121*6236dae4SAndroid Build Coastguard Worker 122*6236dae4SAndroid Build Coastguard Worker## CURLH_TRAILER 123*6236dae4SAndroid Build Coastguard Worker 124*6236dae4SAndroid Build Coastguard WorkerThe header arrived as a trailer. A header that arrives after the body. 125*6236dae4SAndroid Build Coastguard Worker 126*6236dae4SAndroid Build Coastguard Worker## CURLH_CONNECT 127*6236dae4SAndroid Build Coastguard Worker 128*6236dae4SAndroid Build Coastguard WorkerThe header arrived in a CONNECT response. A CONNECT request is being done to 129*6236dae4SAndroid Build Coastguard Workersetup a transfer "through" an HTTP(S) proxy. 130*6236dae4SAndroid Build Coastguard Worker 131*6236dae4SAndroid Build Coastguard Worker## CURLH_1XX 132*6236dae4SAndroid Build Coastguard Worker 133*6236dae4SAndroid Build Coastguard WorkerThe header arrived in an HTTP 1xx response. A 1xx response is an "intermediate" 134*6236dae4SAndroid Build Coastguard Workerresponse that might happen before the "real" response. 135*6236dae4SAndroid Build Coastguard Worker 136*6236dae4SAndroid Build Coastguard Worker## CURLH_PSEUDO 137*6236dae4SAndroid Build Coastguard Worker 138*6236dae4SAndroid Build Coastguard WorkerThe header is an HTTP/2 or HTTP/3 pseudo header 139*6236dae4SAndroid Build Coastguard Worker 140*6236dae4SAndroid Build Coastguard Worker# %PROTOCOLS% 141*6236dae4SAndroid Build Coastguard Worker 142*6236dae4SAndroid Build Coastguard Worker# EXAMPLE 143*6236dae4SAndroid Build Coastguard Worker 144*6236dae4SAndroid Build Coastguard Worker~~~c 145*6236dae4SAndroid Build Coastguard Workerint main(void) 146*6236dae4SAndroid Build Coastguard Worker{ 147*6236dae4SAndroid Build Coastguard Worker struct curl_header *type; 148*6236dae4SAndroid Build Coastguard Worker CURL *curl = curl_easy_init(); 149*6236dae4SAndroid Build Coastguard Worker if(curl) { 150*6236dae4SAndroid Build Coastguard Worker CURLHcode h; 151*6236dae4SAndroid Build Coastguard Worker curl_easy_setopt(curl, CURLOPT_URL, "https://example.com"); 152*6236dae4SAndroid Build Coastguard Worker curl_easy_perform(curl); 153*6236dae4SAndroid Build Coastguard Worker h = curl_easy_header(curl, "Content-Type", 0, CURLH_HEADER, -1, &type); 154*6236dae4SAndroid Build Coastguard Worker curl_easy_cleanup(curl); 155*6236dae4SAndroid Build Coastguard Worker } 156*6236dae4SAndroid Build Coastguard Worker} 157*6236dae4SAndroid Build Coastguard Worker~~~ 158*6236dae4SAndroid Build Coastguard Worker 159*6236dae4SAndroid Build Coastguard Worker# %AVAILABILITY% 160*6236dae4SAndroid Build Coastguard Worker 161*6236dae4SAndroid Build Coastguard Worker# RETURN VALUE 162*6236dae4SAndroid Build Coastguard Worker 163*6236dae4SAndroid Build Coastguard WorkerThis function returns a CURLHcode indicating success or error. 164