diff options
author | Ori Bernstein <ori@eigenstate.org> | 2021-06-12 14:32:16 +0000 |
---|---|---|
committer | Ori Bernstein <ori@eigenstate.org> | 2021-06-12 14:32:16 +0000 |
commit | aacf368c6d4ec9adb9fae28d3ca07d074fd459f5 (patch) | |
tree | 7926906342bd0a2a127a3b302494b3e643e5f5e6 | |
parent | af95aa431d6e511355a6eb953ab7845f94c0e2d7 (diff) | |
download | plan9front-aacf368c6d4ec9adb9fae28d3ca07d074fd459f5.tar.xz |
mothra: read the content-type header over file(1) to determine type (thanks james palmer)
this fixes some pages being classified as xml by file(1),
meaning they would be rendered as plain text rather than as html.
-rw-r--r-- | sys/src/cmd/mothra/mothra.c | 3 | ||||
-rw-r--r-- | sys/src/cmd/mothra/mothra.h | 2 | ||||
-rw-r--r-- | sys/src/cmd/mothra/snoop.c | 23 | ||||
-rw-r--r-- | sys/src/cmd/mothra/url.c | 3 |
4 files changed, 24 insertions, 7 deletions
diff --git a/sys/src/cmd/mothra/mothra.c b/sys/src/cmd/mothra/mothra.c index 291272c4c..bc8cb9261 100644 --- a/sys/src/cmd/mothra/mothra.c +++ b/sys/src/cmd/mothra/mothra.c @@ -1017,8 +1017,9 @@ void geturl(char *urlname, int post, int plumb, int map){ message("getting %s", selection->fullname); if(mothmode && !plumb) typ = -1; - else + else if((typ = mimetotype(selection->contenttype)) < 0) typ = snooptype(fd); + switch(typ){ default: if(plumb){ diff --git a/sys/src/cmd/mothra/mothra.h b/sys/src/cmd/mothra/mothra.h index 806ab614b..200650ab7 100644 --- a/sys/src/cmd/mothra/mothra.h +++ b/sys/src/cmd/mothra/mothra.h @@ -28,6 +28,7 @@ struct Url{ char *reltext; char fullname[NNAME]; char tag[NNAME]; + char contenttype[NNAME]; int map; /* is this an image map? */ }; struct Www{ @@ -97,6 +98,7 @@ int Ufmt(Fmt *f); #pragma varargck type "U" char* void message(char *, ...); int filetype(int, char *, int); +int mimetotype(char *); int snooptype(int); void mkfieldpanel(Rtext *); void geturl(char *, int, int, int); diff --git a/sys/src/cmd/mothra/snoop.c b/sys/src/cmd/mothra/snoop.c index 7df01acb6..833141544 100644 --- a/sys/src/cmd/mothra/snoop.c +++ b/sys/src/cmd/mothra/snoop.c @@ -87,8 +87,9 @@ Err1: } int -snooptype(int fd) +mimetotype(char *mime) { + int i; static struct { char *typ; int val; @@ -110,13 +111,23 @@ snooptype(int fd) "image/", PAGE, "text/", PLAIN, "message/rfc822", PLAIN, - }; + }; + + for(i=0; i<nelem(tab); i++) + if(strncmp(mime, tab[i].typ, strlen(tab[i].typ)) == 0) + return tab[i].val; + + return -1; +} + +int +snooptype(int fd) +{ char buf[128]; int i; + if(filetype(fd, buf, sizeof(buf)) < 0) return -1; - for(i=0; i<nelem(tab); i++) - if(strncmp(buf, tab[i].typ, strlen(tab[i].typ)) == 0) - return tab[i].val; - return -1; + + return mimetotype(buf); } diff --git a/sys/src/cmd/mothra/url.c b/sys/src/cmd/mothra/url.c index 2e0e659ca..69e9d9a7f 100644 --- a/sys/src/cmd/mothra/url.c +++ b/sys/src/cmd/mothra/url.c @@ -215,6 +215,9 @@ urlget(Url *url, int body) snprint(buf+n, sizeof(buf)-n, "/parsed/fragment"); readstr(buf, url->tag, sizeof(url->tag)); + + snprint(buf+n, sizeof(buf)-n, "/contenttype"); + readstr(buf, url->contenttype, sizeof(url->contenttype)); snprint(buf+n, sizeof(buf)-n, "/contentencoding"); readstr(buf, buf, sizeof(buf)); |