191 lines
3.6 KiB
Bash
Executable file
191 lines
3.6 KiB
Bash
Executable file
#!/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
|
|
}
|