LINUX.ORG.RU

POST метод

 , , ,


0

1

Всем привет.

Есть форма типа

!/bin/sh
echo "Content-Type: text/html"
echo ""
echo "<HTML>"
echo "<BODY>"

echo "<FORM action="/cgi-bin/conv.cgi" METHOD=POST>"

echo "<H4>CGI FORM</H4>"

echo "You Name: <INPUT NAME=contact SIZE=30><BR><BR>"

echo "<SELECT NAME=film>"
echo "<OPTION>-- Pick a Film --"
echo "<OPTION>A Few Good Men"
echo "<OPTION>Die Hard"
echo "<OPTION>Red October"
echo "<OPTION>The Sound Of Music"
echo "<OPTION>Boys In Company C"
echo "<OPTION>Star Wars"
echo "<OPTION>Star Trek"
echo "</SELECT>"

echo "<SELECT NAME=actor>"
echo "<OPTION>-- Pick Your Favourite Actor --"
echo "<OPTION>Bruce Willis"
echo "<OPTION>Demi Moore"
echo "<OPTION>Lauren Bacall"
echo "<OPTION>Sean Connery"
echo "</SELECT>"
echo "<BR><BR>"

echo "Tell what is your best film or just enter some comments<BR>"
echo "<TEXTAREA COLS="30" ROWS="4" NAME="textarea"></TEXTAREA>"

echo "<BR><INPUT TYPE=Submit VALUE="Send it">"
echo "<INPUT TYPE="reset" VALUE="Clear Form">"

echo "</FORM>"
echo "</BODY>"
echo "</HTML>"

Как видно из формы, результаты отсылаются на обработку скрипту /cgi-bin/conv.cgi. И я вот не знаю как их потом обработать. Вот в книге Тенсли предлагают использовать «cat -»:

#!/bin/bash
#сценарий conv.cgi

echo "Content-type: text\html"
echo ""
echo "<HTML><PRE>"

if [ "REQUEST_METHOD" = "POST" ]; then
QUERY_STRING=`cat -`
fi

echo "Method            : $REQUEST_METHOD"
echo "Query string      : $QUERY_STRING"
echo "<HR>"

LINE=`echo $QUERY_STRING | sed 's/&/   /g'`

 for LOOP in $LINE
 do
        NAME=`echo $LOOP | sed 's/=/ /g' | awk '{print $1}'`
        #получение TYPE, замена всех символов = пробелами, а %hex_num - \xhex_num
        #замена всех символов + пробелами
        TYPE=`echo $LOOP | sed 's/=/ /g' | awk '{print $2}' | sed -e 's/%/\\\x/g' | sed 's/+/ /g'`
        printf "${NAME}=${TYPE}\n"
        VARS=`printf "${NAME}=\\$TYPE\n"`
        eval `printf $VARS`
 done
 echo "<HR>"
 printf "Your name is                    : $contact\n"
 printf "Your choice of film is          : $film\n"
 printf "Your choice of actor is         : $actor\n"
 printf "You watch films at the cinema   : $view_cine\n"
 printf "You watch films on video        : $view_vid\n"
 echo   "And here are your comment       : $textarea"
 printf "And here are your comment       : $textarea\n"
 echo "</PRE>"
 echo "</HTML>"

Ну и последний скрипт ничего толом не отдает, все переменные чисты. Т.е. QUERY_STRING=`cat -` не работает.

Как сделать правильно? Спасибо!

★★★★★

Попробуй примерно так:

!/bin/sh
local foo=$(cat << EOF
Content-Type: text/html
<HTML>
<BODY>

<FORM action="/cgi-bin/conv.cgi" METHOD=POST>

<H4>CGI FORM</H4>

You Name: <INPUT NAME=contact SIZE=30><BR><BR>

<SELECT NAME=film>
<OPTION>-- Pick a Film --
<OPTION>A Few Good Men
<OPTION>Die Hard
<OPTION>Red October
<OPTION>The Sound Of Music
<OPTION>Boys In Company C
<OPTION>Star Wars
<OPTION>Star Trek
</SELECT>

<SELECT NAME=actor>
<OPTION>-- Pick Your Favourite Actor --
<OPTION>Bruce Willis
<OPTION>Demi Moore
<OPTION>Lauren Bacall
<OPTION>Sean Connery
</SELECT>
<BR><BR>

Tell what is your best film or just enter some comments<BR>
<TEXTAREA COLS="30" ROWS="4" NAME="textarea"></TEXTAREA>

<BR><INPUT TYPE=Submit VALUE="Send it">
<INPUT TYPE="reset" VALUE="Clear Form">

</FORM>
</BODY>
</HTML>
EOF
)
echo -e "${foo}"
QUERY_STRING=$(cat - << EOF )

