• 一个解析cgi参数的SHELL脚本


     测试工作中,经常会涉及到一些要验证服务器对某些cgi接口查询结果返回信息进行解析是否正确的情况。而提供cgi接口的通常又是另外的部门,测试的时候需要调试一些返回结果不方便。所以需要自己模拟虚假的cgi接口来达到同样的目的。

          比如说,类似http://www.yousite.com/query.cgi?username=***&kind=***这样的接口会根据username和kind的值的不同返回6类结果,每一类结果,请求服务器都会针对地走不同的处理流程,这就需要每一个返回结果都需要模拟到,于是乎,建立模拟的cgi接口势在必行。以前自己也没有接触过cgi程序,翻了一些基础资料发现总体框架也不是很复杂,而解析html发过来的参数有不少现成的程序可以使用,不用自己写了。因为只是需要简单的模拟返回结果,所以用shell写cgi程序,开始用了uncgi解析,配置很方便,具体方法可以看:

    http://www.midwinter.com/~koreth/uncgi.html

    后来又发现一个shell写的解析程序proccgi.sh,似乎在简单的cgi接口中使用更方便

    proccgi.sh文件内容如下:

    #!/bin/sh
    #
    # Process input to a CGI script. Written and Copyright 1995 Frank Pilhofer
    # You may freely use and distribute this code free of charge provided that
    # this copyright notice remains.            fp@informatik.uni-frankfurt.de
    #
    # All variables in here are prefixed by _F_, so you shouldn't have
    # any conflicts with your own var names
    #
    # get query string. if $REQUEST_METHOD is "POST", then it must be read
    # from stdin, else it's in $QUERY_STRING
    #
    if [ ${DEBUG:-0} -eq 1 ] ; then
     echo --Program Starts-- 1>&2
    fi
    #
    if [ "$REQUEST_METHOD" = "POST" ] ; then
     _F_QUERY_STRING=`dd count=$CONTENT_LENGTH bs=1 2> /dev/null`"&"
     if [ "$QUERY_STRING" != "" ] ; then
      _F_QUERY_STRING="$_F_QUERY_STRING""$QUERY_STRING""&"
     fi
     if [ ${DEBUG:-0} -eq 1 ] ; then
      echo --Posted String-- 1>&2
     fi
    else
     _F_QUERY_STRING="$QUERY_STRING""&"
     if [ ${DEBUG:-0} -eq 1 ] ; then
      echo --Query String-- 1>&2
     fi
    fi
    if [ ${DEBUG:-0} -eq 1 ] ; then
     ( echo "  " $_F_QUERY_STRING
       echo --Adding Arguments-- ) 1>&2
    fi
    #
    # if there are arguments, use them as well.
    #
    for _F_PAR in $* ; do
     _F_QUERY_STRING="$_F_QUERY_STRING""$_F_PAR""&"
     if [ ${DEBUG:-0} -eq 1 ] ; then
      echo "  " arg $_F_PAR 1>&2
     fi
    done
    if [ ${DEBUG:-0} -eq 1 ] ; then
     ( echo --With Added Arguments--
       echo "  " $_F_QUERY_STRING ) 1>&2
    fi
    #
    # if $PATH_INFO is not empty and contains definitions '=', append it as well.
    # but replace slashes by ampersands
    #
    if echo $PATH_INFO | grep = > /dev/null ; then
     _F_PATH_INFO="$PATH_INFO""//"
     if [ ${DEBUG:-0} -eq 1 ] ; then
      ( echo --Adding Path Info--
        echo "  " $_F_PATH_INFO ) 1>&2
     fi

     while [ "$_F_PATH_INFO" != "" -a "$_F_PATH_INFO" != "/" ] ; do
      _F_QUERY_STRING="$_F_QUERY_STRING""`echo $_F_PATH_INFO | cut -d / -f 1`""&"
      _F_PATH_INFO=`echo $_F_PATH_INFO | cut -s -d / -f 2-`
     done
    fi
    #
    # append another '&' to fool some braindead cut implementations. Test yours:
    # echo 'i am braindead!' | cut -d '!' -f 2
    #
    _F_QUERY_STRING="$_F_QUERY_STRING""&"
    #
    if [ ${DEBUG:-0} -eq 1 ] ; then
     ( echo --Final Query String--
       echo "  " $_F_QUERY_STRING ) 1>&2
    fi
    #
    while [ "$_F_QUERY_STRING" != "" -a "$_F_QUERY_STRING" != "&" ] ; do
     _F_VARDEF=`echo $_F_QUERY_STRING | cut -d \& -f 1`
    # _F_QUERY_STRING=`echo $_F_QUERY_STRING | cut -d \& -f 2-`
     _F_VAR=`echo $_F_VARDEF | cut -d = -f 1`
     _F_VAL=`echo "$_F_VARDEF""=" | cut -d = -f 2`

    #
    # Workaround for more braindead cut implementations that strip delimiters
    # at the end of the line (i.e. HP-UX 10)
    #

     if echo $_F_QUERY_STRING | grep -c \& > /dev/null ; then
      _F_QUERY_STRING=`echo $_F_QUERY_STRING | cut -d \& -f 2-`
     else
      _F_QUERY_STRING=""
     fi

     if [ ${DEBUG:-0} -eq 1 ] ; then
      ( echo --Got Variable--
        echo "  " var=$_F_VAR
        echo "  " val=$_F_VAL
        echo "  " rem=$_F_QUERY_STRING ) 1>&2
     fi
     if [ "$_F_VAR" = "" ] ; then
      continue
     fi

    #
    # replace '+' by spaces
    #

     _F_VAL="$_F_VAL""++"
     _F_TMP=

     while [ "$_F_VAL" != "" -a "$_F_VAL" != "+" -a "$_F_VAL" != "++" ] ; do
      _F_TMP="$_F_TMP""`echo $_F_VAL | cut -d + -f 1`"
      _F_VAL=`echo $_F_VAL | cut -s -d + -f 2-`

      if [ "$_F_VAL" != "" -a "$_F_VAL" != "+" ] ; then
       _F_TMP="$_F_TMP"" "
      fi
     done

     if [ ${DEBUG:-0} -eq 1 ] ; then
      echo "  " vrs=$_F_TMP 1>&2
     fi

    #
    # replace '%XX' by ascii character. the hex sequence MUST BE uppercase
    #

     _F_TMP="$_F_TMP""%%"
     _F_VAL=

     while [ "$_F_TMP" != "" -a "$_F_TMP" != "%" ] ; do
      _F_VAL="$_F_VAL""`echo $_F_TMP | cut -d % -f 1`"
      _F_TMP=`echo $_F_TMP | cut -s -d % -f 2-`

      if [ "$_F_TMP" != "" -a "$_F_TMP" != "%" ] ; then
       if [ ${DEBUG:-0} -eq 1 ] ; then
        echo "  " got hex "%" $_F_TMP 1>&2
       fi
       _F_HEX=`echo $_F_TMP | cut -c 1-2 | tr "abcdef" "ABCDEF"`
       _F_TMP=`echo $_F_TMP | cut -c 3-`
    #
    # can't handle newlines anyway. replace by space
    #
    #   if [ "$_F_HEX" = "0A" ] ; then
    #    _F_HEX="20"
    #   fi

       _F_VAL="$_F_VAL""`/bin/echo '\0'\`echo "16i8o"$_F_HEX"p" | dc\``"
      fi
     done

    #
    # replace forward quotes to backward quotes, since we have trouble handling
    # the former ones.
    #

     _F_VAL=`echo $_F_VAL | tr "'" '\`'`

    #
    # if debug, send variables to stderr
    #

     if [ ${DEBUG:-0} -eq 1 ] ; then
      ( echo --Final Assignment--
        echo "FORM_$_F_VAR"=\'$_F_VAL\' ) 1>&2
     fi

    # /bin/echo "FORM_$_F_VAR"=\'$_F_VAL\'
     /bin/echo "FORM_$_F_VAR"="'"$_F_VAL"'"
    done
    #
    if [ ${DEBUG:-0} -eq 1 ] ; then
     echo done. 1>&2
    fi
    #
    # done.
    #
    exit 0

      使用方法:

           在自己的cgi脚本中直接调用这个shell解析参数即可,如:

           eval `proccgi.sh $*`        # 可以把proccgi.sh放在你服务器的cgi-bin目录

          如果上面的调用出错,尝试用绝对路径调用  eval `/home/www/cgi-bin/proccgi.sh $*`

          例子,比如有一个cgi接口,按照下面的参数调用:

          http://your-website/cgi-bin/mycript?username=your_name&password=mypass

          返回结果:

          your_name

          mypass

        则,mycript的内容为:

    #!/bin/sh

    eval `/home/www/cgi-bin/proccgi.sh $*`

    echo Content-type: text/plain

    echo

    echo $FORM_username

    echo $FORM_password

      

          参数里面每一对key/value存储在$FORM_key 环境变量里面。
     

    顺便贴一下cgi-bin目录的通用配置

            ScriptAlias /cgi-bin/ /home/www/c

  • 相关阅读:
    TopCoder12729 「SRM589Medium」GearsDiv1 二分图最小点覆盖
    Codechef RIN 「Codechef14DEC」Course Selection 最小割离散变量模型
    BZOJ3144/LG3227 「HNOI2013」切糕 最小割离散变量模型
    20191214 Codeforces Round #606 (Div. 2, based on Technocup 2020 Elimination Round 4)
    [Codeforces868F]Yet Another Minimization Problem
    2020年计算机算法基础理论与应用研讨会小记
    [Codeforces1421E]Swedish Heroes
    [Codechef CCC]Hit the coconuts
    CSP-S 2020
    牛客NOIP2020模拟
  • 原文地址:https://www.cnblogs.com/mfryf/p/2514495.html
Copyright © 2020-2023  润新知