From be4e07922ad20920d003ef296ffd6e79f24e3c12 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Thu, 13 Feb 2025 16:59:02 +0000 Subject: [PATCH] xfer: Ensure that we will always send the entire message before starting the next one Signed-off-by: Michael Tremer --- src/pakfire/xfer.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/src/pakfire/xfer.c b/src/pakfire/xfer.c index e126edcc..a1bd174f 100644 --- a/src/pakfire/xfer.c +++ b/src/pakfire/xfer.c @@ -1675,16 +1675,12 @@ static int pakfire_xfer_store_message(struct pakfire_xfer* self, /* This function sends a WebSocket message */ -int pakfire_xfer_send_message(struct pakfire_xfer* xfer, +static int __pakfire_xfer_send_message(struct pakfire_xfer* xfer, const char* message, const size_t length) { size_t bytes_sent = 0; size_t offset = 0; int r = 0; - // XXX We need to protect against sending a new message - // when there is still something in the send buffer - // Should we just send the previous message before we send this one? - // Send the message while (offset < length) { r = curl_ws_send(xfer->handle, message + offset, length - offset, @@ -1720,6 +1716,23 @@ int pakfire_xfer_send_message(struct pakfire_xfer* xfer, return r; } +int pakfire_xfer_send_message(struct pakfire_xfer* self, + const char* message, const size_t length) { + int r; + + // Send any left over fragments from a previous message before sending a new one + if (self->send_buffer.length) { + r = __pakfire_xfer_send_message(self, self->send_buffer.data, self->send_buffer.length); + if (r < 0) { + ERROR(self->ctx, "Failed to send previous fragment: %s\n", strerror(-r)); + return r; + } + } + + // Send the actual message + return __pakfire_xfer_send_message(self, message, length); +} + int pakfire_xfer_is_ready_to_send(struct pakfire_xfer* self) { // This function is only supported for sockets switch (self->direction) { -- 2.39.5