X-Git-Url: https://git.plutz.net/?p=cgilite;a=blobdiff_plain;f=file.sh;h=0d1f4eabb0b7e80541c9f0271892d25ba888472f;hp=82eefae0af0298b09a64261913947d0622752aba;hb=d09c1c1448cfb0e9a28f32ee3bcda554763dbfcc;hpb=55052a16e5c2792b25c90b8aea0e3daea06b533a diff --git a/file.sh b/file.sh index 82eefae..0d1f4ea 100755 --- a/file.sh +++ b/file.sh @@ -1,6 +1,6 @@ #!/bin/sh -# Copyright 2016 - 2018 Paul Hänsch +# Copyright 2016 - 2019 Paul Hänsch # # This file is part of cgilite. # @@ -22,26 +22,34 @@ include_fileserve="$0" file_type(){ case ${1##*.} in - html|html) printf 'text/html';; css) printf 'text/css';; - js) printf 'text/javascript';; - txt) printf 'text/plain';; - sh) printf 'text/shellscript';; + gif) printf 'image/gif';; + html|html) printf 'text/html';; jpg|jpeg) printf 'image/jpeg';; + js) printf 'text/javascript';; + m3u8) printf 'application/x-mpegURL';; + m4a) printf 'audio/mp4';; + m4s) printf 'video/iso.segment';; + m4v|mp4) printf 'video/mp4';; + mpd) printf 'application/dash+xml';; + ogg) printf 'audio/ogg';; + pdf) printf 'application/pdf';; png) printf 'image/png';; + sh) printf 'text/x-shellscript';; svg) printf 'image/svg+xml';; - gif) printf 'image/gif';; + tex) printf 'text/x-tex';; + txt) printf 'text/plain';; + short) printf 'text/prs.shorthand';; + ts) printf 'video/MP2T';; webm) printf 'video/webm';; - mp4) printf 'video/mp4';; - ogg) printf 'audio/ogg';; xml) printf 'application/xml';; *) printf 'application/octet-stream';; esac } FILE(){ - local file file_size file_date http_date cachedate range - file="$1" + local file file_size file_date http_date cachedate range mime + file="$1" mime="$2" if ! [ -f "$file" ]; then printf 'Content-Length: 0\r\nStatus: 404 Not Found\r\n\r\n' @@ -53,13 +61,12 @@ FILE(){ file_size="$(stat -Lc %s "$file")" file_date="$(stat -Lc %Y "$file")" - http_date="$(date -uRd @$file_date)" - http_date="${http_date%+0000}GMT" + http_date="$(date -ud "@$file_date" +"%a, %d %b %Y %T GMT")" cachedate="$( # Parse the allowable date formats from Section 3.3.1 of # https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html HEADER If-Modified-Since \ - | sed -r 's;^[^ ]+, ([0-9]{2}) (...) ([0-9]{4}) (..:..:..) GMT$;\3-\2-\1 \4;; + | sed -E 's;^[^ ]+, ([0-9]{2}) (...) ([0-9]{4}) (..:..:..) GMT$;\3-\2-\1 \4;; s;^[^ ]+, ([0-9]{2})-(...)-([789][0-9]) (..:..:..) GMT$;19\3-\2-\1 \4;; s;^[^ ]+, ([0-9]{2})-(...)-([0-6][0-9]) (..:..:..) GMT$;20\3-\2-\1 \4;; s;^[^ ]+ (...) ([0-9]{2}) (..:..:..) ([0-9]{4})$;\4-\1-\2 \3;; @@ -69,7 +76,7 @@ FILE(){ | xargs -r0 date +%s -ud 2>&- )" - range="$(HEADER Range |sed -nr 's;^bytes=([0-9]+-[0-9]*|-[0-9]+)$;\1;p;q;')" + range="$(HEADER Range |sed -nE 's;^bytes=([0-9]+-[0-9]*|-[0-9]+)$;\1;p;q;')" case "$range" in *-) range="${range}$((file_size - 1))";; -*) [ ${range#-} -le $file_size ] \ @@ -91,7 +98,7 @@ FILE(){ Status "200 OK" \ Accept-Ranges bytes \ Last-Modified "$http_date" \ - Content-Type $(file_type "$file") \ + Content-Type "${mime:-$(file_type "$file")}" \ Content-Length $file_size printf '\r\n' @@ -102,7 +109,7 @@ FILE(){ Status "206 Partial Content" \ Accept-Ranges bytes \ Last-Modified "$http_date" \ - Content-Type $(file_type "$file") \ + Content-Type "${mime:-$(file_type "$file")}" \ Content-Range "bytes ${range}/${file_size}" \ Content-Length "$((${range#*-} - ${range%-*} + 1))" printf '\r\n'