itFormat text as HTML on the fly - 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 5f381215e10e7696ffcb418cbc0f2f1a5f4aedb5 /scm/phroxy/commit/5f381215e10e7696ffcb418cbc0f2f1a5f4aedb5.gph z3bra.org 70 1parent 6399fbf8c0ea8bb09ad819e86c4393845b5e1472 /scm/phroxy/commit/6399fbf8c0ea8bb09ad819e86c4393845b5e1472.gph z3bra.org 70 hAuthor: Willy Goiffon URL:mailto:dev@z3bra.org z3bra.org 70 iDate: Thu, 24 Sep 2020 09:36:43 +0200 Err z3bra.org 70 i Err z3bra.org 70 iFormat text as HTML on the fly Err z3bra.org 70 i Err z3bra.org 70 iDiffstat: Err z3bra.org 70 i M config.def.h | 8 +++----- Err z3bra.org 70 i M phroxy.c | 102 +++++++++++++++---------------- Err z3bra.org 70 i Err z3bra.org 70 i2 files changed, 51 insertions(+), 59 deletions(-) Err z3bra.org 70 i--- Err z3bra.org 70 1diff --git a/config.def.h b/config.def.h /scm/phroxy/file/config.def.h.gph z3bra.org 70 it@@ -1,14 +1,12 @@ Err z3bra.org 70 i char *default_hole = "z3bra.org"; Err z3bra.org 70 i const char *http_host = "z3bra.org"; Err z3bra.org 70 i-const char *htmlfmt = Err z3bra.org 70 i+const char *head = Err z3bra.org 70 i "\n" Err z3bra.org 70 i "\n" Err z3bra.org 70 i "" Err z3bra.org 70 i "" Err z3bra.org 70 i- "" Err z3bra.org 70 i "gopher proxy\n" Err z3bra.org 70 i "\n" Err z3bra.org 70 i- "\n" Err z3bra.org 70 i- "%s\n" Err z3bra.org 70 i- "\n"; Err z3bra.org 70 i+ "\n"; Err z3bra.org 70 i+const char *foot = "\n"; 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@@ -221,17 +221,13 @@ printheaders(char *ctype) Err z3bra.org 70 i printf("Connection: close\r\n"); Err z3bra.org 70 i } Err z3bra.org 70 i Err z3bra.org 70 i-char * Err z3bra.org 70 i-htmlize(char *data, size_t *bodysize) Err z3bra.org 70 i+int Err z3bra.org 70 i+printmenu(int fd, char *data) Err z3bra.org 70 i { Err z3bra.org 70 i- size_t alen, blen; Err z3bra.org 70 i- char *body = NULL; 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 Err z3bra.org 70 i- blen = 0; Err z3bra.org 70 i- body = NULL; Err z3bra.org 70 i p = data; Err z3bra.org 70 i Err z3bra.org 70 i while((p = strsep(&data, "\n"))) { Err z3bra.org 70 it@@ -252,57 +248,60 @@ htmlize(char *data, size_t *bodysize) Err z3bra.org 70 i snprintf(a, sizeof(a), afmt, http_host, f[2], f[3], i, f[1], f[0], itemname(i)); Err z3bra.org 70 i } Err z3bra.org 70 i Err z3bra.org 70 i- alen = strnlen(a, sizeof(a)); Err z3bra.org 70 i- body = realloc(body, blen + alen + 1); Err z3bra.org 70 i- memcpy(body + blen, a, alen); Err z3bra.org 70 i- blen += alen; Err z3bra.org 70 i- body[blen] = '\0'; Err z3bra.org 70 i+ write(fd, a, strlen(a)); Err z3bra.org 70 i } Err z3bra.org 70 i Err z3bra.org 70 i- if (bodysize) Err z3bra.org 70 i- *bodysize = strnlen(body, blen); Err z3bra.org 70 i- Err z3bra.org 70 i- return body; Err z3bra.org 70 i+ return 0; Err z3bra.org 70 i } Err z3bra.org 70 i Err z3bra.org 70 i-char * Err z3bra.org 70 i-htmlwrap(char *data, size_t len, size_t *htmlsize) Err z3bra.org 70 i+int Err z3bra.org 70 i+printhtml(int fd, const char *data, size_t len) Err z3bra.org 70 i { Err z3bra.org 70 i- size_t hlen; Err z3bra.org 70 i- char *html = NULL; Err z3bra.org 70 i- Err z3bra.org 70 i- hlen = strlen(htmlfmt) + len; Err z3bra.org 70 i- html = malloc(hlen); Err z3bra.org 70 i- if (!html) Err z3bra.org 70 i- return NULL; Err z3bra.org 70 i+ size_t r, n; Err z3bra.org 70 i+ const char *s, *e; Err z3bra.org 70 i Err z3bra.org 70 i- snprintf(html, hlen, htmlfmt, data); Err z3bra.org 70 i+ n = 0; Err z3bra.org 70 i+ while(n < len) { Err z3bra.org 70 i+ s = data + n; Err z3bra.org 70 i+ e = strstr(s, "\n\n"); Err z3bra.org 70 i+ r = e ? (size_t)(e - s) : strlen(s); Err z3bra.org 70 i Err z3bra.org 70 i- if (htmlsize) Err z3bra.org 70 i- *htmlsize = strnlen(html, hlen); Err z3bra.org 70 i+ if (!r) Err z3bra.org 70 i+ break; Err z3bra.org 70 i Err z3bra.org 70 i- return html; Err z3bra.org 70 i+ n += r + 2; /* go past "\n\n" */ Err z3bra.org 70 i+ write(fd, "
", 5);	Err	z3bra.org	70
i+                write(fd, s, r);	Err	z3bra.org	70
i+                write(fd, "
\n", 7); Err z3bra.org 70 i+ } Err z3bra.org 70 i+ return 0; Err z3bra.org 70 i } Err z3bra.org 70 i Err z3bra.org 70 i int Err z3bra.org 70 i serveitem(char item, char *data, size_t len) Err z3bra.org 70 i { Err z3bra.org 70 i- char *send, *html; Err z3bra.org 70 i+ char *send; Err z3bra.org 70 i int sent; Err z3bra.org 70 i Err z3bra.org 70 i+ Err z3bra.org 70 i+ if (!contenttype(item)) { Err z3bra.org 70 i+ printhttp(415); Err z3bra.org 70 i+ return 1; Err z3bra.org 70 i+ } Err z3bra.org 70 i+ Err z3bra.org 70 i+ printf("HTTP/1.1 200 OK\r\n"); Err z3bra.org 70 i+ printheaders(contenttype(item)); 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- html = htmlize(data, &len); Err z3bra.org 70 i- free(data); Err z3bra.org 70 i- data = html; Err z3bra.org 70 i- /* FALLTHROUGH */ Err z3bra.org 70 i- Err z3bra.org 70 i case '0': // text Err z3bra.org 70 i- html = htmlwrap(data, len, &len); Err z3bra.org 70 i- free(data); Err z3bra.org 70 i- data = html; Err z3bra.org 70 i+ printf("\r\n"); 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 == '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 i+ Err z3bra.org 70 i case '4': // BinHexed Macintosh file Err z3bra.org 70 i case '5': // DOS binary archive of some sort Err z3bra.org 70 i case '6': // uuencoded Err z3bra.org 70 it@@ -310,8 +309,18 @@ serveitem(char item, char *data, size_t len) Err z3bra.org 70 i case 'g': // gif Err z3bra.org 70 i case 'I': // image Err z3bra.org 70 i case 'h': // http redirect Err z3bra.org 70 i+ printf("Content-Length: %ld\r\n", len); Err z3bra.org 70 i+ printf("\r\n"); Err z3bra.org 70 i+ send = data; Err z3bra.org 70 i+ while (len > 0) { Err z3bra.org 70 i+ if ((sent = write(1, send, len)) < 0) Err z3bra.org 70 i+ return 1; Err z3bra.org 70 i+ len -= sent; Err z3bra.org 70 i+ send += sent; 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@@ -319,26 +328,11 @@ serveitem(char item, char *data, size_t len) Err z3bra.org 70 i case '+': // mirror link Err z3bra.org 70 i default: Err z3bra.org 70 i /* IGNORE */ Err z3bra.org 70 i- printhttp(415); Err z3bra.org 70 i break; Err z3bra.org 70 i } Err z3bra.org 70 i Err z3bra.org 70 i- printf("HTTP/1.1 200 OK\r\n"); Err z3bra.org 70 i- printheaders(contenttype(item)); Err z3bra.org 70 i- Err z3bra.org 70 i- printf("Content-Length: %ld\r\n", len); Err z3bra.org 70 i- printf("\r\n"); Err z3bra.org 70 i- fflush(stdout); Err z3bra.org 70 i- Err z3bra.org 70 i- send = data; Err z3bra.org 70 i- while (len > 0) { Err z3bra.org 70 i- if ((sent = write(1, send, len)) < 0) Err z3bra.org 70 i- return 1; Err z3bra.org 70 i- len -= sent; Err z3bra.org 70 i- send += sent; Err z3bra.org 70 i- } Err z3bra.org 70 i- Err z3bra.org 70 i free(data); Err z3bra.org 70 i+ fflush(stdout); Err z3bra.org 70 i Err z3bra.org 70 i return 0; Err z3bra.org 70 i } Err z3bra.org 70 .