1#!/bin/sh 2 3# post_upload.htm example: 4# <html> 5# <body> 6# <form action=/cgi-bin/httpd_post_upload.cgi method=post enctype=multipart/form-data> 7# File to upload: <input type=file name=file1> <input type=submit> 8# </form> 9 10# POST upload format: 11# -----------------------------29995809218093749221856446032^M 12# Content-Disposition: form-data; name="file1"; filename="..."^M 13# Content-Type: application/octet-stream^M 14# ^M <--------- headers end with empty line 15# file contents 16# file contents 17# file contents 18# ^M <--------- extra empty line 19# -----------------------------29995809218093749221856446032--^M 20 21file=$(mktemp) 22 23CR=`printf '\r'` 24 25# CGI output must start with at least empty line (or headers) 26printf '\r\n' 27 28IFS="$CR" 29read -r delim_line 30IFS="" 31 32while read -r line; do 33 test x"$line" = x"" && break 34 test x"$line" = x"$CR" && break 35done 36 37cat >"$file" 38 39# We need to delete the tail of "\r\ndelim_line--\r\n" 40tail_len=$((${#delim_line} + 6)) 41 42# Get and check file size 43filesize=`stat -c"%s" "$file"` 44test "$filesize" -lt "$tail_len" && exit 1 45 46# Check that tail is correct 47dd if="$file" skip=$((filesize - tail_len)) bs=1 count=1000 >"$file.tail" 2>/dev/null 48printf "\r\n%s--\r\n" "$delim_line" >"$file.tail.expected" 49if ! diff -q "$file.tail" "$file.tail.expected" >/dev/null; then 50 printf "<html>\n<body>\nMalformed file upload" 51 exit 1 52fi 53rm "$file.tail" 54rm "$file.tail.expected" 55 56# Truncate the file 57dd of="$file" seek=$((filesize - tail_len)) bs=1 count=0 >/dev/null 2>/dev/null 58 59printf "<html>\n<body>\nFile upload has been accepted" 60