initial working version to proofread - libgcgi - REST library for Gopher HTML git clone git://bitreich.org/libgcgi git://hg6vgqziawt5s4dj.onion/libgcgi DIR Log DIR Files DIR Refs DIR Tags DIR README DIR LICENSE --- DIR commit 092dce7972a8883e7532c848192785ed60ac9b67 DIR parent 758508d75c969333c3f72f0e01faa0a5129153b9 HTML Author: Josuah Demangeon <me@josuah.net> Date: Sat, 30 Jul 2022 12:30:03 +0200 initial working version to proofread Diffstat: M index.c | 12 +++++++++++- M libgcgi.h | 42 +++++++++++++++++++++----------- 2 files changed, 39 insertions(+), 15 deletions(-) --- DIR diff --git a/index.c b/index.c @@ -10,8 +10,18 @@ #include <sys/stat.h> #include "libgcgi.h" +static void +error_404(char **matches) +{ + char *var; + + printf("sorry, I could not find %s\n", matches[0]); + if ((var = gcgi_get_var(&gcgi_gopher_query, "var")) != NULL) + printf("I got the $var though! -> '%s'\n", var); +} + static struct gcgi_handler handlers[] = { -// { "*", error_404 }, + { "*", error_404 }, { NULL, NULL }, }; DIR diff --git a/libgcgi.h b/libgcgi.h @@ -44,15 +44,12 @@ static void gcgi_free_var_list(struct gcgi_var_list *vars); static void gcgi_read_var_list(struct gcgi_var_list *vars, char *path); static int gcgi_write_var_list(struct gcgi_var_list *vars, char *path); -/* parse various components of the Gopher request */ -static struct gcgi_var_list * gcgi_parse_query_string(void); - /* components of the gopher request */ char *gcgi_gopher_search; char *gcgi_gopher_path; char *gcgi_gopher_host; char *gcgi_gopher_port; -char *gcgi_gopher_args; +static struct gcgi_var_list gcgi_gopher_query; /// POLICE LINE /// DO NOT CROSS /// @@ -68,7 +65,6 @@ gcgi_fatal(char *fmt, ...) va_start(va, fmt); vsnprintf(msg, sizeof msg, fmt, va); - printf("Status: 500 Server Error\n\n"); printf("error: %s\n", msg); exit(1); } @@ -237,9 +233,26 @@ gcgi_match(char const *glob, char *path, char **matches, size_t m) return *glob == '\0' && *path == '\0'; } +static inline void +gcgi_decode_url(struct gcgi_var_list *vars, char *s) +{ + char *tok, *eq; + + while ((tok = strsep(&s, "&"))) { + //gcgi_decode_hex(tok); + if ((eq = strchr(tok, '=')) == NULL) + continue; + *eq = '\0'; + gcgi_add_var(vars, tok, eq + 1); + } + gcgi_sort_var_list(vars); +} + static void gcgi_handle_request(struct gcgi_handler h[], char **argv, int argc) { + char *query_string; + if (argc != 5) gcgi_fatal("wrong number of arguments: %c", argc); assert(argv[0] && argv[1] && argv[2] && argv[3]); @@ -249,11 +262,10 @@ gcgi_handle_request(struct gcgi_handler h[], char **argv, int argc) gcgi_gopher_path = argv[2]; gcgi_gopher_host = argv[3]; gcgi_gopher_port = argv[4]; - gcgi_gopher_args = strchr(gcgi_gopher_path, '?'); - if (gcgi_gopher_args == NULL) { - gcgi_gopher_args = ""; - } else { - *gcgi_gopher_args++ = '\0'; + query_string = strchr(gcgi_gopher_path, '?'); + if (query_string != NULL) { + *query_string++ = '\0'; + gcgi_decode_url(&gcgi_gopher_query, query_string); } for (; h->glob != NULL; h++) { @@ -309,17 +321,17 @@ static void gcgi_template(char const *path, struct gcgi_var_list *vars) { FILE *fp; + ssize_t ssz; size_t sz; char *line, *head, *tail, *key; char *val; - sz = 0; - line = NULL; - if ((fp = fopen(path, "r")) == NULL) gcgi_fatal("opening template %s", path); - while (getline(&line, &sz, fp) > 0) { + sz = 0; + line = NULL; + while ((ssz = getline(&line, &sz, fp)) > 0) { head = tail = line; for (; (key = gcgi_next_var(head, &tail)); head = tail) { fputs(head, stdout); @@ -330,6 +342,8 @@ gcgi_template(char const *path, struct gcgi_var_list *vars) } fputs(tail, stdout); } + if (ssz == -1) + gcgi_fatal("reading from template: %s", strerror(errno)); fclose(fp); }