]> git.ipfire.org Git - people/ms/pakfire.git/commitdiff
xfer: Add a function to send a custom POST payload
authorMichael Tremer <michael.tremer@ipfire.org>
Sat, 21 Jun 2025 11:46:00 +0000 (11:46 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Sat, 21 Jun 2025 11:46:00 +0000 (11:46 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/pakfire/xfer.c
src/pakfire/xfer.h

index f298cc3141bcf7423c893f3e423e71de8b3b5638..583cab2920f0262a9e1a95d1f07b085829459f2d 100644 (file)
@@ -69,6 +69,9 @@ struct pakfire_xfer {
        // POST MIME Object
        curl_mime* mime;
 
+       // POST Payload
+       char* payload;
+
        // Xfer direction
        enum {
                PAKFIRE_XFER_DOWNLOAD = 0,
@@ -149,6 +152,10 @@ static void pakfire_xfer_free(struct pakfire_xfer* xfer) {
        if (xfer->queries)
                pakfire_strings_free(xfer->queries);
 
+       // POST Payload
+       if (xfer->payload)
+               free(xfer->payload);
+
        // cURL stuff
        if (xfer->handle)
                curl_easy_cleanup(xfer->handle);
@@ -687,6 +694,18 @@ ERROR:
        return r;
 }
 
+int pakfire_xfer_set_payload(struct pakfire_xfer* self, const char* payload) {
+       if (self->payload) {
+               free(self->payload);
+               self->payload = NULL;
+       }
+
+       // Store the new payload
+       self->payload = strdup(payload);
+
+       return 0;
+}
+
 static void pakfire_xfer_reset_output(struct pakfire_xfer* xfer) {
        if (xfer->fin) {
                fclose(xfer->fin);
@@ -1657,6 +1676,15 @@ int pakfire_xfer_prepare(struct pakfire_xfer* xfer, struct pakfire_progress* pro
                }
        }
 
+       // Add any payload
+       if (xfer->payload) {
+               r = curl_easy_setopt(xfer->handle, CURLOPT_POSTFIELDS, xfer->payload);
+               if (r) {
+                       ERROR(xfer->ctx, "Could not set POST payload: %s\n", curl_easy_strerror(r));
+                       return r;
+               }
+       }
+
        // Authentication
        if (xfer->auth) {
                // Request SPNEGO
index f74e28324aca6f40acd05e1ed874a42a112a49cd..1dd2d167699fd4cab6451074c46cc66c6032abf2 100644 (file)
@@ -120,6 +120,8 @@ int pakfire_xfer_add_query(struct pakfire_xfer* xfer,
 int pakfire_xfer_add_param(struct pakfire_xfer* xfer,
        const char* key, const char* format, ...) __attribute__((format(printf, 3, 4)));
 
+int pakfire_xfer_set_payload(struct pakfire_xfer* self, const char* payload);
+
 // Output
 int pakfire_xfer_set_output(struct pakfire_xfer* xfer, FILE* f);
 int pakfire_xfer_set_output_buffer(struct pakfire_xfer* xfer, char** buffer, size_t* length);