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