tWrap text files in HTML too - phroxy - Gopher to HTTP proxy
 (HTM) git clone git://git.z3bra.org/phroxy.git
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) LICENSE
       ---
 (DIR) commit fe4f5657743a30daa28fe32376c1158b0b0240d3
 (DIR) parent e133739f4bb2117d8e6389ab5a7ce83291131410
 (HTM) Author: Willy Goiffon <dev@z3bra.org>
       Date:   Mon, 14 Sep 2020 15:50:32 +0200
       
       Wrap text files in HTML too
       
       Diffstat:
         M config.def.h                        |       4 ++--
         M phroxy.c                            |      74 +++++++++++++++++++++----------
       
       2 files changed, 52 insertions(+), 26 deletions(-)
       ---
 (DIR) diff --git a/config.def.h b/config.def.h
       t@@ -7,7 +7,7 @@ const char *htmlfmt =
                "<style>body { white-space: pre; }</style>"
                "<title>gopher proxy</title>\n"
                "</head>\n"
       -        "<body><pre>\n"
       +        "<body>\n"
                "%s\n"
       -        "</pre></body></html>\n";
       +        "</body></html>\n";
        
 (DIR) diff --git a/phroxy.c b/phroxy.c
       t@@ -180,14 +180,24 @@ contenttype(char i)
        {
                switch(i) {
                case '0':
       -                return "text/plain; charset=utf-8";
       -                break; /* NOTREACHED */
                case '1':
       +        case '7':
                        return "text/html; charset=utf-8";
                        break; /* NOTREACHED */
       +        case '6':
       +                return "text/x-uuencode";
       +                break; /* NOTREACHED */
       +        case '4':
       +        case '5':
                case '9':
                        return "application/octet-stream";
                        break; /* NOTREACHED */
       +        case 'I':
       +                return "image/youguess";
       +                break; /* NOTREACHED */
       +        case 'g':
       +                return "image/gif";
       +                break; /* NOTREACHED */
                }
        
                return NULL;
       t@@ -209,11 +219,11 @@ printheaders(char *ctype)
        }
        
        char *
       -htmlize(char *data, size_t *htmlsize)
       +htmlize(char *data, size_t *bodysize)
        {
       -        size_t alen, blen, hlen;
       -        char *html = NULL;
       -        char i, *p, *body, a[LINE_MAX], *f[4];
       +        size_t alen, blen;
       +        char *body = NULL;
       +        char i, *p, a[LINE_MAX], *f[4];
                char *fmt = "<a href='http://%s/%s:%s/%c%s'>%s</a>\n";
        
                blen = 0;
       t@@ -240,18 +250,31 @@ htmlize(char *data, size_t *htmlsize)
                        default:
                                snprintf(a, sizeof(a), fmt, http_host, f[2], f[3], i, f[1], f[0]);
                        }
       +
                        alen = strnlen(a, sizeof(a));
                        body = realloc(body, blen + alen);
                        memcpy(body + blen, a, alen);
                        blen += alen;
                }
        
       -        hlen = strlen(htmlfmt) + blen;
       +        if (bodysize)
       +                *bodysize = blen;
       +
       +        return body;
       +}
       +
       +char *
       +htmlwrap(char *data, size_t len, size_t *htmlsize)
       +{
       +        size_t hlen;
       +        char *html = NULL;
       +
       +        hlen = strlen(htmlfmt) + len;
                html = malloc(hlen);
                if (!html)
                        return NULL;
        
       -        snprintf(html, hlen, htmlfmt, body);
       +        snprintf(html, hlen, htmlfmt, data);
        
                if (htmlsize)
                        *htmlsize = hlen;
       t@@ -266,27 +289,31 @@ serveitem(char item, char *data, size_t len)
                int sent;
        
                switch(item) {
       -         case '1':
       +        case '7': // search
       +        case '1': // menu
                        html = htmlize(data, &len);
                        free(data);
                        data = html;
       -                break;
       +                /* FALLTHROUGH */
        
       -         case '0':
       -         case '6':
       -         case '9':
       -         case 'g':
       -         case 'I':
       +        case '0': // text
       +                html = htmlwrap(data, len, &len);
       +                free(data);
       +                data = html;
       +                break;
       +        case '4': // BinHexed Macintosh file
       +        case '5': // DOS binary archive of some sort
       +        case '6': // uuencoded
       +        case '9': // binary
       +        case 'g': // gif
       +        case 'I': // image
                        break;
        
       -         case '2': // Item is a CSO phone-book server
       -         case '3': // Error
       -         case '4': // Item is a BinHexed Macintosh file.
       -         case '5': // Item is DOS binary archive of some sort.
       -         case '7': // Item is an Index-Search server.
       -         case '8': // Item points to a text-based telnet session.
       -         case 'T': // Item points to a text-based tn3270 session.
       -         case '+':
       +        case '2': // CSO phone-book server
       +        case '3': // Error
       +        case '8': // telnet session.
       +        case 'T': // tn3270 session.
       +        case '+': // mirror link
                default:
                        /* IGNORE */
                        print415();
       t@@ -296,7 +323,6 @@ serveitem(char item, char *data, size_t len)
                printf("HTTP/1.1 200 OK\r\n");
                printheaders(contenttype(item));
        
       -
                printf("Content-Length: %ld\r\n", len);
                printf("\r\n");
                fflush(stdout);