From 009913283ca23e216df11ed67449374ad0688fc9 Mon Sep 17 00:00:00 2001 From: Kevin Jerebica Date: Sun, 15 Sep 2024 01:52:51 +0200 Subject: [PATCH] feat: cover chunked encoding for body segmentation --- proxlib | Bin 139312 -> 144840 bytes proxlib.c | 283 ++++++++++++++++++++++++++++++++---------------------- proxlib.h | 43 +++++++-- 3 files changed, 205 insertions(+), 121 deletions(-) diff --git a/proxlib b/proxlib index f37cdbe83635eea3953accd74fe399e7d9dba400..7093a678e549ccfbe6157e098464a1239926082f 100755 GIT binary patch delta 52162 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 IqboE0A54-vWB>pF delta 46465 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, conn->srvbuff+bytes, conn->srvbuff_len-bytes); if (ret < 0) return -1; - bytes += ret; } @@ -128,8 +203,7 @@ int do_rcv_srv(struct conn *conn) { // response line ret = read_line(conn->srvfd, &line_len, &line, &msgbuff_len, &msgbuff); if (ret < 0) { - fprintf(stderr, "Failed receiving response line from upstream\n"); - return -1; + return err_recv; } if (debug == 1) { @@ -138,8 +212,7 @@ int do_rcv_srv(struct conn *conn) { ret = parestitl(line, line_len, &(conn->srvres.titl)); if (ret < 0) { - fprintf(stderr, "Failed parsing response line\n"); - return -1; + return err_parstitle; } if (debug == 1) { @@ -153,8 +226,7 @@ int do_rcv_srv(struct conn *conn) { while (next_header) { ret = read_line(conn->srvfd, &line_len, &line, &msgbuff_len, &msgbuff); if (ret < 0) { - fprintf(stderr, "Failed receiving header line\n"); - return -1; + return err_recv; } if (line_len == 0) { @@ -171,8 +243,7 @@ int do_rcv_srv(struct conn *conn) { ret = parshfield(line, line_len, conn->srvres.hentries); if (ret < 0) { - fprintf(stderr, "Failed parsing header field\n"); - return -1; + return err_parsheader; } if (debug == 1) { @@ -183,58 +254,33 @@ int do_rcv_srv(struct conn *conn) { } // body -body: struct httpares *res = &conn->srvres; struct point *content_length_entry = &res->hentries[header_content_length]; - if (content_length_entry->er == NULL) { - fprintf(stderr, "[upstream] no content length header\n"); - return -1; - } - - int content_length = 0; - ret = stoin(content_length_entry->er, content_length_entry->len, &content_length); - if (ret < 0) { - fprintf(stderr, "[upstream] failed parsing content length header\n"); - return -1; - } - - line_len = content_length; - line = (char *) calloc(1, line_len); - if (!line) { - fprintf(stderr, "[upstream] not enough dynamic memory\n"); - return -1; - } - - int bytes = 0; - do { - ret = recv(conn->srvfd, line+bytes, line_len-bytes, MSG_WAITALL); + struct point *transfer_encoding_entry = &res->hentries[header_transfer_encoding]; + if (content_length_entry->er) { + int content_length = 0; + + ret = stoin(content_length_entry->er, content_length_entry->len, &content_length); if (ret < 0) { - fprintf(stderr, "[upstream] failed reading body from response\n"); - return -1; + return err_pars; } - bytes += ret; - } while (bytes < line_len); - msgbuff = (char *) realloc(msgbuff, msgbuff_len+line_len); - if (!msgbuff) { - fprintf(stderr, "[upstream] not enough dynamic memory\n"); - return -1; - } - - memcpy(msgbuff+msgbuff_len, line, line_len); - msgbuff_len += line_len; - - if (debug <= 2) { - fprintf(stdout, "------------------------------\n"); - fprintf(stdout, "debug - [upstream] received body %d: %.*s\n", line_len, line_len, line); - fprintf(stdout, "------------------------------\n"); - } - - if (debug <= 2) { - fprintf(stdout, "printing parsed response\n"); - printfpares(&conn->srvres); + ret = pull_content_length(conn->srvfd, content_length, &msgbuff_len, &msgbuff); + if (ret < 0) { + return err_recv; + } + fprintf(stdout, "Successfully received normal body from server\n"); + } else if (transfer_encoding_entry->er && strcmp(transfer_encoding_entry->er, "chunked") == 0) { + ret = pull_chunked_encoding(conn->srvfd, &msgbuff_len, &msgbuff); + if (ret < 0) { + return err_recv; + } + fprintf(stdout, "Successfully received chunked body from server\n"); + } else { + return err_support; } + fprintf(stdout, "srvbuff:%p+srvbuff_len:%d\n", conn->srvbuff, conn->srvbuff_len); conn->srvbuff = msgbuff; conn->srvbuff_len = msgbuff_len; @@ -246,23 +292,17 @@ int do_con_srv(struct conn *conn) { struct httpareq *req = &conn->cltreq; struct point *host = &req->hentries[header_host]; if (host->er == NULL) { - if (debug <= 2) { - fprintf(stderr, "debug - request does not have HOST header\n"); - } - goto _exit; + return err_pars; } struct hostinfo *info = (struct hostinfo *) calloc(1, sizeof(struct hostinfo)); if (!info) { - goto _exit; + return err_mem; } ret = pahostinfo(host->er, host->len, info); if (ret < 0) { - if (debug <= 2) { - fprintf(stderr, "Failed parsing upstream host header\n"); - } - goto _exit_hostinfo; + return err_pars; } if (debug <= 2) { @@ -278,27 +318,31 @@ int do_con_srv(struct conn *conn) { ret = getaddrinfo(info->hostname, info->service, &hints, &res); if (ret < 0) { - goto _exit_hostinfo; + free(info->hostname); + free(info->service); + free(info); + return err_pars; } ret = conn->srvfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol); if (ret < 0) { - goto _exit_getaddrinfo; + freeaddrinfo(res); + free(info->hostname); + free(info->service); + free(info); + return err_pars; } ret = connect(conn->srvfd, res->ai_addr, res->ai_addrlen); if (ret < 0) { - goto _exit_getaddrinfo; + freeaddrinfo(res); + free(info->hostname); + free(info->service); + free(info); + return err_pars; } -_exit_getaddrinfo: - freeaddrinfo(res); -_exit_hostinfo: - free(info->hostname); - free(info->service); - free(info); -_exit: return ret; } @@ -309,7 +353,6 @@ int do_fwd_srv(struct conn *conn) { ret = write(conn->srvfd, conn->cltbuff+bytes, conn->cltbuff_len-bytes); if (ret < 0) return -1; - bytes += ret; } @@ -324,24 +367,23 @@ int do_rcv_clt(struct conn *conn) { int msgbuff_len = 0; // request line + fprintf(stdout, "debug - listening for new lines from client\n"); ret = read_line(conn->cltfd, &line_len, &line, &msgbuff_len, &msgbuff); if (ret < 0) { - fprintf(stderr, "Failed receiving request line\n"); - return -1; + return err_recv; } if (debug == 1) { - fprintf(stdout, "debug - received line: %s\n", line); + fprintf(stdout, "debug - received line of %d bytes from client\n", line_len); } ret = pareqtitl(line, line_len, &(conn->cltreq.titl)); if (ret < 0) { - fprintf(stderr, "Failed parsing request line\n"); - return -1; + return err_parstitle; } if (debug == 1) { - fprintf(stdout, "debug - parsed request line\n"); + fprintf(stdout, "[do_rcv_clt] parsed request line\n"); } free(line); @@ -351,13 +393,12 @@ int do_rcv_clt(struct conn *conn) { while (next_header) { ret = read_line(conn->cltfd, &line_len, &line, &msgbuff_len, &msgbuff); if (ret < 0) { - fprintf(stderr, "Failed receiving header line\n"); - return -1; + return err_recv; } if (line_len == 0) { if (debug == 1) { - fprintf(stdout, "debug - reached end of headers\n"); + fprintf(stdout, "[do_rcv_clt] reached end of headers for the client\n"); } next_header = 0; continue; @@ -369,8 +410,7 @@ int do_rcv_clt(struct conn *conn) { ret = parshfield(line, line_len, conn->cltreq.hentries); if (ret < 0) { - fprintf(stderr, "Failed parsing header field\n"); - return -1; + return err_parsheader; } if (debug == 1) { @@ -381,13 +421,31 @@ int do_rcv_clt(struct conn *conn) { } // body - // TODO + struct httpareq *req = &conn->cltreq; + struct point *content_length_entry = &req->hentries[header_content_length]; + struct point *transfer_encoding_entry = &req->hentries[header_transfer_encoding]; + if (content_length_entry->er) { + int content_length = 0; - if (debug <= 2) { - fprintf(stdout, "printing parsed request\n"); - printfpareq(&conn->cltreq); - } + ret = stoin(content_length_entry->er, content_length_entry->len, &content_length); + if (ret < 0) { + return err_pars; + } + ret = pull_content_length(conn->srvfd, content_length, &msgbuff_len, &msgbuff); + if (ret < 0) { + return err_recv; + } + + fprintf(stdout, "Successfully received normal body from server\n"); + } else if (transfer_encoding_entry->er && strcmp(transfer_encoding_entry->er, "chunked") == 0) { + ret = pull_chunked_encoding(conn->srvfd, &msgbuff_len, &msgbuff); + if (ret < 0) { + return err_recv; + } + fprintf(stdout, "Successfully received chunked body from server\n"); + } + conn->cltbuff = msgbuff; conn->cltbuff_len = msgbuff_len; @@ -395,7 +453,7 @@ int do_rcv_clt(struct conn *conn) { } void do_clear(struct conn *conn) { - statem = STATEM_RCV_CLT; + statem = state_rcv_clt; frepareq(&conn->cltreq); frepares(&conn->srvres); free(conn->cltbuff); @@ -406,38 +464,39 @@ void do_statem(struct conn *conn) { int ret = 0; for (int counter = 0; counter < MAX_BOUND; counter++) { - switch (statem & (~STATEM_ERR)) { - case STATEM_RCV_CLT: + switch (statem) { + case state_rcv_clt: ret = do_rcv_clt(conn); break; - case STATEM_CON_SRV: + case state_con_srv: ret = do_con_srv(conn); break; - case STATEM_FWD_SRV: + case state_fwd_srv: ret = do_fwd_srv(conn); break; - case STATEM_RCV_SRV: + case state_rcv_srv: ret = do_rcv_srv(conn); break; - case STATEM_FWD_CLT: + case state_fwd_clt: ret = do_fwd_clt(conn); break; } - if (ret < 0) - statem |= STATEM_ERR; + if (ret > 0) { + err = ret; + } - if (statem & STATEM_ERR) { + if (err) { do_err(); break; } - if (statem & STATEM_FWD_CLT) { + if (statem == state_fwd_clt) { do_clear(conn); continue; } - statem <<= 1; + statem++; } } @@ -512,14 +571,10 @@ int do_srv(void) { } conn->cltfd = new_clt_sock; - statem = STATEM_RCV_CLT; + statem = state_rcv_clt; do_statem(conn); free(conn); - if (debug == 1) { - fprintf(stdout, "Finished proxying client\n"); - } - return 0; } diff --git a/proxlib.h b/proxlib.h index 3fc3243..88fe106 100644 --- a/proxlib.h +++ b/proxlib.h @@ -4,18 +4,47 @@ #include "parslib/parslib.h" #ifndef MAX_BOUND -#define MAX_BOUND 10000 +#define MAX_BOUND 100000000000 #endif #define PROXY_PORT 2020 #define PROXY_CONN 20 -#define STATEM_RCV_CLT 0b00000001 -#define STATEM_CON_SRV 0b00000010 -#define STATEM_FWD_SRV 0b00000100 -#define STATEM_RCV_SRV 0b00001000 -#define STATEM_FWD_CLT 0b00010000 -#define STATEM_ERR 0b00100000 +enum states { + state_rcv_clt = 0, + state_con_srv, + state_fwd_srv, + state_rcv_srv, + state_fwd_clt +}; + +enum errs { + err_generic = 1, + err_mem, + err_recv, + err_pars, + err_parstitle, + err_parsheader, + err_support +}; + +char *states_str[] = { + "state_rcv_clt", + "state_con_srv", + "state_fwd_srv", + "state_rcv_srv", + "state_fwd_clt" +}; + +char *errs_str[] = { + "err_generic", + "err_mem", + "err_recv", + "err_pars", + "err_parstitle", + "err_parsheader", + "err_support" +}; struct conn { int cltfd;