From 403ecb70b3bf58bdafefa4bbb8eebb349cad845b Mon Sep 17 00:00:00 2001 From: Kevin Jerebica Date: Mon, 9 Sep 2024 12:30:32 +0200 Subject: [PATCH] proxy: reintegrate do_con_srv parses host header entry, connects to resolved ip:port --- proxlib | Bin 132376 -> 138120 bytes proxlib.c | 69 ++++++++++++++++++++++++++++++++++++++++++------------ 2 files changed, 54 insertions(+), 15 deletions(-) diff --git a/proxlib b/proxlib index d91e37dec7571540130a323bcd50680388a1571d..9657c200e5b6215a05caf6af6bdaa50d3d1e80b2 100755 GIT binary patch delta 40932 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 delta 37412 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 diff --git a/proxlib.c b/proxlib.c index 2cbf03f..abd99b3 100644 --- a/proxlib.c +++ b/proxlib.c @@ -148,11 +148,34 @@ int do_rcv_srv(void) { } // TODO -int do_con_srv(void) { - // MISSING HOST - - /* - int ret; +int do_con_srv(struct conn *conn) { + int ret = 0; + 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; + } + + struct hostinfo *info = (struct hostinfo *) calloc(1, sizeof(struct hostinfo)); + if (!info) { + goto _exit; + } + + ret = pahostinfo(host->er, host->len, info); + if (ret < 0) { + if (debug <= 2) { + fprintf(stderr, "Failed parsing upstream host header\n"); + } + goto _exit_hostinfo; + } + + if (debug <= 2) { + fprintf(stdout, "Establishing connection with upstream: %.*s : %.*s\n", info->hostname_len, info->hostname, info->service_len, info->service); + } + struct addrinfo hints; struct addrinfo *res; @@ -160,20 +183,30 @@ int do_con_srv(void) { hints.ai_family = AF_INET; hints.ai_socktype = SOCK_STREAM; - ret = getaddrinfo(clt_data->host_name, clt_data->host_port, &hints, &res); - if (ret < 0) - return -1; + ret = getaddrinfo(info->hostname, info->service, &hints, &res); + if (ret < 0) { + goto _exit_hostinfo; + } - ret = srv_sock = socket(res->ai_family, res->ai_socktype, + ret = conn->srvfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol); - if (ret < 0) - return -1; + if (ret < 0) { + goto _exit_getaddrinfo; + } - ret = connect(srv_sock, res->ai_addr, res->ai_addrlen); - if (ret < 0) - return -1; */ + ret = connect(conn->srvfd, res->ai_addr, res->ai_addrlen); + if (ret < 0) { + goto _exit_getaddrinfo; + } - return 0; +_exit_getaddrinfo: + freeaddrinfo(res); +_exit_hostinfo: + free(info->hostname); + free(info->service); + free(info); +_exit: + return ret; } int do_fwd_srv(void) { @@ -254,6 +287,9 @@ int do_rcv_clt(struct conn *conn) { free(line); } + // body + // TODO + if (debug <= 2) { fprintf(stdout, "printing parsed request\n"); printfpareq(&conn->cltreq); @@ -276,6 +312,9 @@ void do_statem(struct conn *conn) { case STATEM_RCV_CLT: ret = do_rcv_clt(conn); break; + case STATEM_CON_SRV: + ret = do_con_srv(conn); + break; } if (ret < 0)