]> git.ipfire.org Git - thirdparty/openssl.git/blame - doc/man3/OSSL_HTTP_transfer.pod
HTTP client: Allow streaming of request data (for POST method)
[thirdparty/openssl.git] / doc / man3 / OSSL_HTTP_transfer.pod
CommitLineData
29f178bd
DDO
1=pod
2
3=head1 NAME
4
8f965908
DDO
5OSSL_HTTP_open,
6OSSL_HTTP_bio_cb_t,
7OSSL_HTTP_proxy_connect,
8OSSL_HTTP_set_request,
9OSSL_HTTP_exchange,
29f178bd 10OSSL_HTTP_get,
29f178bd 11OSSL_HTTP_transfer,
8f965908
DDO
12OSSL_HTTP_close
13- HTTP client high-level functions
29f178bd
DDO
14
15=head1 SYNOPSIS
16
17 #include <openssl/http.h>
18
19 typedef BIO *(*OSSL_HTTP_bio_cb_t)(BIO *bio, void *arg,
20 int connect, int detail);
8f965908
DDO
21 OSSL_HTTP_REQ_CTX *OSSL_HTTP_open(const char *server, const char *port,
22 const char *proxy, const char *no_proxy,
23 int use_ssl, BIO *bio, BIO *rbio,
24 OSSL_HTTP_bio_cb_t bio_update_fn, void *arg,
25 int buf_size, int overall_timeout);
26 int OSSL_HTTP_proxy_connect(BIO *bio, const char *server, const char *port,
27 const char *proxyuser, const char *proxypass,
28 int timeout, BIO *bio_err, const char *prog);
29 int OSSL_HTTP_set_request(OSSL_HTTP_REQ_CTX *rctx, const char *path,
30 const STACK_OF(CONF_VALUE) *headers,
31 const char *content_type, BIO *req,
32 const char *expected_content_type, int expect_asn1,
82990287 33 int timeout, int keep_alive);
8f965908 34 BIO *OSSL_HTTP_exchange(OSSL_HTTP_REQ_CTX *rctx, char **redirection_url);
afe554c2 35 BIO *OSSL_HTTP_get(const char *url, const char *proxy, const char *no_proxy,
29f178bd
DDO
36 BIO *bio, BIO *rbio,
37 OSSL_HTTP_bio_cb_t bio_update_fn, void *arg,
8f965908
DDO
38 int buf_size, const STACK_OF(CONF_VALUE) *headers,
39 const char *expected_content_type, int expect_asn1,
40 size_t max_resp_len, int timeout);
41 BIO *OSSL_HTTP_transfer(OSSL_HTTP_REQ_CTX **prctx,
42 const char *server, const char *port,
43 const char *path, int use_ssl,
44 const char *proxy, const char *no_proxy,
29f178bd
DDO
45 BIO *bio, BIO *rbio,
46 OSSL_HTTP_bio_cb_t bio_update_fn, void *arg,
8f965908
DDO
47 int buf_size, const STACK_OF(CONF_VALUE) *headers,
48 const char *content_type, BIO *req,
49 const char *expected_content_type, int expect_asn1,
50 size_t max_resp_len, int timeout, int keep_alive);
51 int OSSL_HTTP_close(OSSL_HTTP_REQ_CTX *rctx, int ok);
29f178bd
DDO
52
53=head1 DESCRIPTION
54
82990287
DDO
55OSSL_HTTP_open() initiates an HTTP session using the I<bio> argument if not
56NULL, else by connecting to a given I<server> optionally via a I<proxy>.
29f178bd 57
8f965908
DDO
58Typically the OpenSSL build supports sockets and the I<bio> parameter is NULL.
59In this case I<rbio> must be NULL as well, and the
60library creates a network BIO internally for connecting to the given I<server>
61at the specified I<port> if any, defaulting to 80 for HTTP or 443 for HTTPS.
62Then this internal BIO is used for setting up a connection
63and for exchanging one or more request and response.
64If I<bio> is given and I<rbio> is NULL then this I<bio> is used instead.
d7fcee3b 65If both I<bio> and I<rbio> are given (which may be memory BIOs for instance)
8f965908
DDO
66then no explicit connection is set up, but
67I<bio> is used for writing requests and I<rbio> for reading responses.
d7fcee3b
DDO
68As soon as the client has flushed I<bio> the server must be ready to provide
69a response or indicate a waiting condition via I<rbio>.
29f178bd 70
79a2bccd 71If I<bio> is NULL the optional I<proxy> parameter can be used to set an
4b1fe471 72HTTP(S) proxy to use (unless overridden by "no_proxy" settings).
d7fcee3b
DDO
73If TLS is not used this defaults to the environment variable C<http_proxy>
74if set, else C<HTTP_PROXY>.
75If I<use_ssl> != 0 it defaults to C<https_proxy> if set, else C<HTTPS_PROXY>.
79a2bccd
DDO
76An empty proxy string C<""> forbids using a proxy.
77Else the format is
78C<[http[s]://][userinfo@]host[:port][/path][?query][#fragment]>,
79where any userinfo, path, query, and fragment given is ignored.
4b1fe471 80The default proxy port number is 80, or 443 in case "https:" is given.
d7fcee3b
DDO
81The HTTP client functions connect via the given proxy unless the I<server>
82is found in the optional list I<no_proxy> of proxy hostnames (if not NULL;
83default is the environment variable C<no_proxy> if set, else C<NO_PROXY>).
4b1fe471
DDO
84Proxying plain HTTP is supported directly,
85while using a proxy for HTTPS connections requires a suitable callback function
d7fcee3b 86such as OSSL_HTTP_proxy_connect(), described below.
4b1fe471 87
8f965908
DDO
88If I<use_ssl> is nonzero a TLS connection is requested
89and the I<bio_update_fn> parameter must be provided.
29f178bd 90
8f965908
DDO
91The parameter I<bio_update_fn>, which is optional if I<use_ssl> is 0,
92may be used to modify the connection BIO used by the HTTP client,
93but cannot be used when both I<bio> and I<rbio> are given.
d7fcee3b 94I<bio_update_fn> is a BIO connect/disconnect callback function with prototype
29f178bd
DDO
95
96 BIO *(*OSSL_HTTP_bio_cb_t)(BIO *bio, void *arg, int connect, int detail)
97
d7fcee3b
DDO
98The callback may modify the HTTP BIO provided in the I<bio> argument,
99whereby it may make use of a custom defined argument I<arg>,
29f178bd 100which may for instance refer to an I<SSL_CTX> structure.
e98c7350 101During connection establishment, just after calling BIO_do_connect_retry(),
d7fcee3b 102the function is invoked with the I<connect> argument being 1 and the I<detail>
8f965908 103argument being 1 if HTTPS is requested, i.e., SSL/TLS should be enabled, else 0.
d7fcee3b 104On disconnect I<connect> is 0 and I<detail> is 1 if no error occurred, else 0.
29f178bd
DDO
105For instance, on connect the function may prepend a TLS BIO to implement HTTPS;
106after disconnect it may do some diagnostic output and/or specific cleanup.
107The function should return NULL to indicate failure.
108Here is a simple example that supports TLS connections (but not via a proxy):
109
110 BIO *http_tls_cb(BIO *hbio, void *arg, int connect, int detail)
111 {
29f178bd 112 if (connect && detail) { /* connecting with TLS */
8f965908 113 SSL_CTX *ctx = (SSL_CTX *)arg;
29f178bd 114 BIO *sbio = BIO_new_ssl(ctx, 1);
8f965908 115
29f178bd
DDO
116 hbio = sbio != NULL ? BIO_push(sbio, hbio) : NULL;
117 } else if (!connect && !detail) { /* disconnecting after error */
118 /* optionally add diagnostics here */
119 }
120 return hbio;
121 }
122
123After disconnect the modified BIO will be deallocated using BIO_free_all().
124
8f965908
DDO
125The I<buf_size> parameter specifies the response header maximum line length.
126A value <= 0 indicates that
127the B<HTTP_DEFAULT_MAX_LINE_LENGTH> of 4KiB should be used.
19f97fe6
DDO
128This length is also used as the number of content bytes that are read at a time.
129The I<max_resp_len> specifies the maximum allowed response content length.
130The value 0 indicates B<HTTP_DEFAULT_MAX_RESP_LEN>, which currently is 100 KiB.
8f965908
DDO
131
132If the I<overall_timeout> parameter is > 0 this indicates the maximum number of
133seconds the overall HTTP transfer (i.e., connection setup if needed,
134sending requests, and receiving responses) is allowed to take until completion.
135A value <= 0 enables waiting indefinitely, i.e., no timeout.
136
29f178bd 137OSSL_HTTP_proxy_connect() may be used by an above BIO connect callback function
4b1fe471 138to set up an SSL/TLS connection via an HTTPS proxy.
d7fcee3b 139It promotes the given BIO I<bio> representing a connection
29f178bd 140pre-established with a TLS proxy using the HTTP CONNECT method,
d7fcee3b
DDO
141optionally using proxy client credentials I<proxyuser> and I<proxypass>,
142to connect with TLS protection ultimately to I<server> and I<port>.
143If the I<port> argument is NULL or the empty string it defaults to "443".
8f965908
DDO
144If the I<timeout> parameter is > 0 this indicates the maximum number of
145seconds the connection setup is allowed to take.
146A value <= 0 enables waiting indefinitely, i.e., no timeout.
bb361a27 147Since this function is typically called by applications such as
d7fcee3b 148L<openssl-s_client(1)> it uses the I<bio_err> and I<prog> parameters (unless
29f178bd
DDO
149NULL) to print additional diagnostic information in a user-oriented way.
150
8f965908
DDO
151OSSL_HTTP_set_request() sets up in I<rctx> the request header and content data
152and expectations on the response using the following parameters.
153If I<path> is NULL it defaults to "/".
82990287
DDO
154If I<req> is NULL the HTTP GET method will be used to send the request
155else HTTP POST with the contents of I<req> and optional I<content_type>, where
8b5ca511
DDO
156the length of the data in I<req> does not need to be determined in advance: the
157BIO will be read on-the-fly while sending the request, which supports streaming.
8f965908
DDO
158The optional list I<headers> may contain additional custom HTTP header lines.
159If the parameter I<expected_content_type>
160is not NULL then the client will check that the given content type string
161is included in the HTTP header of the response and return an error if not.
162If the I<expect_asn1> parameter is nonzero,
163a structure in ASN.1 encoding will be expected as response content.
8f965908
DDO
164If the I<timeout> parameter is > 0 this indicates the maximum number of seconds
165the subsequent HTTP transfer (sending the request and receiving a response)
166is allowed to take.
167A value of 0 enables waiting indefinitely, i.e., no timeout.
168A value < 0 indicates that the I<overall_timeout> parameter value given
169when opening the HTTP transfer will be used instead.
170If I<keep_alive> is 0 the connection is not kept open
171after receiving a response, which is the default behavior for HTTP 1.0.
172If the value is 1 or 2 then a persistent connection is requested.
173If the value is 2 then a persistent connection is required,
174i.e., an error occurs in case the server does not grant it.
175
82990287 176OSSL_HTTP_exchange() exchanges any form of HTTP request and response
8f965908
DDO
177as specified by I<rctx>, which must include both connection and request data,
178typically set up using OSSL_HTTP_open() and OSSL_HTTP_set_request().
179It implements the core of the functions described below.
180If the HTTP method is GET and I<redirection_url>
181is not NULL the latter pointer is used to provide any new location that
182the server may return with HTTP code 301 (MOVED_PERMANENTLY) or 302 (FOUND).
82990287
DDO
183In this case the function returns NULL and the caller is
184responsible for deallocating the URL with L<OPENSSL_free(3)>.
8f965908
DDO
185If the response header contains one or more "Content-Length" header lines and/or
186an ASN.1-encoded response is expected, which should include a total length,
187the length indications received are checked for consistency
188and for not exceeding any given maximum response length.
189On receiving a response, the function returns the contents as a memory BIO,
190which does not support streaming, in case an ASN.1-encoded response is expected.
191Else it returns directly the read BIO that holds the response contents,
192which allows a response of indefinite length and may support streaming.
193
194OSSL_HTTP_get() uses HTTP GET to obtain data from I<bio> if non-NULL,
195else from the server contained in the I<url>, and returns it as a BIO.
196It supports redirection via HTTP status code 301 or 302. It is meant for
197transfers with a single round trip, so does not support persistent connections.
198If I<bio> is non-NULL, any host and port components in the I<url> are not used
199for connecting but the hostname is used, as usual, for the C<Host> header.
200Any userinfo and fragment components in the I<url> are ignored.
201Any query component is handled as part of the path component.
202If the scheme component of the I<url> is C<https> a TLS connection is requested
203and the I<bio_update_fn>, as described for OSSL_HTTP_open(), must be provided.
204Also the remaining parameters are interpreted as described for OSSL_HTTP_open()
205and OSSL_HTTP_set_request(), respectively.
206
82990287
DDO
207OSSL_HTTP_transfer() exchanges an HTTP request and response
208over a connection managed via I<prctx> without supporting redirection.
209It combines OSSL_HTTP_open(), OSSL_HTTP_set_request(), OSSL_HTTP_exchange(),
210and OSSL_HTTP_close().
211If I<prctx> is not NULL it reuses any open connection represented by a non-NULL
212I<*prctx>. It keeps the connection open if a persistent connection is requested
213or required and this was granted by the server, else it closes the connection
214and assigns NULL to I<*prctx>.
215The remaining parameters are interpreted as described for OSSL_HTTP_open()
216and OSSL_HTTP_set_request(), respectively.
217
8f965908
DDO
218OSSL_HTTP_close() closes the connection and releases I<rctx>.
219The I<ok> parameter is passed to any BIO update function
220given during setup as described above for OSSL_HTTP_open().
221
4b1fe471
DDO
222=head1 NOTES
223
224The names of the environment variables used by this implementation:
d7fcee3b
DDO
225C<http_proxy>, C<HTTP_PROXY>, C<https_proxy>, C<HTTPS_PROXY>, C<no_proxy>, and
226C<NO_PROXY>, have been chosen for maximal compatibility with
4b1fe471
DDO
227other HTTP client implementations such as wget, curl, and git.
228
29f178bd
DDO
229=head1 RETURN VALUES
230
8f965908
DDO
231OSSL_HTTP_open() returns on success a B<OSSL_HTTP_REQ_CTX>, else NULL.
232
233OSSL_HTTP_proxy_connect() and OSSL_HTTP_set_request()
234return 1 on success, 0 on error.
235
236On success, OSSL_HTTP_exchange(), OSSL_HTTP_get(), and OSSL_HTTP_transfer()
82990287
DDO
237return a memory BIO containing the data received.
238This must be freed by the caller.
8f965908 239On failure, they return NULL.
6aab42c3 240Failure conditions include connection/transfer timeout, parse errors, etc.
29f178bd 241
8f965908 242OSSL_HTTP_close() returns 0 if anything went wrong while disconnecting, else 1.
29f178bd 243
d7fcee3b
DDO
244=head1 SEE ALSO
245
8f965908
DDO
246L<OSSL_HTTP_parse_url(3)>, L<BIO_set_conn_port(3)>
247L<ASN1_item_i2d_mem_bio(3)>, L<ASN1_item_d2i_bio(3)>,
248L<OSSL_HTTP_is_alive(3)>
d7fcee3b 249
29f178bd
DDO
250=head1 HISTORY
251
8f965908 252All the functions described here were added in OpenSSL 3.0.
29f178bd
DDO
253
254=head1 COPYRIGHT
255
4333b89f 256Copyright 2019-2021 The OpenSSL Project Authors. All Rights Reserved.
29f178bd
DDO
257
258Licensed under the Apache License 2.0 (the "License"). You may not use
259this file except in compliance with the License. You can obtain a copy
260in the file LICENSE in the source distribution or at
261L<https://www.openssl.org/source/license.html>.
262
263=cut