#!/bin/sh
-# Copyright 2016 - 2018 Paul Hänsch
+# Copyright 2016 - 2019 Paul Hänsch
#
# This file is part of cgilite.
#
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(){
- 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'
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;;
| 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 ] \
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'
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'