commit 28239bac769c9db0bcc8f48bdd16db80886f84e9 from: Omar Polo date: Tue Sep 20 17:26:07 2022 UTC parse the query string too commit - abe1778147e9ae26eeb75ba1feb5060ee40e28ee commit + 28239bac769c9db0bcc8f48bdd16db80886f84e9 blob - a9cfbd10ff1a48e28fa49445e79272d079414db4 blob + ca72d81c7c2c00b392c169b96e90353c7d5d1e0c --- fcgi.c +++ fcgi.c @@ -288,6 +288,7 @@ fcgi_parse_params(struct fcgi *fcgi, struct evbuffer * char pname[32]; char server[HOST_NAME_MAX + 1]; char path[PATH_MAX]; + char query[GEMINI_MAXLEN]; int nlen, vlen; while (fcgi->fcg_toread > 0) { @@ -364,6 +365,21 @@ fcgi_parse_params(struct fcgi *fcgi, struct evbuffer * log_debug("clt %d: path_info: %s", clt->clt_id, clt->clt_path_info); + continue; + } + + if (!strcmp(pname, "QUERY_STRING") && + (size_t)vlen < sizeof(query) && + vlen > 0) { + fcgi->fcg_toread -= vlen; + evbuffer_remove(src, &query, vlen); + + free(clt->clt_query); + if ((clt->clt_query = strdup(query)) == NULL) + return (-1); + + log_debug("clt %d: query: %s", clt->clt_id, + clt->clt_query); continue; } blob - c58fdc1a1477f7d707cd7ad6810cca22c7ebaeac blob + 45fe5a76745182c85ebc18cb5f8bbbac17c3045e --- galileo.h +++ galileo.h @@ -28,6 +28,7 @@ #define PROC_MAX_INSTANCES 32 #define PROXY_NUMPROC 3 #define PROC_PARENT_SOCK_FILENO 3 +#define GEMINI_MAXLEN (1024 + 1) /* NULL */ enum { IMSG_NONE, @@ -57,6 +58,7 @@ struct client { char *clt_server_name; char *clt_script_name; char *clt_path_info; + char *clt_query; struct proxy_config *clt_pc; struct event_asr *clt_evasr; struct addrinfo *clt_addrinfo; blob - 537ced406bbea0c7920e338d794faf0ab2550bc7 blob + a8313a7a6bcf16c034dd7cfc8ad9e088e2f833be --- proxy.c +++ proxy.c @@ -505,9 +505,20 @@ done: bufferevent_enable(clt->clt_bev, EV_READ|EV_WRITE); /* TODO: compute the URL */ - if (evbuffer_add_printf(out, "gemini://%s/%s\r\n", + if (evbuffer_add_printf(out, "gemini://%s/%s", clt->clt_pc->proxy_name, clt->clt_path_info) == -1) { + log_warn("bufferevent_printf failed"); + goto err; + } + + if (clt->clt_query && + evbuffer_add_printf(out, "?%s", clt->clt_query) == -1) { log_warn("bufferevent_printf failed"); + goto err; + } + + if (evbuffer_add(out, "\r\n", 2) == -1) { + log_warn("bufferevent_add failed"); goto err; } @@ -874,5 +885,6 @@ proxy_client_free(struct client *clt) free(clt->clt_server_name); free(clt->clt_script_name); free(clt->clt_path_info); + free(clt->clt_query); free(clt); }