]> git.plutz.net Git - shellwiki/commitdiff
Merge commit 'ed79d95d05abd733b958e653fd3cfd310120098f'
authorPaul Hänsch <paul@plutz.net>
Thu, 1 Jun 2023 12:28:16 +0000 (14:28 +0200)
committerPaul Hänsch <paul@plutz.net>
Thu, 1 Jun 2023 12:28:16 +0000 (14:28 +0200)
1  2 
cgilite/file.sh

diff --combined cgilite/file.sh
index 0d1f4eabb0b7e80541c9f0271892d25ba888472f,a9006e6fa6be86a6030cbb67256238fbe2b9df0f..a9006e6fa6be86a6030cbb67256238fbe2b9df0f
@@@ -1,6 -1,6 +1,6 @@@
  #!/bin/sh
  
- # Copyright 2016 - 2019 Paul Hänsch
+ # Copyright 2016 - 2023 Paul Hänsch
  #
  # This file is part of cgilite.
  # 
@@@ -48,24 -48,32 +48,32 @@@ file_type()
  }
  
  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;;
      | 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