Annotation of embedaddon/curl/lib/http.h, revision 1.1.1.1
1.1 misho 1: #ifndef HEADER_CURL_HTTP_H
2: #define HEADER_CURL_HTTP_H
3: /***************************************************************************
4: * _ _ ____ _
5: * Project ___| | | | _ \| |
6: * / __| | | | |_) | |
7: * | (__| |_| | _ <| |___
8: * \___|\___/|_| \_\_____|
9: *
10: * Copyright (C) 1998 - 2020, 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: /* These functions are in http.c */
87: CURLcode Curl_http_input_auth(struct connectdata *conn, bool proxy,
88: const char *auth);
89: CURLcode Curl_http_auth_act(struct connectdata *conn);
90:
91: /* If only the PICKNONE bit is set, there has been a round-trip and we
92: selected to use no auth at all. Ie, we actively select no auth, as opposed
93: to not having one selected. The other CURLAUTH_* defines are present in the
94: public curl/curl.h header. */
95: #define CURLAUTH_PICKNONE (1<<30) /* don't use auth */
96:
97: /* MAX_INITIAL_POST_SIZE indicates the number of bytes that will make the POST
98: data get included in the initial data chunk sent to the server. If the
99: data is larger than this, it will automatically get split up in multiple
100: system calls.
101:
102: This value used to be fairly big (100K), but we must take into account that
103: if the server rejects the POST due for authentication reasons, this data
104: will always be unconditionally sent and thus it may not be larger than can
105: always be afforded to send twice.
106:
107: It must not be greater than 64K to work on VMS.
108: */
109: #ifndef MAX_INITIAL_POST_SIZE
110: #define MAX_INITIAL_POST_SIZE (64*1024)
111: #endif
112:
113: /* EXPECT_100_THRESHOLD is the request body size limit for when libcurl will
114: * automatically add an "Expect: 100-continue" header in HTTP requests. When
115: * the size is unknown, it will always add it.
116: *
117: */
118: #ifndef EXPECT_100_THRESHOLD
119: #define EXPECT_100_THRESHOLD (1024*1024)
120: #endif
121:
122: #endif /* CURL_DISABLE_HTTP */
123:
124: #ifdef USE_NGHTTP3
125: struct h3out; /* see ngtcp2 */
126: #endif
127:
128: /****************************************************************************
129: * HTTP unique setup
130: ***************************************************************************/
131: struct HTTP {
132: curl_mimepart *sendit;
133: curl_off_t postsize; /* off_t to handle large file sizes */
134: const char *postdata;
135:
136: const char *p_pragma; /* Pragma: string */
137: const char *p_accept; /* Accept: string */
138:
139: /* For FORM posting */
140: curl_mimepart form;
141:
142: struct back {
143: curl_read_callback fread_func; /* backup storage for fread pointer */
144: void *fread_in; /* backup storage for fread_in pointer */
145: const char *postdata;
146: curl_off_t postsize;
147: } backup;
148:
149: enum {
150: HTTPSEND_NADA, /* init */
151: HTTPSEND_REQUEST, /* sending a request */
152: HTTPSEND_BODY, /* sending body */
153: HTTPSEND_LAST /* never use this */
154: } sending;
155:
156: #ifndef CURL_DISABLE_HTTP
157: Curl_send_buffer *send_buffer; /* used if the request couldn't be sent in
158: one chunk, points to an allocated
159: send_buffer struct */
160: #endif
161: #ifdef USE_NGHTTP2
162: /*********** for HTTP/2 we store stream-local data here *************/
163: int32_t stream_id; /* stream we are interested in */
164:
165: bool bodystarted;
166: /* We store non-final and final response headers here, per-stream */
167: Curl_send_buffer *header_recvbuf;
168: size_t nread_header_recvbuf; /* number of bytes in header_recvbuf fed into
169: upper layer */
170: Curl_send_buffer *trailer_recvbuf;
171: int status_code; /* HTTP status code */
172: const uint8_t *pausedata; /* pointer to data received in on_data_chunk */
173: size_t pauselen; /* the number of bytes left in data */
174: bool close_handled; /* TRUE if stream closure is handled by libcurl */
175:
176: char **push_headers; /* allocated array */
177: size_t push_headers_used; /* number of entries filled in */
178: size_t push_headers_alloc; /* number of entries allocated */
179: #endif
180: #if defined(USE_NGHTTP2) || defined(USE_NGHTTP3)
181: bool closed; /* TRUE on HTTP2 stream close */
182: char *mem; /* points to a buffer in memory to store received data */
183: size_t len; /* size of the buffer 'mem' points to */
184: size_t memlen; /* size of data copied to mem */
185: #endif
186: #if defined(USE_NGHTTP2) || defined(ENABLE_QUIC)
187: /* fields used by both HTTP/2 and HTTP/3 */
188: const uint8_t *upload_mem; /* points to a buffer to read from */
189: size_t upload_len; /* size of the buffer 'upload_mem' points to */
190: curl_off_t upload_left; /* number of bytes left to upload */
191: #endif
192:
193: #ifdef ENABLE_QUIC
194: /*********** for HTTP/3 we store stream-local data here *************/
195: int64_t stream3_id; /* stream we are interested in */
196: bool firstheader; /* FALSE until headers arrive */
197: bool firstbody; /* FALSE until body arrives */
198: bool h3req; /* FALSE until request is issued */
199: bool upload_done;
200: #endif
201: #ifdef USE_NGHTTP3
202: size_t unacked_window;
203: struct h3out *h3out; /* per-stream buffers for upload */
204: char *overflow_buf; /* excess data received during a single Curl_read */
205: size_t overflow_buflen; /* amount of data currently in overflow_buf */
206: size_t overflow_bufsize; /* size of the overflow_buf allocation */
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 */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>