summaryrefslogtreecommitdiff
path: root/networking/httpd_post_upload.cgi
diff options
context:
space:
mode:
Diffstat (limited to 'networking/httpd_post_upload.cgi')
-rwxr-xr-xnetworking/httpd_post_upload.cgi59
1 files changed, 59 insertions, 0 deletions
diff --git a/networking/httpd_post_upload.cgi b/networking/httpd_post_upload.cgi
new file mode 100755
index 0000000..e4ffd2b
--- /dev/null
+++ b/networking/httpd_post_upload.cgi
@@ -0,0 +1,59 @@
+#!/bin/sh
+
+# post_upload.htm example:
+# <html>
+# <body>
+# <form action=/cgi-bin/httpd_post_upload.cgi method=post enctype=multipart/form-data>
+# File to upload: <input type=file name=file1> <input type=submit>
+# </form>
+
+# POST upload format:
+# -----------------------------29995809218093749221856446032^M
+# Content-Disposition: form-data; name="file1"; filename="..."^M
+# Content-Type: application/octet-stream^M
+# ^M <--------- headers end with empty line
+# file contents
+# file contents
+# file contents
+# ^M <--------- extra empty line
+# -----------------------------29995809218093749221856446032--^M
+
+file=/tmp/$$-$RANDOM
+
+CR=`printf '\r'`
+
+# CGI output must start with at least empty line (or headers)
+printf '\r\n'
+
+IFS="$CR"
+read -r delim_line
+IFS=""
+
+while read -r line; do
+ test x"$line" = x"" && break
+ test x"$line" = x"$CR" && break
+done
+
+cat >"$file"
+
+# We need to delete the tail of "\r\ndelim_line--\r\n"
+tail_len=$((${#delim_line} + 6))
+
+# Get and check file size
+filesize=`stat -c"%s" "$file"`
+test "$filesize" -lt "$tail_len" && exit 1
+
+# Check that tail is correct
+dd if="$file" skip=$((filesize - tail_len)) bs=1 count=1000 >"$file.tail" 2>/dev/null
+printf "\r\n%s--\r\n" "$delim_line" >"$file.tail.expected"
+if ! diff -q "$file.tail" "$file.tail.expected" >/dev/null; then
+ printf "<html>\n<body>\nMalformed file upload"
+ exit 1
+fi
+rm "$file.tail"
+rm "$file.tail.expected"
+
+# Truncate the file
+dd of="$file" seek=$((filesize - tail_len)) bs=1 count=0 >/dev/null 2>/dev/null
+
+printf "<html>\n<body>\nFile upload has been accepted"