Mercurial > hgrepos > Python2 > PyMuPDF
comparison mupdf-source/thirdparty/curl/lib/http.h @ 2:b50eed0cc0ef upstream
ADD: MuPDF v1.26.7: the MuPDF source as downloaded by a default build of PyMuPDF 1.26.4.
The directory name has changed: no version number in the expanded directory now.
| author | Franz Glasner <fzglas.hg@dom66.de> |
|---|---|
| date | Mon, 15 Sep 2025 11:43:07 +0200 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 1:1d09e1dec1d9 | 2:b50eed0cc0ef |
|---|---|
| 1 #ifndef HEADER_CURL_HTTP_H | |
| 2 #define HEADER_CURL_HTTP_H | |
| 3 /*************************************************************************** | |
| 4 * _ _ ____ _ | |
| 5 * Project ___| | | | _ \| | | |
| 6 * / __| | | | |_) | | | |
| 7 * | (__| |_| | _ <| |___ | |
| 8 * \___|\___/|_| \_\_____| | |
| 9 * | |
| 10 * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al. | |
| 11 * | |
| 12 * This software is licensed as described in the file COPYING, which | |
| 13 * you should have received as part of this distribution. The terms | |
| 14 * are also available at https://curl.haxx.se/docs/copyright.html. | |
| 15 * | |
| 16 * You may opt to use, copy, modify, merge, publish, distribute and/or sell | |
| 17 * copies of the Software, and permit persons to whom the Software is | |
| 18 * furnished to do so, under the terms of the COPYING file. | |
| 19 * | |
| 20 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | |
| 21 * KIND, either express or implied. | |
| 22 * | |
| 23 ***************************************************************************/ | |
| 24 #include "curl_setup.h" | |
| 25 | |
| 26 #ifndef CURL_DISABLE_HTTP | |
| 27 | |
| 28 #ifdef USE_NGHTTP2 | |
| 29 #include <nghttp2/nghttp2.h> | |
| 30 #endif | |
| 31 | |
| 32 extern const struct Curl_handler Curl_handler_http; | |
| 33 | |
| 34 #ifdef USE_SSL | |
| 35 extern const struct Curl_handler Curl_handler_https; | |
| 36 #endif | |
| 37 | |
| 38 /* Header specific functions */ | |
| 39 bool Curl_compareheader(const char *headerline, /* line to check */ | |
| 40 const char *header, /* header keyword _with_ colon */ | |
| 41 const char *content); /* content string to find */ | |
| 42 | |
| 43 char *Curl_copy_header_value(const char *header); | |
| 44 | |
| 45 char *Curl_checkProxyheaders(const struct connectdata *conn, | |
| 46 const char *thisheader); | |
| 47 /* ------------------------------------------------------------------------- */ | |
| 48 /* | |
| 49 * The add_buffer series of functions are used to build one large memory chunk | |
| 50 * from repeated function invokes. Used so that the entire HTTP request can | |
| 51 * be sent in one go. | |
| 52 */ | |
| 53 struct Curl_send_buffer { | |
| 54 char *buffer; | |
| 55 size_t size_max; | |
| 56 size_t size_used; | |
| 57 }; | |
| 58 typedef struct Curl_send_buffer Curl_send_buffer; | |
| 59 | |
| 60 Curl_send_buffer *Curl_add_buffer_init(void); | |
| 61 void Curl_add_buffer_free(Curl_send_buffer **inp); | |
| 62 CURLcode Curl_add_bufferf(Curl_send_buffer **inp, const char *fmt, ...) | |
| 63 WARN_UNUSED_RESULT; | |
| 64 CURLcode Curl_add_buffer(Curl_send_buffer **inp, const void *inptr, | |
| 65 size_t size) WARN_UNUSED_RESULT; | |
| 66 CURLcode Curl_add_buffer_send(Curl_send_buffer **inp, | |
| 67 struct connectdata *conn, | |
| 68 curl_off_t *bytes_written, | |
| 69 size_t included_body_bytes, | |
| 70 int socketindex); | |
| 71 | |
| 72 CURLcode Curl_add_timecondition(const struct connectdata *conn, | |
| 73 Curl_send_buffer *buf); | |
| 74 CURLcode Curl_add_custom_headers(struct connectdata *conn, | |
| 75 bool is_connect, | |
| 76 Curl_send_buffer *req_buffer); | |
| 77 CURLcode Curl_http_compile_trailers(struct curl_slist *trailers, | |
| 78 Curl_send_buffer **buffer, | |
| 79 struct Curl_easy *handle); | |
| 80 | |
| 81 /* protocol-specific functions set up to be called by the main engine */ | |
| 82 CURLcode Curl_http(struct connectdata *conn, bool *done); | |
| 83 CURLcode Curl_http_done(struct connectdata *, CURLcode, bool premature); | |
| 84 CURLcode Curl_http_connect(struct connectdata *conn, bool *done); | |
| 85 | |
| 86 /* The following functions are defined in http_chunks.c */ | |
| 87 void Curl_httpchunk_init(struct connectdata *conn); | |
| 88 CHUNKcode Curl_httpchunk_read(struct connectdata *conn, char *datap, | |
| 89 ssize_t length, ssize_t *wrote); | |
| 90 | |
| 91 /* These functions are in http.c */ | |
| 92 CURLcode Curl_http_input_auth(struct connectdata *conn, bool proxy, | |
| 93 const char *auth); | |
| 94 CURLcode Curl_http_auth_act(struct connectdata *conn); | |
| 95 | |
| 96 /* If only the PICKNONE bit is set, there has been a round-trip and we | |
| 97 selected to use no auth at all. Ie, we actively select no auth, as opposed | |
| 98 to not having one selected. The other CURLAUTH_* defines are present in the | |
| 99 public curl/curl.h header. */ | |
| 100 #define CURLAUTH_PICKNONE (1<<30) /* don't use auth */ | |
| 101 | |
| 102 /* MAX_INITIAL_POST_SIZE indicates the number of bytes that will make the POST | |
| 103 data get included in the initial data chunk sent to the server. If the | |
| 104 data is larger than this, it will automatically get split up in multiple | |
| 105 system calls. | |
| 106 | |
| 107 This value used to be fairly big (100K), but we must take into account that | |
| 108 if the server rejects the POST due for authentication reasons, this data | |
| 109 will always be unconditionally sent and thus it may not be larger than can | |
| 110 always be afforded to send twice. | |
| 111 | |
| 112 It must not be greater than 64K to work on VMS. | |
| 113 */ | |
| 114 #ifndef MAX_INITIAL_POST_SIZE | |
| 115 #define MAX_INITIAL_POST_SIZE (64*1024) | |
| 116 #endif | |
| 117 | |
| 118 /* EXPECT_100_THRESHOLD is the request body size limit for when libcurl will | |
| 119 * automatically add an "Expect: 100-continue" header in HTTP requests. When | |
| 120 * the size is unknown, it will always add it. | |
| 121 * | |
| 122 */ | |
| 123 #ifndef EXPECT_100_THRESHOLD | |
| 124 #define EXPECT_100_THRESHOLD 1024 | |
| 125 #endif | |
| 126 | |
| 127 #endif /* CURL_DISABLE_HTTP */ | |
| 128 | |
| 129 #ifdef USE_NGHTTP3 | |
| 130 struct h3out; /* see ngtcp2 */ | |
| 131 #endif | |
| 132 | |
| 133 /**************************************************************************** | |
| 134 * HTTP unique setup | |
| 135 ***************************************************************************/ | |
| 136 struct HTTP { | |
| 137 curl_mimepart *sendit; | |
| 138 curl_off_t postsize; /* off_t to handle large file sizes */ | |
| 139 const char *postdata; | |
| 140 | |
| 141 const char *p_pragma; /* Pragma: string */ | |
| 142 const char *p_accept; /* Accept: string */ | |
| 143 | |
| 144 /* For FORM posting */ | |
| 145 curl_mimepart form; | |
| 146 | |
| 147 struct back { | |
| 148 curl_read_callback fread_func; /* backup storage for fread pointer */ | |
| 149 void *fread_in; /* backup storage for fread_in pointer */ | |
| 150 const char *postdata; | |
| 151 curl_off_t postsize; | |
| 152 } backup; | |
| 153 | |
| 154 enum { | |
| 155 HTTPSEND_NADA, /* init */ | |
| 156 HTTPSEND_REQUEST, /* sending a request */ | |
| 157 HTTPSEND_BODY, /* sending body */ | |
| 158 HTTPSEND_LAST /* never use this */ | |
| 159 } sending; | |
| 160 | |
| 161 #ifndef CURL_DISABLE_HTTP | |
| 162 Curl_send_buffer *send_buffer; /* used if the request couldn't be sent in | |
| 163 one chunk, points to an allocated | |
| 164 send_buffer struct */ | |
| 165 #endif | |
| 166 #ifdef USE_NGHTTP2 | |
| 167 /*********** for HTTP/2 we store stream-local data here *************/ | |
| 168 int32_t stream_id; /* stream we are interested in */ | |
| 169 | |
| 170 bool bodystarted; | |
| 171 /* We store non-final and final response headers here, per-stream */ | |
| 172 Curl_send_buffer *header_recvbuf; | |
| 173 size_t nread_header_recvbuf; /* number of bytes in header_recvbuf fed into | |
| 174 upper layer */ | |
| 175 Curl_send_buffer *trailer_recvbuf; | |
| 176 int status_code; /* HTTP status code */ | |
| 177 const uint8_t *pausedata; /* pointer to data received in on_data_chunk */ | |
| 178 size_t pauselen; /* the number of bytes left in data */ | |
| 179 bool close_handled; /* TRUE if stream closure is handled by libcurl */ | |
| 180 | |
| 181 char **push_headers; /* allocated array */ | |
| 182 size_t push_headers_used; /* number of entries filled in */ | |
| 183 size_t push_headers_alloc; /* number of entries allocated */ | |
| 184 #endif | |
| 185 #if defined(USE_NGHTTP2) || defined(USE_NGHTTP3) | |
| 186 bool closed; /* TRUE on HTTP2 stream close */ | |
| 187 char *mem; /* points to a buffer in memory to store received data */ | |
| 188 size_t len; /* size of the buffer 'mem' points to */ | |
| 189 size_t memlen; /* size of data copied to mem */ | |
| 190 #endif | |
| 191 #if defined(USE_NGHTTP2) || defined(ENABLE_QUIC) | |
| 192 /* fields used by both HTTP/2 and HTTP/3 */ | |
| 193 const uint8_t *upload_mem; /* points to a buffer to read from */ | |
| 194 size_t upload_len; /* size of the buffer 'upload_mem' points to */ | |
| 195 curl_off_t upload_left; /* number of bytes left to upload */ | |
| 196 #endif | |
| 197 | |
| 198 #ifdef ENABLE_QUIC | |
| 199 /*********** for HTTP/3 we store stream-local data here *************/ | |
| 200 int64_t stream3_id; /* stream we are interested in */ | |
| 201 bool firstbody; /* FALSE until body arrives */ | |
| 202 bool h3req; /* FALSE until request is issued */ | |
| 203 bool upload_done; | |
| 204 #endif | |
| 205 #ifdef USE_NGHTTP3 | |
| 206 struct h3out *h3out; /* per-stream buffers for upload */ | |
| 207 #endif | |
| 208 }; | |
| 209 | |
| 210 #ifdef USE_NGHTTP2 | |
| 211 /* h2 settings for this connection */ | |
| 212 struct h2settings { | |
| 213 uint32_t max_concurrent_streams; | |
| 214 bool enable_push; | |
| 215 }; | |
| 216 #endif | |
| 217 | |
| 218 struct http_conn { | |
| 219 #ifdef USE_NGHTTP2 | |
| 220 #define H2_BINSETTINGS_LEN 80 | |
| 221 nghttp2_session *h2; | |
| 222 uint8_t binsettings[H2_BINSETTINGS_LEN]; | |
| 223 size_t binlen; /* length of the binsettings data */ | |
| 224 Curl_send *send_underlying; /* underlying send Curl_send callback */ | |
| 225 Curl_recv *recv_underlying; /* underlying recv Curl_recv callback */ | |
| 226 char *inbuf; /* buffer to receive data from underlying socket */ | |
| 227 size_t inbuflen; /* number of bytes filled in inbuf */ | |
| 228 size_t nread_inbuf; /* number of bytes read from in inbuf */ | |
| 229 /* We need separate buffer for transmission and reception because we | |
| 230 may call nghttp2_session_send() after the | |
| 231 nghttp2_session_mem_recv() but mem buffer is still not full. In | |
| 232 this case, we wrongly sends the content of mem buffer if we share | |
| 233 them for both cases. */ | |
| 234 int32_t pause_stream_id; /* stream ID which paused | |
| 235 nghttp2_session_mem_recv */ | |
| 236 size_t drain_total; /* sum of all stream's UrlState.drain */ | |
| 237 | |
| 238 /* this is a hash of all individual streams (Curl_easy structs) */ | |
| 239 struct h2settings settings; | |
| 240 | |
| 241 /* list of settings that will be sent */ | |
| 242 nghttp2_settings_entry local_settings[3]; | |
| 243 size_t local_settings_num; | |
| 244 uint32_t error_code; /* HTTP/2 error code */ | |
| 245 #else | |
| 246 int unused; /* prevent a compiler warning */ | |
| 247 #endif | |
| 248 }; | |
| 249 | |
| 250 CURLcode Curl_http_readwrite_headers(struct Curl_easy *data, | |
| 251 struct connectdata *conn, | |
| 252 ssize_t *nread, | |
| 253 bool *stop_reading); | |
| 254 | |
| 255 /** | |
| 256 * Curl_http_output_auth() setups the authentication headers for the | |
| 257 * host/proxy and the correct authentication | |
| 258 * method. conn->data->state.authdone is set to TRUE when authentication is | |
| 259 * done. | |
| 260 * | |
| 261 * @param conn all information about the current connection | |
| 262 * @param request pointer to the request keyword | |
| 263 * @param path pointer to the requested path | |
| 264 * @param proxytunnel boolean if this is the request setting up a "proxy | |
| 265 * tunnel" | |
| 266 * | |
| 267 * @returns CURLcode | |
| 268 */ | |
| 269 CURLcode | |
| 270 Curl_http_output_auth(struct connectdata *conn, | |
| 271 const char *request, | |
| 272 const char *path, | |
| 273 bool proxytunnel); /* TRUE if this is the request setting | |
| 274 up the proxy tunnel */ | |
| 275 | |
| 276 #endif /* HEADER_CURL_HTTP_H */ |
