From 718a040d1500fed3bba37c6bf64ae135767374b6 Mon Sep 17 00:00:00 2001 From: Kevin Jerebica Date: Sun, 8 Sep 2024 22:00:58 +0200 Subject: [PATCH] proxy: begin transition from regex to parslib --- .gitmodules | 3 + Makefile | 12 +- parslib | 1 + proxlib | Bin 104944 -> 138880 bytes proxlib.c | 395 ++++++++++++++++++++-------------------------------- proxlib.h | 24 +++- 6 files changed, 181 insertions(+), 254 deletions(-) create mode 100644 .gitmodules create mode 160000 parslib diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..fb2f78f --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "parslib"] + path = parslib + url = http://git.0xdeadbeer.xyz/0xdeadbeer/parslib diff --git a/Makefile b/Makefile index 6ff3625..912d294 100644 --- a/Makefile +++ b/Makefile @@ -1,14 +1,16 @@ CC=bear --append -- gcc CFLAGS= -g3 -Wall -Werror +CFILES=proxlib.c +CFILES_PARSLIB=parslib/parslib.final.o +OUT=proxlib all: proxlib -proxy: proxlib.c - $(CC) $(CFLAGS) -o proxlib.o -c proxlib.c - $(CC) $(CFLAGS) -o proxlib proxlib.o +proxlib: $(CFILES) $(CFILES_PARSLIB) + $(CC) $(CFLAGS) -o $(OUT) $^ clean: - rm -f proxlib *.o + rm -f $(OUT) tar: - tar -cvzf proxlib.tgz proxlib.c proxlib.h README Makefile + tar -cvzf proxlib.tgz $(CFILES) README Makefile diff --git a/parslib b/parslib new file mode 160000 index 0000000..678a442 --- /dev/null +++ b/parslib @@ -0,0 +1 @@ +Subproject commit 678a44228fe0c5b24b2d1b96576da0e44211c364 diff --git a/proxlib b/proxlib index 0af840b29d01dcb8334c06c9a160feabed1a034b..201f776bf785918b30ec0269d6671fd5f1549bfb 100755 GIT binary patch literal 138880 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%0DNNcy4bZeeQN-+~Zm8G>W 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 #include #include -#include #include "proxlib.h" +#include "parslib/parslib.h" int on = 1; -int debug = 1; +int debug = 2; struct request *clt_data; -regex_t preg; -regmatch_t pmatch[REGEX_MATCHN]; int statem; int clt_sock = -1; int srv_sock = -1; -char *clt_msg = NULL; -char *srv_msg = NULL; -int clt_msg_len = 0; -int srv_msg_len = 0; -void *extractsub(const char *msg, regmatch_t match) { - void *buf = NULL; - int buflen = match.rm_eo - match.rm_so; - if (!buflen) - goto _return; +#define SEGMENT_LEN 512 +#define MAX_BUFF_LEN 128 * 1024 +int _read_line(int fd, char **outbuff) { + char tmp_buff[SEGMENT_LEN]; + int tmp_buff_len = 0; + char *output_buff = NULL; + int output_buff_len = 0; + char *ptr = NULL; + int whead_pos = 0; + char *whead = NULL; + int diff = 0; + int ret = 0; + int end = 0; - buf = (void *) calloc(1, buflen); - if (buf == NULL) - goto _return; + while (!end) { + ret = recv(fd, tmp_buff, SEGMENT_LEN, MSG_PEEK); + if (ret <= 0) { + break; + } - sprintf(buf, "%.*s", buflen, &msg[match.rm_so]); + ptr = strstr(tmp_buff, "\r\n"); + if (ptr >= tmp_buff+SEGMENT_LEN) { + diff = ret; + } else { + diff = ptr - tmp_buff + 2; + end = 1; + } -_return: - return buf; -} + tmp_buff_len = diff; + whead_pos = output_buff_len; + output_buff_len += tmp_buff_len; -int parse_header(char *msgbuff) { - int ret; + if (tmp_buff_len > MAX_BUFF_LEN) { + return -1; + } - ret = regcomp(&preg, REGEX_HEADER, REG_EXTENDED); - if (ret != 0) - goto _err; + output_buff = (char *) realloc(output_buff, output_buff_len); + if (!output_buff) { + return -1; + } - ret = regexec(&preg, msgbuff, REGEX_MATCHN, pmatch, 0); - if (ret != 0) - goto _ok; - - char *key = extractsub(msgbuff, pmatch[1]); - if (key == NULL) - goto _err; - - char *value = extractsub(msgbuff, pmatch[2]); - if (value == NULL) - goto _err; - - struct header new_header = { - .key = key, - .value = value - }; - - int last_index = clt_data->header_num; - - clt_data->header_num++; - clt_data->headers = (void *) realloc(clt_data->headers, - clt_data->header_num*sizeof(struct header)); - - clt_data->headers[last_index] = new_header; - -_ok: - regfree(&preg); - return 0; - -_err: - regfree(&preg); - return -1; -} - -int parse_host(char *buff) { - int ret; - - ret = regcomp(&preg, REGEX_HOST, REG_EXTENDED); - if (ret != 0) - goto _err; - - ret = regexec(&preg, buff, REGEX_MATCHN, pmatch, 0); - if (ret != 0) - goto _err; - - char *host_name = extractsub(buff, pmatch[1]); - if (!host_name) - goto _err; - - char *host_port = extractsub(buff, pmatch[2]); - if (!host_port) { - host_port = PROXY_DEF_PORT; + whead = output_buff+whead_pos; + ret = recv(fd, whead, diff, 0); + if (ret <= 0) { + break; + } } - clt_data->host_name = host_name; - clt_data->host_port = host_port; - - regfree(&preg); - return 0; - -_err: - regfree(&preg); - return -1; + *outbuff = output_buff; + return output_buff_len; } -int parse_title(char *msgbuff) { - int ret; +/* easy wrapper for _read_line(int fd, void **outbuff) */ +int read_line(int fd, + int *line_len, char **line, + int *msgbuff_len, char **msgbuff) { + int ret = 0; - ret = regcomp(&preg, REGEX_TITLE, REG_EXTENDED); - if (ret != 0) - goto _err; - - ret = regexec(&preg, msgbuff, REGEX_MATCHN, pmatch, 0); - if (ret != 0) - goto _err; - - clt_data->method = extractsub(msgbuff, pmatch[1]); - if (clt_data->method == NULL) - goto _err; - - clt_data->uri = extractsub(msgbuff, pmatch[2]); - if (clt_data->uri == NULL) - goto _err; - - clt_data->ver = extractsub(msgbuff, pmatch[3]); - if (clt_data->ver == NULL) - goto _err; - - regfree(&preg); - return 0; - -_err: - regfree(&preg); - return -1; - -} - -void free_host(void) { - free(clt_data->host_name); - free(clt_data->host_port); -} - -void free_title(void) { - free(clt_data->method); - free(clt_data->uri); - free(clt_data->ver); -} - -void free_headers(void) { - for (int i = 0; i < clt_data->header_num; i++) { - struct header *header = &clt_data->headers[i]; - free(header->key); - free(header->value); + ret = *line_len = _read_line(fd, line); + if (ret < 0) { + return -1; } - free(clt_data->headers); -} -void free_clt_data(void) { - free_host(); - free_title(); - free_headers(); - free(clt_data); -} + *msgbuff = (char *) realloc(*msgbuff, *msgbuff_len+*line_len); + if (!*msgbuff) { + free(*line); + return -1; + } -void free_srv_data(void) { + memcpy(*msgbuff+*msgbuff_len, *line, *line_len); -} + *msgbuff_len += *line_len; + ((char *) *line)[(*line_len)-2] = '\0'; + *line_len -= 2; -void free_msg_buffs(void) { - free(clt_msg); - free(srv_msg); -} - -void free_data(void) { - free_clt_data(); - free_srv_data(); + return 0; } int parse_line(char *line, int line_count) { int ret = 0; - if (line_count == 0) { - ret = parse_title(line); - } else { - ret = parse_header(line); - } - return ret; } @@ -218,7 +123,7 @@ void do_err(void) { } int do_fwd_clt(void) { - int bytes = 0; + /*int bytes = 0; int ret = 0; while (bytes < srv_msg_len) { ret = write(clt_sock, srv_msg+bytes, srv_msg_len-bytes); @@ -226,7 +131,7 @@ int do_fwd_clt(void) { return -1; bytes += ret; - } + }*/ return 0; } @@ -238,7 +143,7 @@ int do_prs_srv(void) { } int do_rcv_srv(void) { - int bytes = 0; + /*int bytes = 0; int ret = 0; while (bytes < PROXY_MAX_MSGLEN) { ret = recv(srv_sock, srv_msg+bytes, PROXY_MAX_MSGLEN-bytes, MSG_PEEK); @@ -253,21 +158,18 @@ int do_rcv_srv(void) { srv_msg_len = bytes; - if (debug) + if (debug == 1) fprintf(stdout, "[%d] Received server message of size %d bytes\n", statem, srv_msg_len); + */ return 0; } +// TODO int do_con_srv(void) { int ret; - char *host = getheader("Host"); - if (!host) - return -1; - ret = parse_host(host); - if (ret < 0) - return -1; + // MISSING HOST struct addrinfo hints; struct addrinfo *res; @@ -293,7 +195,7 @@ int do_con_srv(void) { } int do_fwd_srv(void) { - int bytes = 0; + /*int bytes = 0; int ret = 0; while (bytes < clt_msg_len) { ret = write(srv_sock, clt_msg+bytes, clt_msg_len-bytes); @@ -301,97 +203,102 @@ int do_fwd_srv(void) { return -1; bytes += ret; - } + }*/ return 0; } -int do_prs_clt(void) { - int ret; - int ln_cnt = 0; - - char *ln = strdup(clt_msg); - if (!ln) - return -1; - - ln = strtok(ln, "\n"); - while (ln) { - ret = parse_line(ln, ln_cnt); - if (ret < 0) - return -1; - - ln_cnt++; - ln = strtok(NULL, "\n"); - } - - return 0; -} - -int do_rcv_clt(void) { - int bytes = 0; +int do_rcv_clt(struct conn *conn) { int ret = 0; - while (bytes < PROXY_MAX_MSGLEN) { - ret = recv(clt_sock, clt_msg+bytes, PROXY_MAX_MSGLEN-bytes, MSG_PEEK); - if (ret < 0) - return -1; - if (!ret) - break; + char *line = NULL; + char *msgbuff = NULL; + int line_len = 0; + int msgbuff_len = 0; - ret = recv(clt_sock, clt_msg+bytes, PROXY_MAX_MSGLEN-bytes, 0); - - bytes += ret; + // request line + ret = read_line(conn->cltfd, &line_len, &line, &msgbuff_len, &msgbuff); + if (ret < 0) { + fprintf(stderr, "Failed receiving request line\n"); + return -1; } - clt_msg_len = bytes; + if (debug == 1) { + fprintf(stdout, "debug - received line: %s\n", line); + } - if (debug) - fprintf(stdout, "[%d] Received client message of size %d bytes\n", statem, clt_msg_len); + ret = pareqtitl(line, line_len, &(conn->cltreq.titl)); + if (ret < 0) { + fprintf(stderr, "Failed parsing request line\n"); + return -1; + } + + if (debug == 1) { + fprintf(stdout, "debug - parsed request line\n"); + } + + free(line); + + // headers + int next_header = 1; + 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; + } + + if (line_len == 0) { + if (debug == 1) { + fprintf(stdout, "debug - reached end of headers\n"); + } + next_header = 0; + continue; + } + + if (debug == 1) { + fprintf(stdout, "debug - received line: %s\n", line); + } + + ret = parshfield(line, line_len, conn->cltreq.hentries); + if (ret < 0) { + fprintf(stderr, "Failed parsing header field\n"); + return -1; + } + + if (debug == 1) { + fprintf(stdout, "debug - parsed header field\n"); + } + + free(line); + } + + if (debug <= 2) { + fprintf(stdout, "printing parsed request\n"); + printfpareq(&conn->cltreq); + } return 0; } -int do_alloc(void) { - clt_msg = (char *) calloc(1, PROXY_MAX_MSGLEN); - if (!clt_msg) - return -1; - - srv_msg = (char *) calloc(1, PROXY_MAX_MSGLEN); - if (!srv_msg) - return -1; - - clt_data = (struct request *) calloc(1, sizeof(struct request)); - if (!clt_data) - return -1; - - return 0; -} - void do_clear(void) { statem = STATEM_RCV_CLT; - - memset(clt_msg, 0, PROXY_MAX_MSGLEN); - memset(srv_msg, 0, PROXY_MAX_MSGLEN); - memset(clt_data, 0, sizeof(struct request)); - - clt_msg_len = 0; - srv_msg_len = 0; } void do_statem() { - int ret = do_alloc(); - if (ret < 0) { - do_err(); - return; + int ret = 0; + struct conn *conn = (struct conn *) calloc(1, sizeof(struct conn)); + if (!conn) { + fprintf(stderr, "Not enough dynamic memory to establish connection\n"); + return; } - + + conn->cltfd = clt_sock; + for (int counter = 0; counter < MAX_BOUND; counter++) { switch (statem & (~STATEM_ERR)) { case STATEM_RCV_CLT: - ret = do_rcv_clt(); + ret = do_rcv_clt(conn); break; - case STATEM_PRS_CLT: - ret = do_prs_clt(); - break; case STATEM_CON_SRV: ret = do_con_srv(); break; @@ -401,15 +308,12 @@ void do_statem() { case STATEM_RCV_SRV: ret = do_rcv_srv(); break; - case STATEM_PRS_SRV: - ret = do_prs_srv(); - break; case STATEM_FWD_CLT: ret = do_fwd_clt(); break; default: ret = -1; - break; + break; } if (ret < 0) @@ -428,8 +332,7 @@ void do_statem() { statem <<= 1; } - free_msg_buffs(); - free_data(); + free(conn); } void dohelp() { @@ -566,6 +469,12 @@ int main(int argc, char *argv[]) { return 0; } + ret = initres(); + if (ret < 0) { + fprintf(stderr, "Failed generating trees\n"); + return -1; + } + const char *mode = argv[1]; ret = strcmp(mode, SERVER_MODE); if (ret == 0) @@ -576,4 +485,6 @@ int main(int argc, char *argv[]) { return do_clt(); fprintf(stderr, "Unknown proxy mode\n"); + + fretres(); } diff --git a/proxlib.h b/proxlib.h index 61aeaea..408a9a4 100644 --- a/proxlib.h +++ b/proxlib.h @@ -1,7 +1,11 @@ #ifndef STRUCTS_H #define STRUCTS_H +#include "parslib/parslib.h" + +#ifndef MAX_BOUND #define MAX_BOUND 10000 +#endif #define SERVER_MODE "server" #define CLIENT_MODE "client" @@ -22,13 +26,11 @@ "Host: archive.0xdeadbeer.org\r\n"\ #define STATEM_RCV_CLT 0b00000001 -#define STATEM_PRS_CLT 0b00000010 -#define STATEM_CON_SRV 0b00000100 -#define STATEM_FWD_SRV 0b00001000 -#define STATEM_RCV_SRV 0b00010000 -#define STATEM_PRS_SRV 0b00100000 -#define STATEM_FWD_CLT 0b01000000 -#define STATEM_ERR 0b10000000 +#define STATEM_CON_SRV 0b00000010 +#define STATEM_FWD_SRV 0b00000100 +#define STATEM_RCV_SRV 0b00001000 +#define STATEM_FWD_CLT 0b00010000 +#define STATEM_ERR 0b00100000 struct header { char *key; @@ -46,4 +48,12 @@ struct request { struct header *headers; }; +struct conn { + int cltfd; + int srvfd; + + struct httpareq cltreq; + struct httpares srvres; +}; + #endif