From 6010fe62fda49ffb6a3fa7038b0c2feb61767263 Mon Sep 17 00:00:00 2001 From: tiptorrent development team Date: Mon, 27 Sep 2021 11:27:30 +0200 Subject: download checksum file directly from server Remove assumption on small file to shortcircuit the redirect logic. --- src/core.c | 4 ++-- src/core.h | 7 +++---- src/handler.c | 8 +++++++- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/core.c b/src/core.c index 113eb1e..45853d9 100644 --- a/src/core.c +++ b/src/core.c @@ -49,7 +49,7 @@ static void tip_client_release(struct ev_loop *loop, struct tip_client *cli) free((void *)cli->path); if (cli->method == TIP_METHOD_GET) { - if (tip_client_large_file(cli)) { + if (!tip_client_checksum_file(cli)) { num_clients--; if (!cli->redirect) tip_client_activate_pending(false); @@ -192,7 +192,7 @@ static void tip_client_read_cb(struct ev_loop *loop, struct ev_io *io, int event } return; shutdown: - if (cli->size > FILE_SIZE_THRESHOLD) + if (!tip_client_checksum_file(cli)) tip_client_redirect_create(cli); close: tip_client_release(loop, cli); diff --git a/src/core.h b/src/core.h index 0a82d2e..67c9af7 100644 --- a/src/core.h +++ b/src/core.h @@ -15,8 +15,6 @@ extern const char *root; extern int max_clients; extern int num_clients; extern bool redirect; -/* max_client logic only applies for files larger than 1024 bytes. */ -#define FILE_SIZE_THRESHOLD 1024ULL enum tip_client_state { TIP_CLIENT_PENDING = 0, @@ -50,6 +48,7 @@ struct tip_client { enum tip_http_method method; const char *uri; const char *path; + bool checksum; uint32_t chunk; off_t size; off_t left; @@ -67,9 +66,9 @@ static inline int tip_client_socket(const struct tip_client *cli) return cli->io.fd; } -static inline bool tip_client_large_file(const struct tip_client *cli) +static inline bool tip_client_checksum_file(const struct tip_client *cli) { - return cli->size > FILE_SIZE_THRESHOLD; + return cli->checksum; } void tip_client_pending(struct tip_client *cli); diff --git a/src/handler.c b/src/handler.c index 3f15e4f..97f54b5 100644 --- a/src/handler.c +++ b/src/handler.c @@ -106,6 +106,12 @@ int tip_client_state_process_payload(struct tip_client *cli) if (!redirect) break; + /* skip checksum files. */ + if (strstr(uri, ".full.sum")) { + cli->checksum = true; + break; + } + /* get chunk number from file extension, e.g. FILE.0 */ chunk = strchr(uri, '.'); if (chunk) { @@ -150,7 +156,7 @@ int tip_client_state_process_payload(struct tip_client *cli) return 0; } - if (tip_client_large_file(cli)) { + if (!tip_client_checksum_file(cli)) { cli->allow_redirect = allow_redirect; num_clients++; -- cgit v1.2.3-18-g5258