summaryrefslogtreecommitdiff
path: root/networking/httpd_post_upload.txt
diff options
context:
space:
mode:
authorDenis Vlasenko2008-04-17 12:35:09 +0000
committerDenis Vlasenko2008-04-17 12:35:09 +0000
commit250aa5bb015061787e62f63847df04f377af91c1 (patch)
tree3d349c74d7eb3653eceb9d6087267799fd05cabe /networking/httpd_post_upload.txt
parentc033d5196d863edaabf9d02531a12daa77cc48c7 (diff)
downloadbusybox-250aa5bb015061787e62f63847df04f377af91c1.zip
busybox-250aa5bb015061787e62f63847df04f377af91c1.tar.gz
httpd: add an example of POST upload CGI
Diffstat (limited to 'networking/httpd_post_upload.txt')
-rw-r--r--networking/httpd_post_upload.txt76
1 files changed, 76 insertions, 0 deletions
diff --git a/networking/httpd_post_upload.txt b/networking/httpd_post_upload.txt
new file mode 100644
index 0000000..a53b114
--- /dev/null
+++ b/networking/httpd_post_upload.txt
@@ -0,0 +1,76 @@
+POST upload example:
+
+post_upload.htm
+===============
+<html>
+<body>
+<form action=/cgi-bin/post_upload.cgi method=post enctype=multipart/form-data>
+File to upload: <input type=file name=file1> <input type=submit>
+</form>
+
+
+post_upload.cgi
+===============
+#!/bin/sh
+
+# 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
+
+# Beware: bashism $'\r' is used to handle ^M
+
+file=/tmp/$$-$RANDOM
+
+# CGI output must start with at least empty line (or headers)
+printf '\r\n'
+
+IFS=$'\r'
+read -r delim_line
+
+IFS=''
+delim_line="${delim_line}--"$'\r'
+
+while read -r line; do
+ test "$line" = '' && break
+ test "$line" = $'\r' && break
+done
+
+# This will not work well for binary files: bash 3.2 is upset
+# by reading NUL bytes and loses chunks of data.
+# If you are not bothered by having junk appended to the uploaded file,
+# consider using simple "cat >file" instead of the entire
+# fragment below.
+
+while read -r line; do
+
+ while test "$line" = $'\r'; do
+ read -r line
+ test "$line" = "$delim_line" && {
+ # Aha! Empty line + delimiter! All done
+ cat <<EOF
+<html>
+<body>
+File upload has been accepted
+EOF
+ exit 0
+ }
+ # Empty line + NOT delimiter. Save empty line,
+ # and go check next line
+ printf "%s\n" $'\r' -vC >&3
+ done
+ # Not empty line - just save
+ printf "%s\n" "$line" -vC >&3
+done 3>"$file"
+
+cat <<EOF
+<html>
+<body>
+File upload was not terminated with '$delim_line' - ??!
+EOF