summaryrefslogtreecommitdiffstats
path: root/crypto/cmp
diff options
context:
space:
mode:
authorDr. David von Oheimb <David.von.Oheimb@siemens.com>2021-05-05 00:09:43 +0200
committerDr. David von Oheimb <dev@ddvo.net>2021-05-12 15:11:51 +0200
commit8f965908a53b4f0c5a735739e8a273a3a33a976e (patch)
tree9efe89d630473e84898a5a00f2898f9b0f7fbdbd /crypto/cmp
parent4329f361ce75973ceca9d440e8430580ee515070 (diff)
HTTP client: Minimal changes that include the improved API
This is a minimal version of pull request #15053 including all the proposed improvements to the HTTP client API and its documentation but only those code adaptations strictly needed for it. The proposed new features include * support for persistent connections (keep-alive), * generalization to arbitrary request and response types, and * support for streaming BIOs for request and response data. The related API changes include: * Split the monolithic OSSL_HTTP_transfer() into OSSL_HTTP_open(), OSSL_HTTP_set_request(), a lean OSSL_HTTP_transfer(), and OSSL_HTTP_close(). * Split the timeout functionality accordingly and improve default behavior. * Extract part of OSSL_HTTP_REQ_CTX_new() to OSSL_HTTP_REQ_CTX_set_expected(). Reviewed-by: Tomas Mraz <tomas@openssl.org> (Merged from https://github.com/openssl/openssl/pull/15147)
Diffstat (limited to 'crypto/cmp')
-rw-r--r--crypto/cmp/cmp_http.c30
1 files changed, 20 insertions, 10 deletions
diff --git a/crypto/cmp/cmp_http.c b/crypto/cmp/cmp_http.c
index 215c47c7c5..a358622feb 100644
--- a/crypto/cmp/cmp_http.c
+++ b/crypto/cmp/cmp_http.c
@@ -37,9 +37,11 @@ OSSL_CMP_MSG *OSSL_CMP_MSG_http_perform(OSSL_CMP_CTX *ctx,
{
char server_port[32] = { '\0' };
STACK_OF(CONF_VALUE) *headers = NULL;
- const char *const content_type_pkix = "application/pkixcmp";
+ const char content_type_pkix[] = "application/pkixcmp";
int tls_used;
- OSSL_CMP_MSG *res;
+ const ASN1_ITEM *it = ASN1_ITEM_rptr(OSSL_CMP_MSG);
+ BIO *req_mem, *rsp;
+ OSSL_CMP_MSG *res = NULL;
if (ctx == NULL || req == NULL) {
ERR_raise(ERR_LIB_CMP, CMP_R_NULL_ARGUMENT);
@@ -48,6 +50,8 @@ OSSL_CMP_MSG *OSSL_CMP_MSG_http_perform(OSSL_CMP_CTX *ctx,
if (!X509V3_add_value("Pragma", "no-cache", &headers))
return NULL;
+ if ((req_mem = ASN1_item_i2d_mem_bio(it, (const ASN1_VALUE *)req)) == NULL)
+ goto err;
if (ctx->serverPort != 0)
BIO_snprintf(server_port, sizeof(server_port), "%d", ctx->serverPort);
@@ -55,15 +59,21 @@ OSSL_CMP_MSG *OSSL_CMP_MSG_http_perform(OSSL_CMP_CTX *ctx,
tls_used = OSSL_CMP_CTX_get_http_cb_arg(ctx) != NULL;
ossl_cmp_log2(DEBUG, ctx, "connecting to CMP server %s%s",
ctx->server, tls_used ? " using TLS" : "");
- res = (OSSL_CMP_MSG *)
- OSSL_HTTP_post_asn1(ctx->server, server_port, ctx->serverPath,
- tls_used, ctx->proxy, ctx->no_proxy, NULL, NULL,
- ctx->http_cb, OSSL_CMP_CTX_get_http_cb_arg(ctx),
- headers, content_type_pkix, (const ASN1_VALUE *)req,
- ASN1_ITEM_rptr(OSSL_CMP_MSG),
- 0, 0, ctx->msg_timeout, content_type_pkix,
- ASN1_ITEM_rptr(OSSL_CMP_MSG));
+ rsp = OSSL_HTTP_transfer(NULL, ctx->server, server_port,
+ ctx->serverPath, tls_used,
+ ctx->proxy, ctx->no_proxy,
+ NULL /* bio */, NULL /* rbio */,
+ ctx->http_cb, OSSL_CMP_CTX_get_http_cb_arg(ctx),
+ 0 /* buf_size */, headers,
+ content_type_pkix, req_mem,
+ content_type_pkix, 1 /* expect_asn1 */,
+ HTTP_DEFAULT_MAX_RESP_LEN,
+ ctx->msg_timeout, 0 /* keep_alive */);
+ BIO_free(req_mem);
+ res = (OSSL_CMP_MSG *)ASN1_item_d2i_bio(it, rsp, NULL);
+ BIO_free(rsp);
ossl_cmp_debug(ctx, "disconnected from CMP server");
+ err:
sk_CONF_VALUE_pop_free(headers, X509V3_conf_free);
return res;
}