]> git.plutz.net Git - cgilite/blobdiff - file.sh
bugfix: HEX_DECODE for prefixes looking like shell patterns
[cgilite] / file.sh
diff --git a/file.sh b/file.sh
index 6f956dfeb5989a6b2542534d78134bc4633217de..a9006e6fa6be86a6030cbb67256238fbe2b9df0f 100755 (executable)
--- a/file.sh
+++ b/file.sh
@@ -1,6 +1,6 @@
 #!/bin/sh
 
-# Copyright 2016 - 2019 Paul Hänsch
+# Copyright 2016 - 2023 Paul Hänsch
 #
 # This file is part of cgilite.
 # 
@@ -22,47 +22,58 @@ 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|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(){
-  local file file_size file_date http_date cachedate range mime
-  file="$1" mime="$2"
+  local file="$1" mime="$2"
+  local file_size file_date http_date cachedate range
 
   if ! [ -f "$file" ]; then
     printf 'Content-Length: 0\r\nStatus: 404 Not Found\r\n\r\n'
-    exit 0
+    return 0
   elif ! [ -r "$file" ]; then
     printf 'Content-Length: 0\r\nStatus: 403 Forbidden\r\n\r\n'
-    exit 0
+    return 0
   fi
 
-  file_size="$(stat -Lc %s "$file")"
-  file_date="$(stat -Lc %Y "$file")"
+  read file_size file_date <<-EOF
+       $(stat -Lc "%s  %Y" "$file")
+       EOF
   http_date="$(date -ud "@$file_date" +"%a, %d %b %Y %T GMT")"
+
+  [ ! "$HTTP_IF_MODIFIED_SINCE" -a "$cgilite_headers" ] \
+  &&    HTTP_IF_MODIFIED_SINCE="$(HEADER If-Modified-Since)"
+  [ ! "$HTTP_RANGE"             -a "$cgilite_headers" ] \
+  &&    HTTP_RANGE="$(HEADER Range)"
+
   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 \
+    # HEADER If-Modified-Since \
+    printf %s "$HTTP_IF_MODIFIED_SINCE" \
     | 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;;
@@ -73,14 +84,25 @@ FILE(){
     | xargs -r0 date +%s -ud 2>&-
   )"
 
-  range="$(HEADER Range |sed -nE 's;^bytes=([0-9]+-[0-9]*|-[0-9]+)$;\1;p;q;')"
+  range="${HTTP_RANGE#bytes=}"
   case "$range" in
-    *-) range="${range}$((file_size - 1))";;
-    -*) [ ${range#-} -le $file_size ] \
-        && range="$((file_size - ${range#-}))-$((file_size - 1))" \
-        || range="0-$((file_size - 1))";;
-    *-*) [ ${range#*-} -ge $file_size ] \
-         && range="${range%-*}-$((file_size - 1))";;
+    *[^0-9]*-*|*-*[^0-9]*)
+      range=""
+      ;;
+    *-)
+      range="${range}$((file_size - 1))"
+      ;;
+    -*)
+      [ ${range#-} -le $file_size ] \
+      && range="$((file_size - ${range#-}))-$((file_size - 1))" \
+      || range="0-$((file_size - 1))"
+      ;;
+    *-*)
+      [ ${range#*-} -ge $file_size ] \
+      && range="${range%-*}-$((file_size - 1))"
+      ;;
+    *) range=""
+      ;;
   esac
 
   if [ "$file_date" -lt "$cachedate" ] 2>&-; then