From: Michael Tremer Date: Wed, 18 Oct 2023 09:49:48 +0000 (+0000) Subject: downloader: Add support for POST request parameters X-Git-Tag: 0.9.30~1452 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e9716ad48d4891d9a0a7c59aed6877c5e2ab792d;p=pakfire.git downloader: Add support for POST request parameters Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/downloader.c b/src/libpakfire/downloader.c index e08657c56..f0a515637 100644 --- a/src/libpakfire/downloader.c +++ b/src/libpakfire/downloader.c @@ -67,6 +67,9 @@ struct pakfire_transfer { enum pakfire_transfer_flags flags; int tries; + // POST MIME Object + curl_mime* mime; + // Size size_t expected_size; size_t transferred; @@ -146,6 +149,8 @@ static void pakfire_downloader_transfer_free(struct pakfire_transfer* transfer) if (transfer->evp) EVP_MD_CTX_free(transfer->evp); + if (transfer->mime) + curl_mime_free(transfer->mime); if (transfer->fullurl) curl_url_cleanup(transfer->fullurl); @@ -530,6 +535,66 @@ int pakfire_downloader_transfer_verify_digest( return 0; } +int pakfire_downloader_transfer_add_param(struct pakfire_transfer* transfer, + const char* key, const char* format, ...) { + curl_mimepart* part = NULL; + char* buffer = NULL; + va_list args; + int r; + + // Allocate the MIME object if not done, yet + if (!transfer->mime) { + transfer->mime = curl_mime_init(transfer->handle); + + if (!transfer->mime) { + CTX_ERROR(transfer->ctx, "Could not allocate the MIME object: %s\n", + strerror(errno)); + r = -errno; + goto ERROR; + } + } + + // Format value + va_start(args, format); + r = vasprintf(&buffer, format, args); + va_end(args); + + // Abort if we could not format the value + if (r < 0) + goto ERROR; + + // Allocate another MIME part + part = curl_mime_addpart(transfer->mime); + if (!part) { + CTX_ERROR(transfer->ctx, "Could not allocate MIME part: %s\n", + strerror(errno)); + r = errno; + goto ERROR; + } + + // Set the key + r = curl_mime_name(part, key); + if (r) { + CTX_ERROR(transfer->ctx, "Could not set parameter key (%s): %s\n", + key, curl_easy_strerror(r)); + goto ERROR; + } + + // Set the data + r = curl_mime_data(part, buffer, CURL_ZERO_TERMINATED); + if (r) { + CTX_ERROR(transfer->ctx, "Could not set parameter data (%s): %s\n", + key, curl_easy_strerror(r)); + goto ERROR; + } + +ERROR: + if (buffer) + free(buffer); + + return r; +} + int pakfire_downloader_transfer_set_output(struct pakfire_transfer* transfer, FILE* f) { transfer->f = f; @@ -976,6 +1041,15 @@ static int pakfire_downloader_transfer_prepare(struct pakfire_downloader* downlo return r; } + // Add any payload + if (transfer->mime) { + r = curl_easy_setopt(transfer->handle, CURLOPT_MIMEPOST, transfer->mime); + if (r) { + CTX_ERROR(transfer->ctx, "Could not set POST payload: %s\n", curl_easy_strerror(r)); + return r; + } + } + // If we do not have an output file, we will create a temporary file if (!transfer->f) { r = pakfire_downloader_transfer_prepare_tmpfile(transfer); diff --git a/src/libpakfire/include/pakfire/downloader.h b/src/libpakfire/include/pakfire/downloader.h index fdec8ecd2..93d140f2c 100644 --- a/src/libpakfire/include/pakfire/downloader.h +++ b/src/libpakfire/include/pakfire/downloader.h @@ -57,6 +57,8 @@ int pakfire_downloader_transfer_set_size( int pakfire_downloader_transfer_verify_digest( struct pakfire_transfer* transfer, const enum pakfire_digest_types md, const unsigned char* expected_digest, const size_t expected_digest_length); +int pakfire_downloader_transfer_add_param(struct pakfire_transfer* transfer, + const char* key, const char* format, ...) __attribute__((format(printf, 3, 4))); int pakfire_downloader_transfer_set_output(struct pakfire_transfer* transfer, FILE* f); int pakfire_downloader_transfer_set_target(struct pakfire_transfer* transfer, const char* path);