2019-10-31 06:39:35 +08:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								=pod
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								=head1 NAME
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2021-05-05 06:09:43 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								OSSL_HTTP_open,
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								OSSL_HTTP_bio_cb_t,
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								OSSL_HTTP_proxy_connect,
							 | 
						
					
						
							
								
									
										
										
										
											2021-06-09 15:40:48 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								OSSL_HTTP_set1_request,
							 | 
						
					
						
							
								
									
										
										
										
											2021-05-05 06:09:43 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								OSSL_HTTP_exchange,
							 | 
						
					
						
							
								
									
										
										
										
											2019-10-31 06:39:35 +08:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								OSSL_HTTP_get,
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								OSSL_HTTP_transfer,
							 | 
						
					
						
							
								
									
										
										
										
											2021-05-05 06:09:43 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								OSSL_HTTP_close
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								-  HTTP client high-level functions
							 | 
						
					
						
							
								
									
										
										
										
											2019-10-31 06:39:35 +08:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								=head1 SYNOPSIS
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								 #include <openssl/http.h>
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								 typedef BIO *(*OSSL_HTTP_bio_cb_t)(BIO *bio, void *arg,
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								                                    int connect, int detail);
							 | 
						
					
						
							
								
									
										
										
										
											2021-05-05 06:09:43 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								 OSSL_HTTP_REQ_CTX *OSSL_HTTP_open(const char *server, const char *port,
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								                                   const char *proxy, const char *no_proxy,
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								                                   int use_ssl, BIO *bio, BIO *rbio,
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								                                   OSSL_HTTP_bio_cb_t bio_update_fn, void *arg,
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								                                   int buf_size, int overall_timeout);
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								 int OSSL_HTTP_proxy_connect(BIO *bio, const char *server, const char *port,
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								                             const char *proxyuser, const char *proxypass,
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								                             int timeout, BIO *bio_err, const char *prog);
							 | 
						
					
						
							
								
									
										
										
										
											2021-06-09 15:40:48 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								 int OSSL_HTTP_set1_request(OSSL_HTTP_REQ_CTX *rctx, const char *path,
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								                            const STACK_OF(CONF_VALUE) *headers,
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								                            const char *content_type, BIO *req,
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								                            const char *expected_content_type, int expect_asn1,
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								                            size_t max_resp_len, int timeout, int keep_alive);
							 | 
						
					
						
							
								
									
										
										
										
											2021-05-05 06:09:43 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								 BIO *OSSL_HTTP_exchange(OSSL_HTTP_REQ_CTX *rctx, char **redirection_url);
							 | 
						
					
						
							
								
									
										
										
										
											2020-02-20 01:00:26 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								 BIO *OSSL_HTTP_get(const char *url, const char *proxy, const char *no_proxy,
							 | 
						
					
						
							
								
									
										
										
										
											2019-10-31 06:39:35 +08:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								                    BIO *bio, BIO *rbio,
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								                    OSSL_HTTP_bio_cb_t bio_update_fn, void *arg,
							 | 
						
					
						
							
								
									
										
										
										
											2021-05-05 06:09:43 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								                    int buf_size, const STACK_OF(CONF_VALUE) *headers,
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								                    const char *expected_content_type, int expect_asn1,
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								                    size_t max_resp_len, int timeout);
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								 BIO *OSSL_HTTP_transfer(OSSL_HTTP_REQ_CTX **prctx,
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								                         const char *server, const char *port,
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								                         const char *path, int use_ssl,
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								                         const char *proxy, const char *no_proxy,
							 | 
						
					
						
							
								
									
										
										
										
											2019-10-31 06:39:35 +08:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								                         BIO *bio, BIO *rbio,
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								                         OSSL_HTTP_bio_cb_t bio_update_fn, void *arg,
							 | 
						
					
						
							
								
									
										
										
										
											2021-05-05 06:09:43 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								                         int buf_size, const STACK_OF(CONF_VALUE) *headers,
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								                         const char *content_type, BIO *req,
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								                         const char *expected_content_type, int expect_asn1,
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								                         size_t max_resp_len, int timeout, int keep_alive);
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								 int OSSL_HTTP_close(OSSL_HTTP_REQ_CTX *rctx, int ok);
							 | 
						
					
						
							
								
									
										
										
										
											2019-10-31 06:39:35 +08:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								=head1 DESCRIPTION
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2021-05-03 22:33:10 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								OSSL_HTTP_open() initiates an HTTP session using the I<bio> argument if not
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								NULL, else by connecting to a given I<server> optionally via a I<proxy>.
							 | 
						
					
						
							
								
									
										
										
										
											2019-10-31 06:39:35 +08:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2021-05-05 06:09:43 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								Typically the OpenSSL build supports sockets and the I<bio> parameter is NULL.
							 | 
						
					
						
							
								
									
										
										
										
											2021-12-03 18:34:23 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								In this case I<rbio> must be NULL as well and the I<server> must be non-NULL.
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								The function creates a network BIO internally using L<BIO_new_connect(3)>
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								for connecting to the given server and the optionally given I<port>,
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								defaulting to 80 for HTTP or 443 for HTTPS.
							 | 
						
					
						
							
								
									
										
										
										
											2021-05-05 06:09:43 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								Then this internal BIO is used for setting up a connection
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								and for exchanging one or more request and response.
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								If I<bio> is given and I<rbio> is NULL then this I<bio> is used instead.
							 | 
						
					
						
							
								
									
										
										
										
											2020-09-03 19:32:56 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								If both I<bio> and I<rbio> are given (which may be memory BIOs for instance)
							 | 
						
					
						
							
								
									
										
										
										
											2021-05-05 06:09:43 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								then no explicit connection is set up, but
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								I<bio> is used for writing requests and I<rbio> for reading responses.
							 | 
						
					
						
							
								
									
										
										
										
											2020-09-03 19:32:56 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								As soon as the client has flushed I<bio> the server must be ready to provide
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								a response or indicate a waiting condition via I<rbio>.
							 | 
						
					
						
							
								
									
										
										
										
											2019-10-31 06:39:35 +08:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2021-12-01 15:01:31 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								If I<bio> is given, it is an error to provide I<proxy> or I<no_proxy> arguments,
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								while I<server> and I<port> arguments may be given to support diagnostic output.
							 | 
						
					
						
							
								
									
										
										
										
											2021-05-01 00:36:00 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								If I<bio> is NULL the optional I<proxy> parameter can be used to set an
							 | 
						
					
						
							
								
									
										
										
										
											2020-03-25 20:46:02 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								HTTP(S) proxy to use (unless overridden by "no_proxy" settings).
							 | 
						
					
						
							
								
									
										
										
										
											2020-09-03 19:32:56 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								If TLS is not used this defaults to the environment variable C<http_proxy>
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								if set, else C<HTTP_PROXY>.
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								If I<use_ssl> != 0 it defaults to C<https_proxy> if set, else C<HTTPS_PROXY>.
							 | 
						
					
						
							
								
									
										
										
										
											2021-05-01 00:36:00 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								An empty proxy string C<""> forbids using a proxy.
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								Else the format is
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								C<[http[s]://][userinfo@]host[:port][/path][?query][#fragment]>,
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								where any userinfo, path, query, and fragment given is ignored.
							 | 
						
					
						
							
								
									
										
										
										
											2020-03-25 20:46:02 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								The default proxy port number is 80, or 443 in case "https:" is given.
							 | 
						
					
						
							
								
									
										
										
										
											2020-09-03 19:32:56 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								The HTTP client functions connect via the given proxy unless the I<server>
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								is found in the optional list I<no_proxy> of proxy hostnames (if not NULL;
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								default is the environment variable C<no_proxy> if set, else C<NO_PROXY>).
							 | 
						
					
						
							
								
									
										
										
										
											2020-03-25 20:46:02 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								Proxying plain HTTP is supported directly,
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								while using a proxy for HTTPS connections requires a suitable callback function
							 | 
						
					
						
							
								
									
										
										
										
											2020-09-03 19:32:56 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								such as OSSL_HTTP_proxy_connect(), described below.
							 | 
						
					
						
							
								
									
										
										
										
											2020-03-25 20:46:02 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2021-05-05 06:09:43 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								If I<use_ssl> is nonzero a TLS connection is requested
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								and the I<bio_update_fn> parameter must be provided.
							 | 
						
					
						
							
								
									
										
										
										
											2019-10-31 06:39:35 +08:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2021-05-05 06:09:43 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								The parameter I<bio_update_fn>, which is optional if I<use_ssl> is 0,
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								may be used to modify the connection BIO used by the HTTP client,
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								but cannot be used when both I<bio> and I<rbio> are given.
							 | 
						
					
						
							
								
									
										
										
										
											2020-09-03 19:32:56 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								I<bio_update_fn> is a BIO connect/disconnect callback function with prototype
							 | 
						
					
						
							
								
									
										
										
										
											2019-10-31 06:39:35 +08:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								 BIO *(*OSSL_HTTP_bio_cb_t)(BIO *bio, void *arg, int connect, int detail)
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2021-11-29 15:36:14 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								The callback function may modify the BIO provided in the I<bio> argument,
							 | 
						
					
						
							
								
									
										
										
										
											2023-06-12 00:19:50 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								whereby it may use an optional custom defined argument I<arg>,
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								which can for instance point to an B<SSL_CTX> structure.
							 | 
						
					
						
							
								
									
										
										
										
											2021-11-29 15:36:14 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								During connection establishment, just after calling BIO_do_connect_retry(), the
							 | 
						
					
						
							
								
									
										
										
										
											2022-06-28 23:47:40 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								callback function is invoked with the I<connect> argument being 1 and
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								I<detail> being 1 if I<use_ssl> is nonzero (i.e., HTTPS is requested), else 0.
							 | 
						
					
						
							
								
									
										
										
										
											2020-09-03 19:32:56 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								On disconnect I<connect> is 0 and I<detail> is 1 if no error occurred, else 0.
							 | 
						
					
						
							
								
									
										
										
										
											2021-11-29 15:36:14 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								For instance, on connect the callback may push an SSL BIO to implement HTTPS;
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								after disconnect it may do some diagnostic output and pop and free the SSL BIO.
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2023-06-12 00:19:50 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								The callback function must return either the potentially modified BIO I<bio>
							 | 
						
					
						
							
								
									
										
										
										
											2021-11-29 15:36:14 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								or NULL to indicate failure, in which case it should not modify the BIO.
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2019-10-31 06:39:35 +08:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								Here is a simple example that supports TLS connections (but not via a proxy):
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2021-11-22 03:55:35 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								 BIO *http_tls_cb(BIO *bio, void *arg, int connect, int detail)
							 | 
						
					
						
							
								
									
										
										
										
											2019-10-31 06:39:35 +08:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								 {
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								     if (connect && detail) { /* connecting with TLS */
							 | 
						
					
						
							
								
									
										
										
										
											2021-05-05 06:09:43 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								         SSL_CTX *ctx = (SSL_CTX *)arg;
							 | 
						
					
						
							
								
									
										
										
										
											2019-10-31 06:39:35 +08:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								         BIO *sbio = BIO_new_ssl(ctx, 1);
							 | 
						
					
						
							
								
									
										
										
										
											2021-05-05 06:09:43 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2021-11-22 03:55:35 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								         bio = sbio != NULL ? BIO_push(sbio, bio) : NULL;
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								     } else if (!connect) { /* disconnecting */
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								         BIO *hbio;
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								         if (!detail) { /* an error has occurred */
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								             /* optionally add diagnostics here */
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								         }
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								         BIO_ssl_shutdown(bio);
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								         hbio = BIO_pop(bio);
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								         BIO_free(bio); /* SSL BIO */
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								         bio = hbio;
							 | 
						
					
						
							
								
									
										
										
										
											2019-10-31 06:39:35 +08:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								     }
							 | 
						
					
						
							
								
									
										
										
										
											2021-11-22 03:55:35 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								     return bio;
							 | 
						
					
						
							
								
									
										
										
										
											2019-10-31 06:39:35 +08:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								 }
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								After disconnect the modified BIO will be deallocated using BIO_free_all().
							 | 
						
					
						
							
								
									
										
										
										
											2023-06-12 00:19:50 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								The optional callback function argument I<arg> is not consumed,
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								so must be freed by the caller when not needed any more.
							 | 
						
					
						
							
								
									
										
										
										
											2019-10-31 06:39:35 +08:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2021-05-05 06:09:43 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								The I<buf_size> parameter specifies the response header maximum line length.
							 | 
						
					
						
							
								
									
										
										
										
											2021-05-11 21:45:22 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								A value <= 0 means that the B<OSSL_HTTP_DEFAULT_MAX_LINE_LEN> (4KiB) is used.
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								I<buf_size> is also used as the number of content bytes that are read at a time.
							 | 
						
					
						
							
								
									
										
										
										
											2021-05-05 06:09:43 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								If the I<overall_timeout> parameter is > 0 this indicates the maximum number of
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								seconds the overall HTTP transfer (i.e., connection setup if needed,
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								sending requests, and receiving responses) is allowed to take until completion.
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								A value <= 0 enables waiting indefinitely, i.e., no timeout.
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2019-10-31 06:39:35 +08:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								OSSL_HTTP_proxy_connect() may be used by an above BIO connect callback function
							 | 
						
					
						
							
								
									
										
										
										
											2020-03-25 20:46:02 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								to set up an SSL/TLS connection via an HTTPS proxy.
							 | 
						
					
						
							
								
									
										
										
										
											2020-09-03 19:32:56 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								It promotes the given BIO I<bio> representing a connection
							 | 
						
					
						
							
								
									
										
										
										
											2019-10-31 06:39:35 +08:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								pre-established with a TLS proxy using the HTTP CONNECT method,
							 | 
						
					
						
							
								
									
										
										
										
											2020-09-03 19:32:56 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								optionally using proxy client credentials I<proxyuser> and I<proxypass>,
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								to connect with TLS protection ultimately to I<server> and I<port>.
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								If the I<port> argument is NULL or the empty string it defaults to "443".
							 | 
						
					
						
							
								
									
										
										
										
											2021-05-05 06:09:43 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								If the I<timeout> parameter is > 0 this indicates the maximum number of
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								seconds the connection setup is allowed to take.
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								A value <= 0 enables waiting indefinitely, i.e., no timeout.
							 | 
						
					
						
							
								
									
										
										
										
											2020-06-17 06:20:40 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								Since this function is typically called by applications such as
							 | 
						
					
						
							
								
									
										
										
										
											2020-09-03 19:32:56 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								L<openssl-s_client(1)> it uses the I<bio_err> and I<prog> parameters (unless
							 | 
						
					
						
							
								
									
										
										
										
											2019-10-31 06:39:35 +08:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								NULL) to print additional diagnostic information in a user-oriented way.
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2021-06-09 15:40:48 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								OSSL_HTTP_set1_request() sets up in I<rctx> the request header and content data
							 | 
						
					
						
							
								
									
										
										
										
											2021-05-05 06:09:43 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								and expectations on the response using the following parameters.
							 | 
						
					
						
							
								
									
										
										
										
											2023-08-09 04:47:50 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								If <rctx> indicates using a proxy for HTTP (but not HTTPS), the server host
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								(and optionally port) needs to be placed in the header; thus it must be present
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								in I<rctx>.
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								For backward compatibility, the server (and optional port) may also be given in
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								the I<path> argument beginning with C<http://> (thus giving an absoluteURI).
							 | 
						
					
						
							
								
									
										
										
										
											2021-05-05 06:09:43 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								If I<path> is NULL it defaults to "/".
							 | 
						
					
						
							
								
									
										
										
										
											2021-05-03 22:33:10 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								If I<req> is NULL the HTTP GET method will be used to send the request
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								else HTTP POST with the contents of I<req> and optional I<content_type>, where
							 | 
						
					
						
							
								
									
										
										
										
											2021-05-04 17:15:36 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								the length of the data in I<req> does not need to be determined in advance: the
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								BIO will be read on-the-fly while sending the request, which supports streaming.
							 | 
						
					
						
							
								
									
										
										
										
											2021-05-05 06:09:43 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								The optional list I<headers> may contain additional custom HTTP header lines.
							 | 
						
					
						
							
								
									
										
										
										
											2022-06-28 23:23:45 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								If the I<expected_content_type> argument is not NULL,
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								the client will check that the specified content-type string
							 | 
						
					
						
							
								
									
										
										
										
											2021-05-05 06:09:43 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								is included in the HTTP header of the response and return an error if not.
							 | 
						
					
						
							
								
									
										
										
										
											2022-06-28 23:23:45 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								In the content-type header line the specified string should be present either
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								as a whole, or in case the specified string does not include a C<;> character,
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								it is sufficient that the specified string appears as a prefix
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								in the header line, followed by a C<;> character and any further text.
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								For instance, if I<expected_content_type> specifies C<text/html>,
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								this is matched by C<text/html>, C<text/html; charset=UTF-8>, etc.
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2021-05-05 06:09:43 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								If the I<expect_asn1> parameter is nonzero,
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								a structure in ASN.1 encoding will be expected as response content.
							 | 
						
					
						
							
								
									
										
										
										
											2021-05-04 22:33:19 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								The I<max_resp_len> parameter specifies the maximum allowed
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								response content length, where the value 0 indicates no limit.
							 | 
						
					
						
							
								
									
										
										
										
											2021-05-05 06:09:43 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								If the I<timeout> parameter is > 0 this indicates the maximum number of seconds
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								the subsequent HTTP transfer (sending the request and receiving a response)
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								is allowed to take.
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								A value of 0 enables waiting indefinitely, i.e., no timeout.
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								A value < 0 indicates that the I<overall_timeout> parameter value given
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								when opening the HTTP transfer will be used instead.
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								If I<keep_alive> is 0 the connection is not kept open
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								after receiving a response, which is the default behavior for HTTP 1.0.
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								If the value is 1 or 2 then a persistent connection is requested.
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								If the value is 2 then a persistent connection is required,
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								i.e., an error occurs in case the server does not grant it.
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2021-05-03 22:33:10 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								OSSL_HTTP_exchange() exchanges any form of HTTP request and response
							 | 
						
					
						
							
								
									
										
										
										
											2021-05-05 06:09:43 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								as specified by I<rctx>, which must include both connection and request data,
							 | 
						
					
						
							
								
									
										
										
										
											2021-06-09 15:40:48 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								typically set up using OSSL_HTTP_open() and OSSL_HTTP_set1_request().
							 | 
						
					
						
							
								
									
										
										
										
											2021-05-05 06:09:43 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								It implements the core of the functions described below.
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								If the HTTP method is GET and I<redirection_url>
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								is not NULL the latter pointer is used to provide any new location that
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								the server may return with HTTP code 301 (MOVED_PERMANENTLY) or 302 (FOUND).
							 | 
						
					
						
							
								
									
										
										
										
											2021-05-03 22:33:10 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								In this case the function returns NULL and the caller is
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								responsible for deallocating the URL with L<OPENSSL_free(3)>.
							 | 
						
					
						
							
								
									
										
										
										
											2021-05-05 06:09:43 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								If the response header contains one or more "Content-Length" header lines and/or
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								an ASN.1-encoded response is expected, which should include a total length,
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								the length indications received are checked for consistency
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								and for not exceeding any given maximum response length.
							 | 
						
					
						
							
								
									
										
										
										
											2021-10-22 18:04:35 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								If an ASN.1-encoded response is expected, the function returns on success
							 | 
						
					
						
							
								
									
										
										
										
											2022-06-28 18:06:52 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								the contents buffered in a memory BIO, which does not support streaming.
							 | 
						
					
						
							
								
									
										
										
										
											2021-10-22 18:04:35 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								Otherwise it returns directly the read BIO that holds the response contents,
							 | 
						
					
						
							
								
									
										
										
										
											2021-05-05 06:09:43 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								which allows a response of indefinite length and may support streaming.
							 | 
						
					
						
							
								
									
										
										
										
											2021-10-22 18:04:35 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								The caller is responsible for freeing the BIO pointer obtained.
							 | 
						
					
						
							
								
									
										
										
										
											2021-05-05 06:09:43 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								OSSL_HTTP_get() uses HTTP GET to obtain data from I<bio> if non-NULL,
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								else from the server contained in the I<url>, and returns it as a BIO.
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								It supports redirection via HTTP status code 301 or 302.  It is meant for
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								transfers with a single round trip, so does not support persistent connections.
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								If I<bio> is non-NULL, any host and port components in the I<url> are not used
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								for connecting but the hostname is used, as usual, for the C<Host> header.
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								Any userinfo and fragment components in the I<url> are ignored.
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								Any query component is handled as part of the path component.
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								If the scheme component of the I<url> is C<https> a TLS connection is requested
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								and the I<bio_update_fn>, as described for OSSL_HTTP_open(), must be provided.
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								Also the remaining parameters are interpreted as described for OSSL_HTTP_open()
							 | 
						
					
						
							
								
									
										
										
										
											2021-06-09 15:40:48 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								and OSSL_HTTP_set1_request(), respectively.
							 | 
						
					
						
							
								
									
										
										
										
											2021-10-22 18:04:35 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								The caller is responsible for freeing the BIO pointer obtained.
							 | 
						
					
						
							
								
									
										
										
										
											2021-05-05 06:09:43 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2021-05-03 22:33:10 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								OSSL_HTTP_transfer() exchanges an HTTP request and response
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								over a connection managed via I<prctx> without supporting redirection.
							 | 
						
					
						
							
								
									
										
										
										
											2021-06-09 15:40:48 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								It combines OSSL_HTTP_open(), OSSL_HTTP_set1_request(), OSSL_HTTP_exchange(),
							 | 
						
					
						
							
								
									
										
										
										
											2021-05-03 22:33:10 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								and OSSL_HTTP_close().
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								If I<prctx> is not NULL it reuses any open connection represented by a non-NULL
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								I<*prctx>.  It keeps the connection open if a persistent connection is requested
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								or required and this was granted by the server, else it closes the connection
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								and assigns NULL to I<*prctx>.
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								The remaining parameters are interpreted as described for OSSL_HTTP_open()
							 | 
						
					
						
							
								
									
										
										
										
											2021-06-09 15:40:48 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								and OSSL_HTTP_set1_request(), respectively.
							 | 
						
					
						
							
								
									
										
										
										
											2021-10-22 18:04:35 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								The caller is responsible for freeing the BIO pointer obtained.
							 | 
						
					
						
							
								
									
										
										
										
											2021-05-03 22:33:10 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2021-05-05 06:09:43 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								OSSL_HTTP_close() closes the connection and releases I<rctx>.
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								The I<ok> parameter is passed to any BIO update function
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								given during setup as described above for OSSL_HTTP_open().
							 | 
						
					
						
							
								
									
										
										
										
											2021-11-22 18:29:25 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								It must be 1 if no error occurred during the HTTP transfer and 0 otherwise.
							 | 
						
					
						
							
								
									
										
										
										
											2021-05-05 06:09:43 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2020-03-25 20:46:02 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								=head1 NOTES
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								The names of the environment variables used by this implementation:
							 | 
						
					
						
							
								
									
										
										
										
											2020-09-03 19:32:56 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								C<http_proxy>, C<HTTP_PROXY>, C<https_proxy>, C<HTTPS_PROXY>, C<no_proxy>, and
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								C<NO_PROXY>, have been chosen for maximal compatibility with
							 | 
						
					
						
							
								
									
										
										
										
											2020-03-25 20:46:02 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								other HTTP client implementations such as wget, curl, and git.
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2022-05-24 01:43:56 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								When built with tracing enabled, OSSL_HTTP_transfer() and all functions using it
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								may be traced using B<OSSL_TRACE_CATEGORY_HTTP>.
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								See also L<OSSL_trace_enabled(3)> and L<openssl(1)/ENVIRONMENT>.
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2019-10-31 06:39:35 +08:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								=head1 RETURN VALUES
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2021-05-05 06:09:43 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								OSSL_HTTP_open() returns on success a B<OSSL_HTTP_REQ_CTX>, else NULL.
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2021-06-09 15:40:48 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								OSSL_HTTP_proxy_connect() and OSSL_HTTP_set1_request()
							 | 
						
					
						
							
								
									
										
										
										
											2021-05-05 06:09:43 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								return 1 on success, 0 on error.
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								On success, OSSL_HTTP_exchange(), OSSL_HTTP_get(), and OSSL_HTTP_transfer()
							 | 
						
					
						
							
								
									
										
										
										
											2022-06-28 18:06:52 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								return a memory BIO that buffers all the data received if an ASN.1-encoded
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								response is expected, otherwise a BIO that may support streaming.
							 | 
						
					
						
							
								
									
										
										
										
											2021-05-04 22:33:19 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								The BIO must be freed by the caller.
							 | 
						
					
						
							
								
									
										
										
										
											2021-05-05 06:09:43 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								On failure, they return NULL.
							 | 
						
					
						
							
								
									
										
										
										
											2021-01-26 03:44:39 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								Failure conditions include connection/transfer timeout, parse errors, etc.
							 | 
						
					
						
							
								
									
										
										
										
											2021-10-22 18:04:35 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								The caller is responsible for freeing the BIO pointer obtained.
							 | 
						
					
						
							
								
									
										
										
										
											2019-10-31 06:39:35 +08:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2021-05-05 06:09:43 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								OSSL_HTTP_close() returns 0 if anything went wrong while disconnecting, else 1.
							 | 
						
					
						
							
								
									
										
										
										
											2019-10-31 06:39:35 +08:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2020-09-03 19:32:56 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								=head1 SEE ALSO
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2021-12-03 18:34:23 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								L<OSSL_HTTP_parse_url(3)>, L<BIO_new_connect(3)>,
							 | 
						
					
						
							
								
									
										
										
										
											2021-05-05 06:09:43 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								L<ASN1_item_i2d_mem_bio(3)>, L<ASN1_item_d2i_bio(3)>,
							 | 
						
					
						
							
								
									
										
										
										
											2022-05-24 01:43:56 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								L<OSSL_HTTP_is_alive(3)>,
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								L<OSSL_trace_enabled(3)>
							 | 
						
					
						
							
								
									
										
										
										
											2020-09-03 19:32:56 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2019-10-31 06:39:35 +08:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								=head1 HISTORY
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2021-05-05 06:09:43 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								All the functions described here were added in OpenSSL 3.0.
							 | 
						
					
						
							
								
									
										
										
										
											2019-10-31 06:39:35 +08:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								=head1 COPYRIGHT
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2023-09-07 16:59:15 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								Copyright 2019-2023 The OpenSSL Project Authors. All Rights Reserved.
							 | 
						
					
						
							
								
									
										
										
										
											2019-10-31 06:39:35 +08:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								Licensed under the Apache License 2.0 (the "License").  You may not use
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								this file except in compliance with the License.  You can obtain a copy
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								in the file LICENSE in the source distribution or at
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								L<https://www.openssl.org/source/license.html>.
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								=cut
							 |