diff options
author | stanley lieber <stanley.lieber@gmail.com> | 2012-10-11 16:37:48 -0500 |
---|---|---|
committer | stanley lieber <stanley.lieber@gmail.com> | 2012-10-11 16:37:48 -0500 |
commit | b786ff0544385a1219fb33a39fa6f0e15f49b846 (patch) | |
tree | 9e06a0a92ce1e04343e759bedb3d5cfcb0b280c1 /rc/bin | |
parent | 5cddd21627fe67864fadd44e75cc3a5ab181fbb2 (diff) |
add /rc/bin/formpost; add formpost to hget(1) man page
Diffstat (limited to 'rc/bin')
-rwxr-xr-x | rc/bin/formpost | 191 |
1 files changed, 191 insertions, 0 deletions
diff --git a/rc/bin/formpost b/rc/bin/formpost new file mode 100755 index 000000000..c60e1d002 --- /dev/null +++ b/rc/bin/formpost @@ -0,0 +1,191 @@ +#!/bin/rc +rfork e +argv0=$0 +fn usage { + echo usage: $argv0 '[-d] [-M] [ -u url ] [ -g action | -p action | -m action ] [ name:value | name:@value ]' ... >[1=2] + exit usage +} +d=() +g=() +M=() +m=() +p=() +u=() +while(~ $1 -*){ + switch($1){ + case -d + d=1 + case -g + g=1 + a=$2 + shift + case -M + M=1 + case -m + m=1 + a=$2 + shift + case -p + p=1 + a=$2 + shift + case -u + u=$2 + shift + case * + usage + } + shift +} +if(~ $#M 0 && ~ $#u 0) + usage +fn geth{ + hget $u | + sed 's/ACTION\=/action\=/g; + s/ENCTYPE\=/enctype\=/g; + s/FORM/form/g; + s/INPUT/input/g; + s/METHOD\=/method\=/g; + s/NAME\=/name\=/g; + s/OPTION/option/g; + s/SELECT/select/g; + s/TEXTAREA/textarea/g; + s/TYPE\=/type\=/g' | + awk '/<([ ]|[ ])*form/,/<\/form>/ {print}' | + sed 's/<\/form>/&\nHJFORMEND\n/g; + s/<([ ]|[ ])*/HJBOUNDARY/g; + s/>(\n)*([ ]|[ ])*HJBOUNDARY/\n/g; + s/([ ]|[ ])*HJBOUNDARY//g; + s/^form/HJFORMSTART\n&/g' | + grep -e '(^HJFORM|^form|^input|^option|^select|^textarea)' >$1 +} +fn getf{ + a=`{grep -e '^form' $1 | sed 's/^.*action\=//g; s/^(\''|\"|[ ]*)//g; s/(\''|\"|[ ]|>).*$//g'} + e=`{grep -e '^form' $1 | sed 's/^.*enctype\=//g; s/^(\''|\"|[ ]*)//g; s/(\''|\"|[ ]|>).*$//g'} + m=`{grep -e '^form' $1 | sed 's/^.*method\=//g; s/^(\''|\"|[ ]*)//g; s/(\''|\"|[ ]|>).*$//g'} + f=$a + if(~ $#f 0) + f=/ + if(~ $e multipart/form-data) + f=($f m) + if not if(~ $m post) + f=($f p) + if not + f=($f g) + ifs=' +' { + for(j in `{grep -e '(^input|^select|^textarea)' $1}){ + if(~ $d 1) + echo $"j >>formpost.log #debug + if(~ $j *name'='*) + jname=`{echo $"j | + sed 's/^.*name\=//g; + s/^(\''|\"|[ ]*)//g; + s/(\''|\"|[ ]|>).*$//g; + s/^.*\=.*$//g'} + if(~ $j *value'='*) + jvalue=`{echo $"j | + sed 's/^.*value\=//g; + s/^(\''|\"|[ ]*)//g; + s/(\''|\"|[ ]|>).*$//g; + s/^.*\=.*$//g; + s/[ ]/HJSPACE/g'} + ff=`{echo $"jname':'$"jvalue | + sed 's/^.*\=.*:/:/g; + s/:.*\=.*$/:/g'} + if(! ~ $ff :*) + f=($"f $"ff) + jname=() + jvalue=() + } +} + echo $"f +} +fn mencode{ + f=() + cr=`{echo x | tr x \015} + while(! ~ $#1 0){ + switch($1){ + case *:* + f=($f $1) + case * + usage + } + shift + } + for(i in $f){ + echo '--HJBOUNDARY'^$"cr + fname=`{echo $"i | awk -F ':' '{print $1}'} + fvalue=`{echo $"i | awk -F ':' '{print $2}'} + if(~ $fvalue @*){ + fvalue=`{echo $"fvalue | sed 's/@//g'} + echo 'Content-Disposition: form-data; name="'$"fname'"; filename="'^`{basename $fvalue}^'"'$"cr + echo Content-Type: `{file -m $fvalue}^$"cr + echo $cr + cat $fvalue + echo $cr + } + if not{ + echo 'Content-Disposition: form-data; name="'$"fname'"'$"cr + echo $"cr + echo $"fvalue^$"cr + } + } + echo '--HJBOUNDARY--'$"cr +} +fn uencode{ + f=() + for(i){ + fname=`{echo $"i | awk -F ':' '{print $1}'} + fvalue=`{echo $"i | awk -F ':' '{$1=""; print substr($0, 2)}' | + sed 's/HJSPACE/ /g' | + urlencode | + sed 's/%0A$//g'} + f=$"f^$"fname'='$"fvalue + if(! ~ $"i $*($#*)) + f=$"f^'&' + } + echo $"f +} +fn print{ + if(~ $d 1) + echo $"f >>formpost.log #debug + a=`{echo $"a | sed 's/^\///g'} + if(~ $a http*) + u=$a + if not + u=$"u/$"a + if(~ $M 1) + mencode `{for(i in $f){echo $"i}} + if not if(~ $m 1) + echo formpost -M `{for(i in $f){echo ''''$"i''''}} '| hget -P -r ''Content-Type: multipart/form-data, boundary=HJBOUNDARY''' $"u + if not if(~ $p 1) + echo 'hget -p '''^`{uencode $f}^''' '^$"u + if not + echo hget ''''$"u^'?'^`{uencode $f}^'''' +} +if(~ $#M 0 && ~ $#g 0 && ~ $#m 0 && ~ $#p 0){ + file=/tmp/formpost.$pid + geth $file + while(grep -s -e '^HJFORMSTART$' $file){ + f=`{getf $file} + a=$f(1) + if(~ $f(2) g) + g=1 + if not if(~ $f(2) m) + m=1 + if not if(~ $f(2) p) + p=1 + f=$f(3-) + print + { echo /HJFORMSTART/,/HJFORMEND/d + echo w + echo q + } | sam -d $file >[2]/dev/null + } + rm -f $file +} +if not{ + f=$* + print +} |