f74fcb35cea0844d19577e88b999f1d087d2723b
[openssl.git] / doc / man3 / OSSL_HTTP_REQ_CTX.pod
1 =pod
2
3 =head1 NAME
4
5 OSSL_HTTP_REQ_CTX,
6 OSSL_HTTP_REQ_CTX_new,
7 OSSL_HTTP_REQ_CTX_free,
8 OSSL_HTTP_REQ_CTX_set_request_line,
9 OSSL_HTTP_REQ_CTX_add1_header,
10 OSSL_HTTP_REQ_CTX_set_expected,
11 OSSL_HTTP_REQ_CTX_set1_req,
12 OSSL_HTTP_REQ_CTX_nbio,
13 OSSL_HTTP_REQ_CTX_nbio_d2i,
14 OSSL_HTTP_REQ_CTX_exchange,
15 OSSL_HTTP_REQ_CTX_get0_mem_bio,
16 OSSL_HTTP_REQ_CTX_get_resp_len,
17 OSSL_HTTP_REQ_CTX_set_max_response_length,
18 OSSL_HTTP_is_alive
19 - HTTP client low-level functions
20
21 =head1 SYNOPSIS
22
23  #include <openssl/http.h>
24
25  typedef struct ossl_http_req_ctx_st OSSL_HTTP_REQ_CTX;
26
27  OSSL_HTTP_REQ_CTX *OSSL_HTTP_REQ_CTX_new(BIO *wbio, BIO *rbio, int buf_size);
28  void OSSL_HTTP_REQ_CTX_free(OSSL_HTTP_REQ_CTX *rctx);
29
30  int OSSL_HTTP_REQ_CTX_set_request_line(OSSL_HTTP_REQ_CTX *rctx, int method_POST,
31                                         const char *server, const char *port,
32                                         const char *path);
33  int OSSL_HTTP_REQ_CTX_add1_header(OSSL_HTTP_REQ_CTX *rctx,
34                                    const char *name, const char *value);
35
36  int OSSL_HTTP_REQ_CTX_set_expected(OSSL_HTTP_REQ_CTX *rctx,
37                                     const char *content_type, int asn1,
38                                     int timeout, int keep_alive);
39  int OSSL_HTTP_REQ_CTX_set1_req(OSSL_HTTP_REQ_CTX *rctx, const char *content_type,
40                                 const ASN1_ITEM *it, const ASN1_VALUE *req);
41  int OSSL_HTTP_REQ_CTX_nbio(OSSL_HTTP_REQ_CTX *rctx);
42  int OSSL_HTTP_REQ_CTX_nbio_d2i(OSSL_HTTP_REQ_CTX *rctx,
43                                 ASN1_VALUE **pval, const ASN1_ITEM *it);
44  BIO *OSSL_HTTP_REQ_CTX_exchange(OSSL_HTTP_REQ_CTX *rctx);
45
46  BIO *OSSL_HTTP_REQ_CTX_get0_mem_bio(const OSSL_HTTP_REQ_CTX *rctx);
47  size_t OSSL_HTTP_REQ_CTX_get_resp_len(const OSSL_HTTP_REQ_CTX *rctx);
48  void OSSL_HTTP_REQ_CTX_set_max_response_length(OSSL_HTTP_REQ_CTX *rctx,
49                                                 unsigned long len);
50
51  int OSSL_HTTP_is_alive(const OSSL_HTTP_REQ_CTX *rctx);
52
53 =head1 DESCRIPTION
54
55 B<OSSL_HTTP_REQ_CTX> is a context structure for an HTTP request and response,
56 used to collect all the necessary data to perform that request.
57
58 This file documents low-level HTTP functions rarely used directly.  High-level
59 HTTP client functions like L<OSSL_HTTP_get(3)> and L<OSSL_HTTP_transfer(3)>
60 should be preferred.
61
62 OSSL_HTTP_REQ_CTX_new() allocates a new HTTP request context structure,
63 which gets populated with the B<BIO> to write/send the request to (I<wbio>),
64 the B<BIO> to read/receive the response from (I<rbio>, which may be equal to
65 I<wbio>), and the maximum expected response header line length I<buf_size>.
66 A value <= 0 indicates that
67 the B<OSSL_HTTP_DEFAULT_MAX_LINE_LEN> of 4KiB should be used.
68 I<buf_size> is also used as the number of content bytes that are read at a time.
69 The allocated context structure includes an internal memory B<BIO>,
70 which collects the HTTP request header lines.
71
72 OSSL_HTTP_REQ_CTX_free() frees up the HTTP request context I<rctx>.
73 The I<rbio> is not free'd, I<wbio> will be free'd if I<free_wbio> is set.
74
75 OSSL_HTTP_REQ_CTX_set_request_line() adds the 1st HTTP request line to I<rctx>.
76 The HTTP method is determined by I<method_POST>,
77 which should be 1 to indicate C<POST> or 0 to indicate C<GET>.
78 I<server> and I<port> may be set to give the server and the optional port that
79 an HTTP proxy shall forward the request to, otherwise they must be left NULL.
80 I<path> provides the HTTP request path; if left NULL, C</> is used.
81 For backward compatibility, I<path> may begin with C<http://> and thus convey
82 an absoluteURI. In this case it indicates HTTP proxy use and provides also the
83 server (and optionally the port) that the proxy shall forward the request to.
84 In this case the I<server> and I<port> arguments must be NULL.
85
86 OSSL_HTTP_REQ_CTX_add1_header() adds header I<name> with value I<value> to the
87 context I<rctx>. It can be called more than once to add multiple header lines.
88 For example, to add a C<Host> header for C<example.com> you would call:
89
90  OSSL_HTTP_REQ_CTX_add1_header(ctx, "Host", "example.com");
91
92 OSSL_HTTP_REQ_CTX_set_expected() optionally sets in I<rctx> some expectations
93 of the HTTP client on the response.
94 Due to the structure of an HTTP request, if the I<keep_alive> argument is
95 nonzero the function must be used before calling OSSL_HTTP_REQ_CTX_set1_req().
96
97 If the I<content_type> argument is not NULL,
98 the client will check that the specified content-type string
99 is included in the HTTP header of the response and return an error if not.
100 In the content-type header line the specified string should be present either
101 as a whole, or in case the specified string does not include a C<;> character,
102 it is sufficient that the specified string appears as a prefix
103 in the header line, followed by a C<;> character and any further text.
104 For instance, if the I<content_type> argument specifies C<text/html>,
105 this is matched by C<text/html>, C<text/html; charset=UTF-8>, etc.
106
107 If the I<asn1> parameter is nonzero a structure in ASN.1 encoding will be
108 expected as the response content and input streaming is disabled.  This means
109 that an ASN.1 sequence header is required, its length field is checked, and
110 OSSL_HTTP_REQ_CTX_get0_mem_bio() should be used to get the buffered response.
111 Otherwise (by default) any input format is allowed without length checks.
112 In this case the BIO given as I<rbio> argument to OSSL_HTTP_REQ_CTX_new() should
113 be used directly to read the response contents, which may support streaming.
114 If the I<timeout> parameter is > 0 this indicates the maximum number of seconds
115 the subsequent HTTP transfer (sending the request and receiving a response)
116 is allowed to take.
117 I<timeout> == 0 enables waiting indefinitely, i.e., no timeout can occur.
118 This is the default.
119 I<timeout> < 0 takes over any value set via the I<overall_timeout> argument of
120 L<OSSL_HTTP_open(3)> with the default being 0, which means no timeout.
121 If the I<keep_alive> parameter is 0, which is the default, the connection is not
122 kept open after receiving a response. This is the default behavior for HTTP 1.0.
123 If the value is 1 or 2 then a persistent connection is requested.
124 If the value is 2 then a persistent connection is required,
125 i.e., an error occurs in case the server does not grant it.
126
127 OSSL_HTTP_REQ_CTX_set1_req() finalizes the HTTP request context.
128 It is needed if the I<method_POST> parameter in the
129 OSSL_HTTP_REQ_CTX_set_request_line() call was 1
130 and an ASN.1-encoded request should be sent.
131 It must also be used when requesting "keep-alive",
132 even if a GET request is going to be sent, in which case I<req> must be NULL.
133 Unless I<req> is NULL, the function adds the DER encoding of I<req> using
134 the ASN.1 template I<it> to do the encoding (which does not support streaming).
135 The HTTP header C<Content-Length> is filled out with the length of the request.
136 I<content_type> must be NULL if I<req> is NULL.
137 If I<content_type> isn't NULL,
138 the HTTP header C<Content-Type> is also added with the given string value.
139 The header lines are added to the internal memory B<BIO> for the request header.
140
141 OSSL_HTTP_REQ_CTX_nbio() attempts to send the request prepared in I<rctx>
142 and to gather the response via HTTP, using the I<wbio> and I<rbio>
143 that were given when calling OSSL_HTTP_REQ_CTX_new().
144 The function may need to be called again if its result is -1, which indicates
145 L<BIO_should_retry(3)>.  In such a case it is advisable to sleep a little in
146 between, using L<BIO_wait(3)> on the read BIO to prevent a busy loop.
147
148 OSSL_HTTP_REQ_CTX_nbio_d2i() is like OSSL_HTTP_REQ_CTX_nbio() but on success
149 in addition parses the response, which must be a DER-encoded ASN.1 structure,
150 using the ASN.1 template I<it> and places the result in I<*pval>.
151
152 OSSL_HTTP_REQ_CTX_exchange() calls OSSL_HTTP_REQ_CTX_nbio() as often as needed
153 in order to exchange a request and response or until a timeout is reached.
154 On success it returns a pointer to the BIO that can be used to read the result.
155 If an ASN.1-encoded response was expected, this is the BIO
156 returned by OSSL_HTTP_REQ_CTX_get0_mem_bio() when called after the exchange.
157 This memory BIO does not support streaming.
158 Otherwise the returned BIO is the I<rbio> given to OSSL_HTTP_REQ_CTX_new(),
159 which may support streaming.
160 When this BIO is returned, it has been read past the end of the response header,
161 such that the actual response body can be read from it.
162 The returned BIO pointer MUST NOT be freed by the caller.
163
164 OSSL_HTTP_REQ_CTX_get0_mem_bio() returns the internal memory B<BIO>.
165 Before the HTTP request is sent, this could be used to adapt its header lines.
166 I<Use with caution!>
167 After receiving a response via HTTP, the BIO represents the current state of
168 reading the response header. If the response was expected to be ASN.1 encoded,
169 its contents can be read via this BIO, which does not support streaming.
170 The returned BIO pointer must not be freed by the caller.
171
172 OSSL_HTTP_REQ_CTX_get_resp_len() returns the size of the response contents
173 in I<rctx> if provided by the server as <Content-Length> header field, else 0.
174
175 OSSL_HTTP_REQ_CTX_set_max_response_length() sets the maximum allowed
176 response content length for I<rctx> to I<len>. If not set or I<len> is 0
177 then the B<OSSL_HTTP_DEFAULT_MAX_RESP_LEN> is used, which currently is 100 KiB.
178 If the C<Content-Length> header is present and exceeds this value or
179 the content is an ASN.1 encoded structure with a length exceeding this value
180 or both length indications are present but disagree then an error occurs.
181
182 OSSL_HTTP_is_alive() can be used to query if the HTTP connection
183 given by I<rctx> is still alive, i.e., has not been closed.
184 It returns 0 if I<rctx> is NULL.
185
186 If the client application requested or required a persistent connection
187 and this was granted by the server, it can keep I<rctx> as long as it wants
188 to send further requests and OSSL_HTTP_is_alive() returns nonzero,
189 else it should call I<OSSL_HTTP_REQ_CTX_free(rctx)> or L<OSSL_HTTP_close(3)>.
190 In case the client application keeps I<rctx> but the connection then dies
191 for any reason at the server side, it will notice this obtaining an
192 I/O error when trying to send the next request via I<rctx>.
193
194 =head1 WARNINGS
195
196 The server's response may be unexpected if the hostname that was used to
197 create the I<wbio>, any C<Host> header, and the host specified in the
198 request URL do not match.
199
200 Many of these functions must be called in a certain order.
201
202 First, the HTTP request context must be allocated:
203 OSSL_HTTP_REQ_CTX_new().
204
205 Then, the HTTP request must be prepared with request data:
206
207 =over 4
208
209 =item 1.
210
211 Calling OSSL_HTTP_REQ_CTX_set_request_line().
212
213 =item 2.
214
215 Adding extra header lines with OSSL_HTTP_REQ_CTX_add1_header().
216 This is optional and may be done multiple times with different names.
217
218 =item 3.
219
220 Finalize the request using OSSL_HTTP_REQ_CTX_set1_req().
221 This may be omitted if the GET method is used and "keep-alive" is not requested.
222
223 =back
224
225 When the request context is fully prepared, the HTTP exchange may be performed
226 with OSSL_HTTP_REQ_CTX_nbio() or OSSL_HTTP_REQ_CTX_exchange().
227
228 =head1 NOTES
229
230 When built with tracing enabled, OSSL_HTTP_REQ_CTX_nbio() and all functions
231 using it, such as OSSL_HTTP_REQ_CTX_exchange() and L<OSSL_HTTP_transfer(3)>,
232 may be traced using B<OSSL_TRACE_CATEGORY_HTTP>.
233 See also L<OSSL_trace_enabled(3)> and L<openssl(1)/ENVIRONMENT>.
234
235 =head1 RETURN VALUES
236
237 OSSL_HTTP_REQ_CTX_new() returns a pointer to a B<OSSL_HTTP_REQ_CTX>, or NULL
238 on error.
239
240 OSSL_HTTP_REQ_CTX_free() and OSSL_HTTP_REQ_CTX_set_max_response_length()
241 do not return values.
242
243 OSSL_HTTP_REQ_CTX_set_request_line(), OSSL_HTTP_REQ_CTX_add1_header(),
244 OSSL_HTTP_REQ_CTX_set1_req(), and OSSL_HTTP_REQ_CTX_set_expected()
245 return 1 for success and 0 for failure.
246
247 OSSL_HTTP_REQ_CTX_nbio() and OSSL_HTTP_REQ_CTX_nbio_d2i()
248 return 1 for success, 0 on error or redirection, -1 if retry is needed.
249
250 OSSL_HTTP_REQ_CTX_exchange() and OSSL_HTTP_REQ_CTX_get0_mem_bio()
251 return a pointer to a B<BIO> on success as described above or NULL on failure.
252 The returned BIO must not be freed by the caller.
253
254 OSSL_HTTP_REQ_CTX_get_resp_len() returns the size of the response contents
255 or 0 if not available or an error occurred.
256
257 OSSL_HTTP_is_alive() returns 1 if its argument is non-NULL
258 and the client requested a persistent connection
259 and the server did not disagree on keeping the connection open, else 0.
260
261 =head1 SEE ALSO
262
263 L<BIO_should_retry(3)>,
264 L<BIO_wait(3)>,
265 L<ASN1_item_d2i_bio(3)>,
266 L<ASN1_item_i2d_mem_bio(3)>,
267 L<OSSL_HTTP_open(3)>,
268 L<OSSL_HTTP_get(3)>,
269 L<OSSL_HTTP_transfer(3)>,
270 L<OSSL_HTTP_close(3)>,
271 L<OSSL_trace_enabled(3)>
272
273 =head1 HISTORY
274
275 The functions described here were added in OpenSSL 3.0.
276
277 =head1 COPYRIGHT
278
279 Copyright 2015-2023 The OpenSSL Project Authors. All Rights Reserved.
280
281 Licensed under the Apache License 2.0 (the "License").  You may not use
282 this file except in compliance with the License.  You can obtain a copy
283 in the file LICENSE in the source distribution or at
284 L<https://www.openssl.org/source/license.html>.
285
286 =cut