summaryrefslogtreecommitdiff
path: root/rc/bin
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@gmx.de>2012-10-14 06:28:58 +0200
committercinap_lenrek <cinap_lenrek@gmx.de>2012-10-14 06:28:58 +0200
commit143fcc0a42121d93a4116f19290cbc049fcd1a7b (patch)
tree221bdd3e187ce3aeb294733076f9128e043bd703 /rc/bin
parent45c0c4128037a02b18d2b82ad35ae8784390a8ec (diff)
formpost becomes hpost
Diffstat (limited to 'rc/bin')
-rwxr-xr-xrc/bin/formpost191
-rwxr-xr-xrc/bin/hpost207
2 files changed, 207 insertions, 191 deletions
diff --git a/rc/bin/formpost b/rc/bin/formpost
deleted file mode 100755
index c60e1d002..000000000
--- a/rc/bin/formpost
+++ /dev/null
@@ -1,191 +0,0 @@
-#!/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
-}
diff --git a/rc/bin/hpost b/rc/bin/hpost
new file mode 100755
index 000000000..2b07ef14b
--- /dev/null
+++ b/rc/bin/hpost
@@ -0,0 +1,207 @@
+#!/bin/rc
+rfork e
+argv0=$0
+url=()
+at=() # text fields
+af=() # file fields
+
+fn usage {
+ echo $argv0 '[ -u ] url [ -[gpm] action ] [ field:value | field@file ... ]' >[1=2]
+ exit usage
+}
+
+# tired of typing -u
+if(~ $1 http://* https://*){
+ url=$1
+ shift
+}
+
+while(! ~ $#* 0){
+ switch($1){
+ case -u; shift; url=$1
+ case -g; shift; action=$1; method=mget
+ case -p; shift; action=$1; method=mpost
+ case -m; shift; action=$1; method=multi
+ case *:*@*; at=($1 $at)
+ case *@*; af=($1 $af)
+ case *:*; at=($1 $at)
+ case *; usage
+ }
+ shift
+}
+
+if(~ $#url 0)
+ usage
+
+fn uenc {
+ f=$1
+ for(i in $at){
+ echo -n $"f`{urlencode /env/i | sed 's!%3A!=!; s!%00$!!'}
+ f='&'
+ }
+ for(i in $af){
+ echo -n $"f`{urlencode /env/i | sed 's!@.*$!=!'}
+ urlencode `{sed 's!^[^@]+@!!' /env/i}
+ f='&'
+ }
+}
+fn menc {
+ f=$1
+ cr=`{echo x | tr x \015}
+ for(i in $at){
+ k=`{sed 's!:.*$!!' /env/i}
+ echo '--'$"f$"cr
+ echo 'Content-Disposition: form-data; name="'$"k'"'$"cr
+ echo $"cr
+ i=$"i$"cr
+ sed 's!^[^:]+:!!' /env/i
+ }
+ for(i in $af){
+ k=`{sed 's!@.*$!!' /env/i}
+ v=`{sed 's!^[^@]+@!!' /env/i}
+ t=`{file -m $v}
+ n=`{basename $v}
+ echo '--'$"f$"cr
+ echo 'Content-Disposition: form-data; name="'$"k'"; filename="'$"n'"'$"cr
+ echo 'Content-Type: '$"t$"cr
+ echo $"cr
+ cat $v
+ echo $"cr
+ }
+ echo '--'$"f'--'$"cr
+}
+
+fn mget {
+ a=`{uenc '?'}
+ action=$"action$"a
+ hget -b $url $action
+}
+fn mpost {
+ uenc | hget -b $url -P $action
+}
+fn multi {
+ f='HJBOUNDARY'
+ menc $"f | hget -r 'Content-Type: multipart/form-data, boundary='$"f -b $url -P $action
+}
+
+if(! ~ $action ''){
+ $method
+ exit
+}
+
+# serialize $at and $af into a0=... a1=... for awk
+# to preserve newlines and other special characters
+n=()
+for(i in $at $af){
+ a$#n=$i
+ n=(1 $n)
+}
+a$#n=''
+
+hget $url | uhtml | sed '
+s!^(TAG|ATT)! \1!g; # escape our inline signaling
+s!<[ ]*!\nTAG !g; # find starttags, mark with TAG name ...
+s!>[^>"'']*$!!g; # remove garbage after the tag
+# find attributes, mark with ATT name value
+s!([a-zA-Z][a-zA-Z0-9:_]*)=("[^"]*"?|''[^'']*''?|[ ]*[^> ]+)!\nATT \1 \2!g;
+' | awk -v 'argv0='$"argv0 -v 'url='$"url '
+BEGIN{
+ for(i=0; ENVIRON["a"i]!=""; i++){
+ s=ENVIRON["a"i]
+ x=index(s, ":"); y=index(s, "@")
+ if(y > 1 && (x < 1 || x > y))
+ x = y
+ n=substr(s, 1, x-1)
+ ainput[n]=substr(s, x+1, length(s))
+ atypes[n]=substr(s, x, 1);
+ }
+}
+function qw(s){
+ if(s !~ /[\n\\#;\|\^$=`''{}\(\)<> ]/)
+ return s
+ gsub(/''/, "''''", s)
+ return "''"s"''"
+}
+function uq(s){
+ q=substr(s, 1, 1)
+ if(q=="\"" || q=="''"){
+ s=substr(s, 2, length(s))
+ x=index(s, q)
+ if(x > 0) s=substr(s,1,x-1)
+ }
+ return s
+}
+function emitform(){
+ if(action!=""){
+ printf argv0
+ if(url!="") printf " -u %s", qw(url)
+ if(method=="post"){
+ if(enctype=="multipart/form-data")
+ printf " -m %s", qw(action)
+ else
+ printf " -p %s", qw(action)
+ } else
+ printf " -g %s", qw(action)
+ for(n in ainput)
+ printf " %s%s%s", n, atypes[n], qw(ainput[n])
+ for(n in input)
+ if(!(n in ainput))
+ printf " %s%s%s", n, types[n], qw(input[n])
+ printf "\n"
+ }
+ delete input
+ delete types
+ action=""
+ method=""
+ enctype=""
+}
+function endtag(){
+ if(tag=="form"){
+ action=attr["action"]
+ method=tolower(attr["method"])
+ enctype=tolower(attr["enctype"])
+ }
+ if(tag=="select")
+ selectname=attr["name"]
+ if(tag=="option" && selectname!=""){
+ if(attr["selected"]!=""){
+ input[selectname]=attr["value"]
+ selectname=""
+ }
+ }
+ if(tag=="input" || tag=="textarea" || tag=="submit"){
+ n=attr["name"]
+ if(n!=""){
+ if(tolower(attr["type"])=="file"){
+ input[n]="/dev/null"
+ types[n]="@"
+ } else {
+ input[n]=attr["value"]
+ types[n]=":"
+ }
+ }
+ }
+ delete attr
+ tag=""
+}
+/^TAG \//{
+ etag=tolower(substr($2, 2, length(etag)-1))
+ endtag()
+ if(etag=="form")
+ emitform()
+}
+/^TAG [^\/]/{
+ endtag()
+ tag=tolower($2)
+ if(tag=="form")
+ emitform()
+}
+/^ATT/{
+ for(i=4; i<=NF; i++) $3=$3" "$i
+ attr[tolower(uq($2))]=uq($3)
+}
+END{
+ endtag()
+ emitform()
+}
+'