diff options
author | tiptorrent development team <tiptorrent@soleta.eu> | 2021-09-17 16:45:52 +0200 |
---|---|---|
committer | tiptorrent development team <tiptorrent@soleta.eu> | 2021-09-29 15:48:43 +0200 |
commit | 16cc92dab608a3c83d9c1baa4dbdca307da12c9c (patch) | |
tree | 9c2bd5d3a7697aeca3ef314898fae03047a0576e /src/handler.c | |
parent | dab82c806f35c671f87ea60087b19e3781b35a29 (diff) |
allow to report that a client allows redirection with POST method
If clients sends POST /test, it notifies the server that it is
available for receive redirections from file 'test'.
Test it with wget:
wget --post-data '' http://localhost:9999/TEST -O /dev/null
Diffstat (limited to 'src/handler.c')
-rw-r--r-- | src/handler.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/src/handler.c b/src/handler.c index 5bcef6b..14abe9b 100644 --- a/src/handler.c +++ b/src/handler.c @@ -74,6 +74,10 @@ int tip_client_state_process_payload(struct tip_client *cli) cli->method = TIP_METHOD_HEAD; if (sscanf(cli->buf, "HEAD %31s HTTP/1.1", uri) != 1) return tip_client_method_not_found(cli); + } else if (!strncmp(cli->buf, "POST", strlen("POST"))) { + cli->method = TIP_METHOD_POST; + if (sscanf(cli->buf, "POST %31s HTTP/1.1", uri) != 1) + return tip_client_method_not_found(cli); } else { return tip_client_method_not_found(cli); } @@ -102,7 +106,16 @@ int tip_client_state_process_payload(struct tip_client *cli) cli->path = strdup(path); cli->size = st.st_size; - if (cli->method == TIP_METHOD_HEAD) { + switch (cli->method) { + case TIP_METHOD_GET: + break; + case TIP_METHOD_HEAD: + cli->state = TIP_CLIENT_PROCESSING_REQUEST_2; + return 0; + case TIP_METHOD_POST: + cli->allow_redirect = true; + tip_client_redirect_create(cli); + tip_client_activate_pending(); cli->state = TIP_CLIENT_PROCESSING_REQUEST_2; return 0; } @@ -143,6 +156,9 @@ int tip_client_state_process_payload_reply(struct tip_client *cli) if (fd < 0) return tip_client_file_not_found(cli); + if (cli->method == TIP_METHOD_POST) + cli->size = 0; + snprintf(buf, sizeof(buf), "HTTP/1.1 200 OK\r\nContent-Length: %lu\r\n\r\n", cli->size); @@ -155,6 +171,7 @@ int tip_client_state_process_payload_reply(struct tip_client *cli) cli->state = TIP_CLIENT_PROCESSING_REQUEST_3; break; case TIP_METHOD_HEAD: + case TIP_METHOD_POST: /* close connection. */ return 1; } |