itAdd simple support for search queries - phroxy - Gopher to HTTP proxy Err z3bra.org 70 hgit clone git://git.z3bra.org/phroxy.git URL:git://git.z3bra.org/phroxy.git z3bra.org 70 1Log /scm/phroxy/log.gph z3bra.org 70 1Files /scm/phroxy/files.gph z3bra.org 70 1Refs /scm/phroxy/refs.gph z3bra.org 70 1LICENSE /scm/phroxy/file/LICENSE.gph z3bra.org 70 i--- Err z3bra.org 70 1commit c9369fcdaa399b0f9ae97611a023837e72f7e3c3 /scm/phroxy/commit/c9369fcdaa399b0f9ae97611a023837e72f7e3c3.gph z3bra.org 70 1parent f1491a5ecb91945b0ef4dc69aff9d8f05ce00fea /scm/phroxy/commit/f1491a5ecb91945b0ef4dc69aff9d8f05ce00fea.gph z3bra.org 70 hAuthor: Willy Goiffon URL:mailto:dev@z3bra.org z3bra.org 70 iDate: Thu, 22 Oct 2020 14:08:52 +0200 Err z3bra.org 70 i Err z3bra.org 70 iAdd simple support for search queries Err z3bra.org 70 i Err z3bra.org 70 iDiffstat: Err z3bra.org 70 i M phroxy.c | 72 ++++++++++++++++++++++++++++--- Err z3bra.org 70 i Err z3bra.org 70 i1 file changed, 65 insertions(+), 7 deletions(-) Err z3bra.org 70 i--- Err z3bra.org 70 1diff --git a/phroxy.c b/phroxy.c /scm/phroxy/file/phroxy.c.gph z3bra.org 70 it@@ -103,15 +103,21 @@ err: Err z3bra.org 70 i } Err z3bra.org 70 i Err z3bra.org 70 i int Err z3bra.org 70 i-sendselector(int sock, const char *selector) Err z3bra.org 70 i+sendselector(int sock, const char *selector, const char *search) Err z3bra.org 70 i { Err z3bra.org 70 i char *msg, *p; Err z3bra.org 70 i+ char *fmt = "%s\r\n"; Err z3bra.org 70 i size_t ln; Err z3bra.org 70 i ssize_t n; Err z3bra.org 70 i Err z3bra.org 70 i ln = strlen(selector) + 3; Err z3bra.org 70 i+ if (search) { Err z3bra.org 70 i+ fmt = "%s\t%s\r\n"; Err z3bra.org 70 i+ ln += strlen(search); Err z3bra.org 70 i+ } Err z3bra.org 70 i+ Err z3bra.org 70 i msg = p = malloc(ln); Err z3bra.org 70 i- snprintf(msg, ln--, "%s\r\n", selector); Err z3bra.org 70 i+ snprintf(msg, ln--, fmt, selector, search); Err z3bra.org 70 i Err z3bra.org 70 i while ((n = write(sock, p, ln)) > 0) { Err z3bra.org 70 i ln -= n; Err z3bra.org 70 it@@ -125,6 +131,51 @@ sendselector(int sock, const char *selector) Err z3bra.org 70 i return n; Err z3bra.org 70 i } Err z3bra.org 70 i Err z3bra.org 70 i+static char Err z3bra.org 70 i+hex2bin(const unsigned char *in) Err z3bra.org 70 i+{ Err z3bra.org 70 i+ int out; Err z3bra.org 70 i+ Err z3bra.org 70 i+ if (*in == '%') Err z3bra.org 70 i+ in++; Err z3bra.org 70 i+ Err z3bra.org 70 i+ if ('A' <= in[0] && in[0] <= 'F') out = 16 * (in[0] - 'A' + 10); Err z3bra.org 70 i+ if ('0' <= in[0] && in[0] <= '9') out = 16 * (in[0] - '0'); Err z3bra.org 70 i+ Err z3bra.org 70 i+ if ('A' <= in[1] && in[1] <= 'F') out += (in[1] - 'A' + 10); Err z3bra.org 70 i+ if ('0' <= in[1] && in[1] <= '9') out += (in[1] - '0'); Err z3bra.org 70 i+ Err z3bra.org 70 i+ return out; Err z3bra.org 70 i+} Err z3bra.org 70 i+ Err z3bra.org 70 i+char * Err z3bra.org 70 i+urldec(char *search) Err z3bra.org 70 i+{ Err z3bra.org 70 i+ char *msg, *p; Err z3bra.org 70 i+ Err z3bra.org 70 i+ if (!search) Err z3bra.org 70 i+ return NULL; Err z3bra.org 70 i+ Err z3bra.org 70 i+ msg = p = search; Err z3bra.org 70 i+ for (p = msg; *p != '\0'; msg++, p++) { Err z3bra.org 70 i+ switch(*p) { Err z3bra.org 70 i+ case '+': Err z3bra.org 70 i+ *msg = ' '; Err z3bra.org 70 i+ break; Err z3bra.org 70 i+ case '%': Err z3bra.org 70 i+ *msg = hex2bin((unsigned char *)p); Err z3bra.org 70 i+ p += 2; Err z3bra.org 70 i+ break; Err z3bra.org 70 i+ default: Err z3bra.org 70 i+ *msg = *p; Err z3bra.org 70 i+ } Err z3bra.org 70 i+ } Err z3bra.org 70 i+ *msg = '\0'; Err z3bra.org 70 i+ Err z3bra.org 70 i+ return search; Err z3bra.org 70 i+} Err z3bra.org 70 i+ Err z3bra.org 70 i+ Err z3bra.org 70 i char * Err z3bra.org 70 i getrawitem(int sock, size_t *sz) Err z3bra.org 70 i { Err z3bra.org 70 it@@ -252,6 +303,7 @@ printmenu(int fd, char *data) Err z3bra.org 70 i char i, *p, a[LINE_MAX], *f[4]; Err z3bra.org 70 i char *ifmt = "
%s
\n"; Err z3bra.org 70 i char *afmt = "
%s%s
\n"; Err z3bra.org 70 i+ char *sfmt = "
%s
%s
\n"; Err z3bra.org 70 i Err z3bra.org 70 i p = data; Err z3bra.org 70 i Err z3bra.org 70 it@@ -271,6 +323,9 @@ printmenu(int fd, char *data) Err z3bra.org 70 i case 'i': Err z3bra.org 70 i snprintf(a, sizeof(a), ifmt, f[0]); Err z3bra.org 70 i break; Err z3bra.org 70 i+ case '7': Err z3bra.org 70 i+ snprintf(a, sizeof(a), sfmt, itemname(i), f[0], http_host, f[2], f[3], i, f[1]); Err z3bra.org 70 i+ break; Err z3bra.org 70 i default: Err z3bra.org 70 i snprintf(a, sizeof(a), afmt, itemname(i), http_host, f[2], f[3], i, f[1], f[0]); Err z3bra.org 70 i } Err z3bra.org 70 it@@ -330,12 +385,13 @@ serveitem(char item, char *path, char *data, size_t len) Err z3bra.org 70 i printheaders(contenttype(item, path)); Err z3bra.org 70 i Err z3bra.org 70 i switch(item) { Err z3bra.org 70 i+ case '7': // search Err z3bra.org 70 i case '1': // menu Err z3bra.org 70 i case '0': // text Err z3bra.org 70 i printf("\r\n"); Err z3bra.org 70 i fflush(stdout); Err z3bra.org 70 i write(1, head, strlen(head)); Err z3bra.org 70 i- if (item == '1') printmenu(1, data); Err z3bra.org 70 i+ if (item == '1' || item == '7') printmenu(1, data); Err z3bra.org 70 i if (item == '0') printhtml(1, data, len); Err z3bra.org 70 i write(1, foot, strlen(foot)); Err z3bra.org 70 i break; Err z3bra.org 70 it@@ -359,7 +415,6 @@ serveitem(char item, char *path, char *data, size_t len) Err z3bra.org 70 i } Err z3bra.org 70 i break; Err z3bra.org 70 i Err z3bra.org 70 i- case '7': // search Err z3bra.org 70 i case '2': // CSO phone-book server Err z3bra.org 70 i case '3': // Error Err z3bra.org 70 i case '8': // telnet session. Err z3bra.org 70 it@@ -405,15 +460,18 @@ phroxy(char *url) Err z3bra.org 70 i if (!path || *path == '\0') Err z3bra.org 70 i path = "/"; Err z3bra.org 70 i Err z3bra.org 70 i- if((srch = strchr(path, '?'))) Err z3bra.org 70 i- *srch = '\t'; Err z3bra.org 70 i+ if((srch = strchr(path, '?'))) { Err z3bra.org 70 i+ *srch = '\0'; Err z3bra.org 70 i+ srch += 3; /* go past "?q=" in URL, to fetch actual query */ Err z3bra.org 70 i+ fprintf(stderr, "Search: %s\n", urldec(srch)); Err z3bra.org 70 i+ } Err z3bra.org 70 i Err z3bra.org 70 i if ((sock = connectto(host, port)) < 0) { Err z3bra.org 70 i printhttp(500); Err z3bra.org 70 i return 1; Err z3bra.org 70 i } Err z3bra.org 70 i Err z3bra.org 70 i- if (!sendselector(sock, path)) Err z3bra.org 70 i+ if (!sendselector(sock, path, urldec(srch))) Err z3bra.org 70 i data = getrawitem(sock, &len); Err z3bra.org 70 i Err z3bra.org 70 i close(sock); Err z3bra.org 70 .