nixpkgs/nixos/tests/tusd/tus-curl-upload.sh
2025-05-09 15:06:31 +02:00

50 lines
1.4 KiB
Bash
Executable file

#!/usr/bin/env bash
# Adapted from:
# - https://github.com/tus/tus.io/issues/96
if [ ! -f "${1}" ]; then
echo -e "\n\033[1;31m✘\033[0m First argument needs to be an existing file.\n"
exit 1
fi
if [ -z "${2}" ]; then
echo -e "\n\033[1;31m✘\033[0m Second argument needs to be the TUS server's URL.\n"
exit 1
fi
file=${1}
TUS_URL=${2}
filename=$(basename "${file}" | base64)
filesize="$(wc -c <"${file}")"
# Apparently 'Location: ..' is terminated by CRLF. grep and awk faithfully
# preserve the line ending, and the shell's $() substitution strips off the
# final LF leaving you with a string that just ends with a CR.
#
# When the CR is printed, the cursor moves to the beginning of the line and
# whatever gets printed next overwrites what was there.
# ... | tr -d '\015'
location=$(curl \
--silent --show-error \
-I \
-X POST \
-H "Tus-Resumable: 1.0.0" \
-H "Content-Length: 0" \
-H "Upload-Length: ${filesize}" \
-H "Upload-Metadata: name ${filename}" \
"${TUS_URL}" | grep 'Location:' | awk '{print $2}' | tr -d '\015')
if [ -n "${location}" ]; then
curl \
-X PATCH \
-H "Tus-Resumable: 1.0.0" \
-H "Upload-Offset: 0" \
-H "Content-Length: ${filesize}" \
-H "Content-Type: application/offset+octet-stream" \
--data-binary "@${file}" \
"${location}" -v
else
echo -e "\n\033[1;31m✘\033[0m File creation failed..\n"
exit 1
fi