From: Michael Tremer Date: Tue, 13 Aug 2024 17:32:26 +0000 (+0000) Subject: xfer: Refactor handling any transfer problems and call the close callback X-Git-Tag: 0.9.30~1210 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=675fffe4f3ae2b45f6fb86e445ec4ed225597a6f;p=pakfire.git xfer: Refactor handling any transfer problems and call the close callback Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/include/pakfire/xfer.h b/src/libpakfire/include/pakfire/xfer.h index 7a7a1a1cc..30fa6adeb 100644 --- a/src/libpakfire/include/pakfire/xfer.h +++ b/src/libpakfire/include/pakfire/xfer.h @@ -121,7 +121,6 @@ int pakfire_xfer_auth(struct pakfire_xfer* xfer); int pakfire_xfer_prepare(struct pakfire_xfer* xfer, struct pakfire_progress* progress, int flags); pakfire_xfer_error_code_t pakfire_xfer_done(struct pakfire_xfer* xfer, int code); -int pakfire_xfer_fail(struct pakfire_xfer* xfer); pakfire_xfer_error_code_t pakfire_xfer_run(struct pakfire_xfer* xfer, int flags); pakfire_xfer_error_code_t pakfire_xfer_run_api_request( @@ -130,7 +129,7 @@ pakfire_xfer_error_code_t pakfire_xfer_run_api_request( // WebSocket typedef int (*pakfire_xfer_recv_callback)(struct pakfire_xfer* xfer, const char* message, const size_t size, void* data); typedef int (*pakfire_xfer_send_callback)(struct pakfire_xfer* xfer, const char* message, const size_t size, void* data); -typedef int (*pakfire_xfer_close_callback)(struct pakfire_xfer* xfer, void* data); +typedef int (*pakfire_xfer_close_callback)(struct pakfire_xfer* xfer, int code, void* data); int pakfire_xfer_socket(struct pakfire_xfer* xfer, pakfire_xfer_recv_callback recv, pakfire_xfer_send_callback send, pakfire_xfer_close_callback close, void* data); diff --git a/src/libpakfire/xfer.c b/src/libpakfire/xfer.c index f11991764..a4cd69876 100644 --- a/src/libpakfire/xfer.c +++ b/src/libpakfire/xfer.c @@ -1025,7 +1025,7 @@ static pakfire_xfer_error_code_t pakfire_xfer_code(CURLcode code, int http_statu } } -int pakfire_xfer_fail(struct pakfire_xfer* xfer) { +static int pakfire_xfer_fail(struct pakfire_xfer* xfer, int code) { int r; CTX_DEBUG(xfer->ctx, "Xfer failed\n"); @@ -1054,7 +1054,16 @@ int pakfire_xfer_fail(struct pakfire_xfer* xfer) { return -EAGAIN; } - return 0; + // Call the close callback for WebSockets + if (xfer->direction == PAKFIRE_XFER_SOCKET) { + if (xfer->callbacks.close) { + r = xfer->callbacks.close(xfer, code, xfer->callbacks.data); + if (r) + return r; + } + } + + return code; } pakfire_xfer_error_code_t pakfire_xfer_done(struct pakfire_xfer* xfer, int code) { @@ -1171,42 +1180,46 @@ pakfire_xfer_error_code_t pakfire_xfer_done(struct pakfire_xfer* xfer, int code) free(expected_hexdigest); // Make this download fail - r = pakfire_xfer_fail(xfer); + r = pakfire_xfer_fail(xfer, PAKFIRE_XFER_DIGEST_MISMATCH); if (r) - return r; - - return PAKFIRE_XFER_DIGEST_MISMATCH; + goto ERROR; } } - // Handle WebSockets separately - switch (xfer->direction) { - case PAKFIRE_XFER_SOCKET: - return pakfire_xfer_done_socket(xfer, code); + // All okay? + if (code == CURLE_OK) { + // Handle actions for different transfer types + switch (xfer->direction) { + case PAKFIRE_XFER_DOWNLOAD: + r = pakfire_xfer_save(xfer); + if (r) + goto ERROR; + break; - default: - break; - } + case PAKFIRE_XFER_SOCKET: + return pakfire_xfer_done_socket(xfer, code); - // Remove the handle - if (xfer->client) { - r = pakfire_httpclient_remove_xfer(xfer->client, xfer); - if (r) - return r; - } + default: + break; + } // Handle any errors - if (code) { - r = pakfire_xfer_fail(xfer); - if (r) - return r; + } else { + // Convert the code + code = pakfire_xfer_code(code, code); // Report that something went wrong - return pakfire_xfer_code(code, response_code); + r = pakfire_xfer_fail(xfer, code); + if (r) + goto ERROR; } - // Otherwise save the file - return pakfire_xfer_save(xfer); +ERROR: + // Remove the handle + if (xfer->client) + pakfire_httpclient_remove_xfer(xfer->client, xfer); + + return r; } static int pakfire_xfer_update(void* data,