From: Michael Tremer Date: Sat, 21 Jun 2025 11:46:00 +0000 (+0000) Subject: xfer: Add a function to send a custom POST payload X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=697539eb30e2adcb5107c540238f95971c58954f;p=pakfire.git xfer: Add a function to send a custom POST payload Signed-off-by: Michael Tremer --- diff --git a/src/pakfire/xfer.c b/src/pakfire/xfer.c index f298cc31..583cab29 100644 --- a/src/pakfire/xfer.c +++ b/src/pakfire/xfer.c @@ -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 diff --git a/src/pakfire/xfer.h b/src/pakfire/xfer.h index f74e2832..1dd2d167 100644 --- a/src/pakfire/xfer.h +++ b/src/pakfire/xfer.h @@ -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);