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