]> git.plutz.net Git - cgilite/blobdiff - file.sh
ordered list of mime types, additional pdf and text types
[cgilite] / file.sh
diff --git a/file.sh b/file.sh
index 82eefae0af0298b09a64261913947d0622752aba..0d1f4eabb0b7e80541c9f0271892d25ba888472f 100755 (executable)
--- 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'