]> git.ipfire.org Git - pakfire.git/commitdiff
xfer: Refactor handling any transfer problems and call the close callback
authorMichael Tremer <michael.tremer@ipfire.org>
Tue, 13 Aug 2024 17:32:26 +0000 (17:32 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Tue, 13 Aug 2024 17:32:26 +0000 (17:32 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/include/pakfire/xfer.h
src/libpakfire/xfer.c

index 7a7a1a1ccff0e04fd5da1cf1022f8f77dd9b063e..30fa6adeb7d56f57620245a9c8ff4cd1f3cb5632 100644 (file)
@@ -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);
index f11991764b8b12d5862d10f29437ae11359bbad0..a4cd69876f3fe8e59987160f68f1ac3f9d3dcdb5 100644 (file)
@@ -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,