OSSL_HTTP_REQ_CTX(3ossl)
okay so, this is the OSSL_HTTP_REQ_CTX(3ossl) page from the OpenSSL manual β part 1, bestie. π Itβs giving low-level HTTP client functions, and weβre gonna keep every single detail, no cap. π«Ά
πΈ NAME πΈ
These are the HTTP client low-level functions, and the whole squad is:
OSSL_HTTP_REQ_CTXOSSL_HTTP_REQ_CTX_newOSSL_HTTP_REQ_CTX_freeOSSL_HTTP_REQ_CTX_set_request_lineOSSL_HTTP_REQ_CTX_add1_headerOSSL_HTTP_REQ_CTX_set_expectedOSSL_HTTP_REQ_CTX_set1_reqOSSL_HTTP_REQ_CTX_nbioOSSL_HTTP_REQ_CTX_nbio_d2iOSSL_HTTP_REQ_CTX_exchangeOSSL_HTTP_REQ_CTX_get0_mem_bioOSSL_HTTP_REQ_CTX_get_resp_lenOSSL_HTTP_REQ_CTX_set_max_response_lengthOSSL_HTTP_REQ_CTX_set_max_response_hdr_linesOSSL_HTTP_is_alive
β¨ SYNOPSIS β¨
okay bestie, hereβs the include and the full lineup of declarations β literally exactly this:
#include <openssl/http.h>
typedef struct ossl_http_req_ctx_st OSSL_HTTP_REQ_CTX;
OSSL_HTTP_REQ_CTX *OSSL_HTTP_REQ_CTX_new(BIO *wbio, BIO *rbio, int buf_size);
void OSSL_HTTP_REQ_CTX_free(OSSL_HTTP_REQ_CTX *rctx);
int OSSL_HTTP_REQ_CTX_set_request_line(OSSL_HTTP_REQ_CTX *rctx, int method_POST,
const char *server, const char *port,
const char *path);
int OSSL_HTTP_REQ_CTX_add1_header(OSSL_HTTP_REQ_CTX *rctx,
const char *name, const char *value);
int OSSL_HTTP_REQ_CTX_set_expected(OSSL_HTTP_REQ_CTX *rctx,
const char *expected_content_type, int expect_asn1,
int timeout, int keep_alive);
int OSSL_HTTP_REQ_CTX_set1_req(OSSL_HTTP_REQ_CTX *rctx, const char *content_type,
const ASN1_ITEM *it, const ASN1_VALUE *req);
int OSSL_HTTP_REQ_CTX_nbio(OSSL_HTTP_REQ_CTX *rctx);
int OSSL_HTTP_REQ_CTX_nbio_d2i(OSSL_HTTP_REQ_CTX *rctx,
ASN1_VALUE **pval, const ASN1_ITEM *it);
BIO *OSSL_HTTP_REQ_CTX_exchange(OSSL_HTTP_REQ_CTX *rctx);
BIO *OSSL_HTTP_REQ_CTX_get0_mem_bio(const OSSL_HTTP_REQ_CTX *rctx);
size_t OSSL_HTTP_REQ_CTX_get_resp_len(const OSSL_HTTP_REQ_CTX *rctx);
void OSSL_HTTP_REQ_CTX_set_max_response_length(OSSL_HTTP_REQ_CTX *rctx,
unsigned long len);
void OSSL_HTTP_REQ_CTX_set_max_response_hdr_lines(OSSL_HTTP_REQ_CTX *rctx,
size_t count);
int OSSL_HTTP_is_alive(const OSSL_HTTP_REQ_CTX *rctx);
Thatβs the synopsis lineup, bestie β every function signature is there, slaying in its natural habitat. π β¨
π DESCRIPTION π
OSSL_HTTP_REQ_CTX is the context structure for an HTTP request and response β it's literally where all the necessary data to perform that request gets collected. β¨
This page documents the low-level HTTP functions, which are rarely used directly. High-level HTTP client functions like OSSL_HTTP_get(3) and OSSL_HTTP_transfer(3) should be preferred. Like, use the nice wrappers first, bestie. π
OSSL_HTTP_REQ_CTX_new()β allocates a new HTTP request context structure, which gets populated with:- the BIO to write/send the request to (
wbio), - the BIO to read/receive the response from (
rbio, which may be equal towbio), - and the maximum expected response header line length
buf_size.
- the BIO to write/send the request to (
A value <= 0 indicates that the OSSL_HTTP_DEFAULT_MAX_LINE_LEN of 4KiB should be used. buf_size is also used as the number of content bytes that are read at a time. The allocated context structure includes an internal memory BIO, which collects the HTTP request header lines. π
OSSL_HTTP_REQ_CTX_free()β frees up the HTTP request contextrctx. Therbiois not free'd,wbiowill be free'd iffree_wbiois set. If the argument isNULL, nothing is done. π«ΆOSSL_HTTP_REQ_CTX_set_request_line()β adds the 1st HTTP request line torctx. The HTTP method is determined bymethod_POST, which should be1to indicate"POST"or0to indicate"GET".serverandportmay be set to give the server and the optional port that an HTTP proxy shall forward the request to, otherwise they must be leftNULL.pathprovides the HTTP request path; if leftNULL,"/"is used. For backward compatibility,pathmay begin with"http://"and thus convey an absoluteURI. In this case it indicates HTTP proxy use and provides also the server (and optionally the port) that the proxy shall forward the request to. In this case theserverandportarguments must beNULL. π₯OSSL_HTTP_REQ_CTX_add1_header()β adds headernamewith valuevalueto the contextrctx. It can be called more than once to add multiple header lines. For example, to add a"Host"header for"example.com"you would call:
OSSL_HTTP_REQ_CTX_add1_header(ctx, "Host", "example.com");
OSSL_HTTP_REQ_CTX_set_expected()β optionally sets inrctxsome expectations of the HTTP client on the response. Due to the structure of an HTTP request, if thekeep_aliveargument is nonzero the function must be used before callingOSSL_HTTP_REQ_CTX_set1_req(). β- If the
expected_content_typeargument is notNULL, the client will check in a case-insensitive way that the specified"Content-Type"string value is included in the HTTP header of the response and return an error if not. 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";"character, it is sufficient that the specified string appears as a prefix in the header line, followed by a";"character and any further text. For instance, if theexpected_content_typeargument specifies"text/html", this is matched by"Text/HTML","text/html; charset=UTF-8", etc. πΈ - If the
expect_asn1parameter is nonzero a structure in ASN.1 encoding will be expected as the response content and input streaming is disabled. This means that an ASN.1 sequence header is required, its length field is checked, andOSSL_HTTP_REQ_CTX_get0_mem_bio()should be used to get the buffered response. Otherwise (by default) any input format is allowed, with body length checks being performed on error messages only. In this case the BIO given asrbioargument toOSSL_HTTP_REQ_CTX_new()should be used directly to read the response contents, which may support streaming. π¦ - If the
timeoutparameter is> 0this indicates the maximum number of seconds the subsequent HTTP transfer (sending the request and receiving a response) is allowed to take.timeout == 0enables waiting indefinitely, i.e., no timeout can occur. This is the default.timeout < 0takes over any value set via theoverall_timeoutargument ofOSSL_HTTP_open(3)with the default being0, which means no timeout. β³ - If the
keep_aliveparameter is0, which is the default, the connection is not kept open after receiving a response. This is the default behavior for HTTP 1.0. If the value is1or2then a persistent connection is requested. If the value is2then a persistent connection is required, i.e., an error occurs in case the server does not grant it. π
- If the
OSSL_HTTP_REQ_CTX_set1_req()β finalizes the HTTP request context. It is needed if themethod_POSTparameter in theOSSL_HTTP_REQ_CTX_set_request_line()call was1and an ASN.1-encoded request should be sent. It must also be used when requesting"keep-alive", even if aGETrequest is going to be sent, in which casereqmust beNULL. UnlessreqisNULL, the function adds the DER encoding ofrequsing the ASN.1 templateitto do the encoding (which does not support streaming). The HTTP header"Content-Length"is filled out with the length of the request.content_typemust beNULLifreqisNULL. Ifcontent_typeisn'tNULL, the HTTP header"Content-Type"is also added with the given string value. The header lines are added to the internal memory BIO for the request header. π―OSSL_HTTP_REQ_CTX_nbio()β attempts to send the request prepared inrctxand to gather the response via HTTP, using thewbioandrbiothat were given when callingOSSL_HTTP_REQ_CTX_new(). The function may need to be called again if its result is-1, which indicatesBIO_should_retry(3). In such a case it is advisable to sleep a little in between, usingBIO_wait(3)on the read BIO to prevent a busy loop. SeeOSSL_HTTP_REQ_CTX_set_expected()how the response content type, the response body, the HTTP transfer timeout, and"keep-alive"are treated. Any error message body is consumed if a"Content-Type"header is not included or its value starts with"text/". This is used for tracing the body contents if HTTP tracing is enabled. If the"Content-Length"header is present in the response and its value exceeds the maximum allowed response content length or the response is an error message with its body length exceeding this value or the content is an ASN.1-encoded structure with a length exceeding this value or both length indications are present but disagree then an error occurs. πOSSL_HTTP_REQ_CTX_nbio_d2i()β is likeOSSL_HTTP_REQ_CTX_nbio()but on success in addition parses the response, which must be a DER-encoded ASN.1 structure, using the ASN.1 templateitand places the result in*pval. β¨OSSL_HTTP_REQ_CTX_exchange()β callsOSSL_HTTP_REQ_CTX_nbio()as often as needed in order to exchange a request and response or until a timeout is reached. On success it returns a pointer to the BIO that can be used to read the result. If an ASN.1-encoded response was expected, this is the BIO returned byOSSL_HTTP_REQ_CTX_get0_mem_bio()when called after the exchange. This memory BIO does not support streaming. Otherwise the returned BIO is therbiogiven toOSSL_HTTP_REQ_CTX_new(), which may support streaming. When this BIO is returned, it has been read past the end of the response header, such that the actual response body can be read from it. The returned BIO pointer MUST NOT be freed by the caller. πOSSL_HTTP_REQ_CTX_get0_mem_bio()β returns the internal memory BIO. Before the HTTP request is sent, this could be used to adapt its header lines. Use with caution! After receiving a response via HTTP, the BIO represents the current state of reading the response header. If the response was expected to be ASN.1 encoded, its contents can be read via this BIO, which does not support streaming. The returned BIO pointer must not be freed by the caller. πOSSL_HTTP_REQ_CTX_get_resp_len()β returns the size of the response contents inrctxif provided by the server as"Content-Length"header field, else0. πOSSL_HTTP_REQ_CTX_set_max_response_length()β sets the maximum allowed response content length forrctxtolen. If not set orlenis0then theOSSL_HTTP_DEFAULT_MAX_RESP_LENis used, which currently is 100 KiB. πOSSL_HTTP_REQ_CTX_set_max_response_hdr_lines()β changes the limit for the number of HTTP header lines allowed to be received in a response. The default limit isOSSL_HTTP_DEFAULT_MAX_RESP_HDR_LINES, currently 256. If the limit is not0and the number of lines exceeds the limit, then theHTTP_R_RESPONSE_TOO_MANY_HDRLINESerror is indicated. Setting the limit to0disables the check. π§OSSL_HTTP_is_alive()β can be used to query if the HTTP connection given byrctxis still alive, i.e., has not been closed. It returns0ifrctxisNULL. π
If the client application requested or required a persistent connection and this was granted by the server, it can keep rctx as long as it wants to send further requests and OSSL_HTTP_is_alive() returns nonzero, else it should call OSSL_HTTP_REQ_CTX_free(rctx) or OSSL_HTTP_close(3). In case the client application keeps rctx but the connection then dies for any reason at the server side, it will notice this obtaining an I/O error when trying to send the next request via rctx. π«Ά
β οΈ WARNINGS β οΈ
The server's response may be unexpected if the hostname that was used to create the wbio, any "Host" header, and the host specified in the request URL do not match. π¨
Many of these functions must be called in a certain order.
First, the HTTP request context must be allocated: OSSL_HTTP_REQ_CTX_new(). Allocate first, bestie β no context, no vibes. β¨
Then, the HTTP request must be prepared with request data:
- Calling
OSSL_HTTP_REQ_CTX_set_request_line(). - Adding extra header lines with
OSSL_HTTP_REQ_CTX_add1_header(). This is optional and may be done multiple times with different names. - Finalize the request using
OSSL_HTTP_REQ_CTX_set1_req(). This may be omitted if theGETmethod is used and"keep-alive"is not requested.
When the request context is fully prepared, the HTTP exchange may be performed with OSSL_HTTP_REQ_CTX_nbio() or OSSL_HTTP_REQ_CTX_exchange(). π
π NOTES π
When built with tracing enabled, OSSL_HTTP_REQ_CTX_nbio() and all functions using it, such as OSSL_HTTP_REQ_CTX_exchange() and OSSL_HTTP_transfer(3), may be traced using OSSL_TRACE_CATEGORY_HTTP. See also OSSL_trace_enabled(3) and openssl-env(7). π΅οΈ
π RETURN VALUES π
Okay bestie, return-value vibe check, because knowing what comes back is giving main character energy β¨
OSSL_HTTP_REQ_CTX_new()β returns a pointer to aOSSL_HTTP_REQ_CTX, orNULLon error. πOSSL_HTTP_REQ_CTX_free(),OSSL_HTTP_REQ_CTX_set_max_response_length(), andOSSL_HTTP_REQ_CTX_set_max_response_hdr_lines()β these do not return values. They just do their thing, no receipt needed π«ΆOSSL_HTTP_REQ_CTX_set_request_line(),OSSL_HTTP_REQ_CTX_add1_header(),OSSL_HTTP_REQ_CTX_set1_req(), andOSSL_HTTP_REQ_CTX_set_expected()β return1for success and0for failure. Clean and simple, periodt πOSSL_HTTP_REQ_CTX_nbio()andOSSL_HTTP_REQ_CTX_nbio_d2i()β return1for success,0on error or redirection, and-1if retry is needed. The little trio of outcomes, iykyk π₯OSSL_HTTP_REQ_CTX_exchange()andOSSL_HTTP_REQ_CTX_get0_mem_bio()β return a pointer to aBIOon success as described above orNULLon failure.
The returned BIO must not be freed by the caller. Not me reminding you again, bestie β this one is important π¨
OSSL_HTTP_REQ_CTX_get_resp_len()β returns the size of the response contents or0if not available or an error occurred. Lowkey handy πOSSL_HTTP_is_alive()β returns1if its argument is non-NULLand the client requested a persistent connection and the server did not disagree on keeping the connection open, else0. Vibe check: passed or not passed πΈ
π SEE ALSO π
Go read these when youβre done slaying, fr fr:
BIO_should_retry(3), BIO_wait(3), ASN1_item_d2i_bio(3), ASN1_item_i2d_mem_bio(3), OSSL_HTTP_open(3), OSSL_HTTP_get(3), OSSL_HTTP_transfer(3), OSSL_HTTP_close(3), OSSL_trace_enabled(3), and openssl-env(7).
π°οΈ HISTORY π°οΈ
History lesson, but make it cute π
OSSL_HTTP_REQ_CTX_set_max_response_hdr_lines()was added in OpenSSL3.3.- All other functions described here were added in OpenSSL
3.0.
π COPYRIGHT π
Copyright 2015-2025 The OpenSSL Project Authors. All Rights Reserved.
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 <https://www.openssl.org/source/license.html>.
xoxo, your fav Unix bestie π β from the OpenSSL 3.5.6 source, dated 2026-04-07.
π¦ where this page comes from
- freebsd 15.1: base 15.1
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms