]> git.plutz.net Git - cgilite/blobdiff - file.sh
mime types for streaming formats
[cgilite] / file.sh
diff --git a/file.sh b/file.sh
index 06f28d02f5640abfbfd560641348e8c8e8cd6e22..04a8ef617c9f755a4dcb7c3cf3adeeca69683f27 100755 (executable)
--- a/file.sh
+++ b/file.sh
@@ -1,6 +1,6 @@
-#!/bin/zsh
+#!/bin/sh
 
-# Copyright 2016 - 2018 Paul Hänsch
+# Copyright 2016 - 2019 Paul Hänsch
 #
 # This file is part of cgilite.
 # 
@@ -32,16 +32,21 @@ file_type(){
     svg)       printf 'image/svg+xml';;
     gif)       printf 'image/gif';;
     webm)      printf 'video/webm';;
-    mp4)       printf 'video/mp4';;
+    mp4|m4v)   printf 'video/mp4';;
+    m4a)       printf 'audio/mp4';;
     ogg)       printf 'audio/ogg';;
     xml)       printf 'application/xml';;
+    m3u8)      printf 'application/x-mpegURL';;
+    ts)        printf 'video/MP2T';;
+    mpd)       printf 'application/dash+xml';;
+    m4s)       printf 'video/iso.segment';;
     *)         printf 'application/octet-stream';;
   esac
 }
 
 FILE(){
-  unset range file_size file_date http_date cachedate
-  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'
@@ -59,17 +64,17 @@ FILE(){
     # 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;;
               s;^[^ ]+ (...)  ([0-9]) (..:..:..) ([0-9]{4})$;\4-\1-\2 \3;;
               s;Jan;01;; s;Feb;02;; s;Mar;03;; s;Apr;04;; s;May;05;; s;Jun;06;;
               s;Jul;07;; s;Aug;08;; s;Sep;09;; s;Oct;10;; s;Nov;11;; s;Dec;12;;' \
-    | xargs -0 date +%s -ud 2>&-
+    | 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 +96,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,14 +107,14 @@ 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'
   
     [ "$REQUEST_METHOD" != HEAD ] \
     && tail -c+$((${range%-*} + 1)) "$file" \
-       | head -c "$((${range#*-} - ${range%-*} + 1))"
+     | head -c "$((${range#*-} - ${range%-*} + 1))"
 
   elif [ "${range%-*}" -gt "${range#*-}" ]; then
     printf '%s: %s\r\n' \