summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortiptorrent development team <tiptorrent@soleta.eu>2021-09-27 11:27:30 +0200
committertiptorrent development team <tiptorrent@soleta.eu>2021-09-29 15:49:21 +0200
commit6010fe62fda49ffb6a3fa7038b0c2feb61767263 (patch)
tree6551b45191468e49585d4efdb8b623bf9748db19
parent6a81079dc1a9d4deea7d8faa787baed2ffe80556 (diff)
download checksum file directly from server
Remove assumption on small file to shortcircuit the redirect logic.
-rw-r--r--src/core.c4
-rw-r--r--src/core.h7
-rw-r--r--src/handler.c8
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++;