hope13 ★★★ ()
QUERY_STRING=`cat`

А в первом можно просто

echo 'Content-Type: text/html

<HTML>
<BODY>
<FORM action=/cgi-bin/conv.cgi METHOD=POST>
<H4>CGI FORM</H4>
You Name: <INPUT NAME=contact SIZE=30><BR><BR>
<SELECT NAME=film>
<OPTION>-- Pick a Film --
<OPTION>A Few Good Men
<OPTION>Die Hard
<OPTION>Red October
<OPTION>The Sound Of Music
<OPTION>Boys In Company C
<OPTION>Star Wars
<OPTION>Star Trek
</SELECT>
<SELECT NAME=actor>
<OPTION>-- Pick Your Favourite Actor --
<OPTION>Bruce Willis
<OPTION>Demi Moore
<OPTION>Lauren Bacall
<OPTION>Sean Connery
</SELECT>
<BR><BR>
Tell what is your best film or just enter some comments<BR>
<TEXTAREA COLS=30 ROWS=4 NAME=textarea></TEXTAREA>
<BR><INPUT TYPE=Submit VALUE=Send it>
<INPUT TYPE=reset VALUE=Clear Form>
</FORM>
</BODY>
</HTML>'

А еще лучше файлом

derlafff ★★★★★ ()
Ответ на: комментарий от derlafff

чем тебе не понравился вариант с

foo=$(cat << EOF EOF)?

hope13 ★★★ ()

Я уже и забыл, когда CGI на баше писал. Вот у себя накопал:

cat convert 
#!/bin/sh
#Converts Data sent by method Post or Get
# into stdout like param1 name1 param2 name2 etc.
if [ "$REQUEST_METHOD" = "POST" ] ; then
    QUERY_STRING=`cat -`
fi

line=`echo $QUERY_STRING|sed 's/&/ /g'`

for pair in $line
do
    name=`echo $pair|sed 's/=/ /g'|awk '{print $1}'`
    type=`echo $pair|sed 's/=/ /g'|awk '{print $2}'|sed -e 's/%\(\)/\\\x/g'|sed 's/+/ /g'`
    CNTR=0
    NAME=$name
    while [ "${!name}" != "" ]
    do
    	CNTR=$[ $CNTR + 1 ]
    	name="${NAME}$CNTR"
    done
    eval ${name}=\"${type}\"
    printf "${name}=\"${type}\"\n"
    [ "${type}" = "" ] && eval ${name}="NULL"
done

Какой-то простенький навигатор:

grep -v "^#" file.cgi 

echo -e "Content-type: text/html\n"
cat "char.txt"
echo "<title>Files viewer</title>"
echo "<body>"
eval `./convert`

UP=`./back "file" "$DIR"`

Descr="descript.ion"
Name () # this function returns file description
{
    if [ ! -e "$DIR/$Descr" ]; then
	echo -e "$*\c"
	return
    fi
    name=`cat "$DIR/$Descr"|grep "^$*:"|awk -F: '{print $2}'`
    if [ "$name" != "" ]; then 
	echo -e "$name\c"
    else
	echo -e "$*\c"
    fi
}

linkfile ()
{
    D=$DIR
	echo -e "<H3 align=center><a href=\"$D/$*\" target=\"client\">\c"
        Name "$*"
	echo "</a></H3>"
}

linkdir ()
{
    echo -e "<H2 align=center><a href=\"/cgi-bin/file.cgi?DIR=$DIR/$*\">\c"
    Name "$*"
    echo "</a></H2>"
}

linkback ()
{
    [ "$UP" = "" ] && return 0
    echo "<H2 align=center><a href=\"$UP\">&lt&lt Back &lt&lt</a></H2>"
}

linkback
for dr in `ls -1 "$DIR"` 
do
    if [ -d "$DIR/$dr" ]; then
        if [ ! `echo "$dr"|grep "_files"` -a ! `echo "$dr"|grep ".files"` ]; then
	    linkdir "$dr"
	fi
    fi
done #<"$list"

for F in `ls -1 "$DIR"`
do
    if [ ! -d "$DIR/$F" -a "$F" != "Descript.ion" -a "$F" != "descript.ion" ];then
        linkfile "$F"
    fi
done #<"$list"

