htgen-cyberlocker: init at 1.0.0

This commit is contained in:
lassulus 2021-08-25 12:04:38 +02:00
parent 8f6dec66dc
commit f01a67acc1
2 changed files with 108 additions and 0 deletions

View File

@ -0,0 +1,29 @@
with import <stockholm/lib>;
{ pkgs, stdenv }:
stdenv.mkDerivation rec {
pname = "htgen-cyberlocker";
version = "1.0.0";
src = ./src;
buildPhase = ''
(
exec > htgen-cyberlocker
echo PATH=${makeBinPath [
pkgs.coreutils
pkgs.file
pkgs.findutils
pkgs.gnugrep
pkgs.jq
pkgs.nix
pkgs.utillinux
]}
echo STATEDIR=${shell.escape "\${STATEDIR-$HOME}"}
cat $src/htgen-cyberlocker
)
'';
installPhase = ''
install -D htgen-cyberlocker $out/bin/htgen-cyberlocker
'';
}

View File

@ -0,0 +1,79 @@
delete_response() {
jq -n -r \
--arg server "$Server" \
'
[ "HTTP/1.1 204 OK\r"
, "Connection: close\r"
, "Server: \($server)\r"
, "\r"
][]
'
}
file_response() {(
type=$(file -ib "$1")
size=$(wc -c < "$1")
jq -n -r \
--arg type "$type" \
--arg size "$size" \
--arg server "$Server" \
'
[ "HTTP/1.1 200 OK\r"
, "Connection: close\r"
, "Content-Length: \($size)\r"
, "Content-Type: \($type)\r"
, "Server: \($server)\r"
, "\r"
][]
'
cat "$1"
)}
read_uri() {
jq -cn --arg uri "$1" '
$uri |
capture("^((?<scheme>[^:]*):)?(//(?<authority>[^/]*))?(?<path>[^?#]*)([?](?<query>[^#]*))?([#](?<fragment>.*))?$") |
. + {
query: (.query | if . != null then
split("&") |
map(split("=") | {key:.[0],value:.[1]}) |
from_entries
else . end)
}
'
}
uri=$(read_uri "$Request_URI")
path=$(jq -nr --argjson uri "$uri" '$uri.path')
case "$Method $path" in
'POST /'*|'PUT /'*)
content=$(mktemp -t htgen.$$.content.XXXXXXXX)
trap "rm $content >&2" EXIT
head -c $req_content_length > $content
item=$STATEDIR/items/$(echo "$path" | jq -rR @uri)
mkdir -v -p $STATEDIR/items >&2
cp -v $content $item >&2
scheme=${req_x_forwarded_proto-http}
link=$scheme://$req_host/$path
;;
'GET /'*)
item=$STATEDIR/items/$(echo "$path" | jq -rR @uri)
if [ -e "$item" ]; then
file_response "$item"
exit
fi
;;
'DELETE /'*)
item=$STATEDIR/items/$(echo "$path" | jq -rR @uri)
if [ -e "$item" ]; then
rm "$item"
delete_response
exit
fi
esac