From: Michael Tremer Date: Sat, 25 Jan 2025 17:02:18 +0000 (+0000) Subject: xfer: Add function to append query arguments X-Git-Tag: 0.9.30~378 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7c30854aa02f4af9918ad92d98face31c1d706ed;p=pakfire.git xfer: Add function to append query arguments Signed-off-by: Michael Tremer --- diff --git a/src/pakfire/xfer.c b/src/pakfire/xfer.c index 9a19e63a..9758c41d 100644 --- a/src/pakfire/xfer.c +++ b/src/pakfire/xfer.c @@ -66,6 +66,9 @@ struct pakfire_xfer { char tmpfile[PATH_MAX]; int tries; + // GET Query Arguments + char** queries; + // POST MIME Object curl_mime* mime; @@ -156,6 +159,10 @@ static void pakfire_xfer_free(struct pakfire_xfer* xfer) { free(xfer->buffer.data); #endif /* CURL_HAS_WEBSOCKETS */ + // Query Arguments + if (xfer->queries) + pakfire_strings_free(xfer->queries); + // cURL stuff if (xfer->handle) curl_easy_cleanup(xfer->handle); @@ -403,7 +410,6 @@ int pakfire_xfer_create(struct pakfire_xfer** xfer, goto ERROR; } - // Setup the xfer r = pakfire_xfer_setup(x); if (r) @@ -566,6 +572,29 @@ int pakfire_xfer_verify_digest(struct pakfire_xfer* xfer, const enum pakfire_dig return 0; } +int pakfire_xfer_add_query(struct pakfire_xfer* xfer, + const char* key, const char* format, ...) { + char* value = NULL; + va_list args; + int r; + + // Format the value + va_start(args, format); + r = vasprintf(&value, format, args); + va_end(args); + + // Break on error + if (r < 0) + return -errno; + + // Append the argument + r = pakfire_strings_appendf(&xfer->queries, "%s=%s", key, value); + if (value) + free(value); + + return r; +} + int pakfire_xfer_add_param(struct pakfire_xfer* xfer, const char* key, const char* format, ...) { curl_mimepart* part = NULL; @@ -1483,6 +1512,19 @@ static int pakfire_xfer_prepare_url(struct pakfire_xfer* xfer) { } #endif /* CURL_HAS_WEBSOCKETS */ + // Append any query arguments + if (xfer->queries) { + for (char** query = xfer->queries; *query; query++) { + r = curl_url_set(xfer->fullurl, CURLUPART_QUERY, + *query, CURLU_APPENDQUERY|CURLU_URLENCODE); + if (r) { + ERROR(xfer->ctx, "Could not set query argument '%s': %s\n", + *query, curl_url_strerror(r)); + goto ERROR; + } + } + } + // Set the URL r = curl_easy_setopt(xfer->handle, CURLOPT_CURLU, xfer->fullurl); if (r) { diff --git a/src/pakfire/xfer.h b/src/pakfire/xfer.h index 57317620..1b0bf86f 100644 --- a/src/pakfire/xfer.h +++ b/src/pakfire/xfer.h @@ -110,6 +110,8 @@ int pakfire_xfer_set_size(struct pakfire_xfer* xfer, size_t size); int pakfire_xfer_verify_digest(struct pakfire_xfer* xfer, const enum pakfire_digest_types md, const unsigned char* expected_digest, const size_t expected_digest_length); +int pakfire_xfer_add_query(struct pakfire_xfer* xfer, + const char* key, const char* format, ...) __attribute__((format(printf, 3, 4))); int pakfire_xfer_add_param(struct pakfire_xfer* xfer, const char* key, const char* format, ...) __attribute__((format(printf, 3, 4)));