linkback
echo "</body>"
О, нашел то, что до сих пор работает: русско-английско-карачаевский словарь
cat dict.cgi 
#!/bin/sh
addw()
{
    echo "<form  action="/cgi-bin/addaword" method=POST>\
	The translation of &nbsp;<b><input size=20 name="word" value="\"$word\""></b>&nbsp; is &nbsp;<input name="trans" size=50>" 
    echo "<input type=submit value=\"Add the word\"></form>"
}    
ud="../Dictionary/userdict.txt"
eval `./convert`

echo -e "Content-type: text/html\n"
cat "char.txt"
echo "<title>My English-russian Computer Dictionary</title>"
echo "<body>"
if [ "$word" = "" ]; then
    tr="Please, enter a word"
else
    tr=`cat $ud|grep -i " $word "`
    tr1=`cat ../Dictionary/Dictionary.txt|grep -i "^$word:"`
    tr2=`cat ../Dictionary/Dictionary.txt|grep -i "$word"`
    tr3=`cat ../Dictionary/kara4.dic| grep -i "$word"`
fi    

if [ "$pass" = "eddy" ]; then
    tmp="/tmp/dic.cgi.$$"
    cat $ud | grep -v " $word " > $tmp
    rm $ud
    cp $tmp $ud
    rm $tmp
    addw
    exit
fi

if [ "$tr" != "" -o "$tr1" != "" -o "$tr2" != "" -o "$tr3" != "" ]; then
    if [ "$tr1" = "" ]; then 
	if [ "$tr2" = "" ]; then
	    tr1="The word is absent"
	else
	    tr1="$tr2"
	fi
    fi
    if [ "$tr" = "" ]; then tr="The word is absent"; fi
    echo "<H5 align=center color="blue">Main dictionary:</H5><pre>"
    echo "$tr1" | sed -e "s/ \+/ /g" -e "s/$word/<font color=red>$word<\/font>/g"
    echo "</pre><H5 align=center color="green">User's dictionary:</H5><pre>"
    echo "$tr" | sed -e "s/ \+/ /g" -e  "s/$word/<font color=red>$word<\/font>/g"
    echo "</pre><H5 align=center color="cyan">Карачаевский:</H5><pre>"
    echo "$tr3" | sed -e "s/ \+/ /g" -e  "s/$word/<font color=red>$word<\/font>/g"    
    echo "</pre>"
else
    echo "I don't know this word, but you can add it to my database"
    addw
fi    

echo "</body>"

Eddy_Em ☆☆☆☆☆ ()

Жесть, ящитаю это эпиквин. Каждый отвечающий постит свои кривые самокаты, вместо того чтоб разобраться в проблеме ТС. Воистину write-only язык.

baverman ★★★ ()
Ответ на: комментарий от baverman

Запусти в баше это выражение, если не можешь в уме проинтерпретировать. Кому то пора спатеньки.

Я как раз и запустил, и выхлоп выложил сюда. Повторюсь.

derlaft@odd:~$ VAR=1
derlaft@odd:~$ [ "$VAR" = '1' ]; echo $?
0
derlaft@odd:~$ [ "$VAR" = '2' ]; echo $?
1
derlafff ★★★★★ ()
Ответ на: комментарий от ipeacocks

Просто удобнее так:

cat << EOF
строка 1
строка 2
строка 3
…
последняя строка
EOF

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от derlafff

[spoiler] [hint]

man bash variable substitution/string extrapolation

$ [ «REQEST_METHOD» = «POST» ] ; echo $? 1 $ [ «$REQUEST_METHOD» = «POST» ]; echo $? 0

anonymous ()
Ответ на: комментарий от baverman

Вот прикольно, что из кучи комментариев только твой — по делу ☺

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от derlafff

Нет, нужно ЧСВ покачать.

Нет, я опускаю ЧСВ других. Свое и так выше некуда.

baverman ★★★ ()
Ответ на: комментарий от baverman

Шо? Ты бы этот флуд до третьей страницы развил, наверное ☺

// кстати, я даже не прочитал текст темы

Eddy_Em ☆☆☆☆☆ ()

почему бы не забросить идею с cgi-скриптами на sh, и сразу перейти на perl/php/python/etc... ?

anonymous ()
Ответ на: комментарий от anonymous

(на сях, кстати, тоже превосходно получается)

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от anonymous

почему бы не забросить идею с cgi-скриптами вообще

Вот так правильнее. Есть микрофреймворки с уже встроенным веб-сервером.

baverman ★★★ ()
Ответ на: комментарий от baverman

«веб-фреймворк» — это хрень, облегчающая работу веб-разработчика. Вебсокет — хрень, сильно облегчающая работу веб(и не только)-разработчика. Ясно?

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от Eddy_Em

Ясно?

Это комбо, в качестве аргумента, может быть ясно только милым дамам.

baverman ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.