]> git.ipfire.org Git - pakfire.git/commitdiff
xfer: Add function to append query arguments
authorMichael Tremer <michael.tremer@ipfire.org>
Sat, 25 Jan 2025 17:02:18 +0000 (17:02 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Sat, 25 Jan 2025 17:02:18 +0000 (17:02 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/pakfire/xfer.c
src/pakfire/xfer.h

index 9a19e63a3ac6c95ac9b6f8dd8d0c8ba96ad2e5fe..9758c41d90e75681577142b4459c0bf916bb9dff 100644 (file)
@@ -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) {
index 57317620e7073495137ab8ffe5710df4b95d5913..1b0bf86fcf021cdeb5290b5d22319a6f536fefc8 100644 (file)
@@ -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)));