Commit Diff


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);
 }