模拟HTTP请求的返回&shell写cgi

测试中偶尔会有这样的需求:
1.需要访问外网的cgi或链接地址,但访问不通
2.需要构造cgi特定的返回,但正常情况下难以构造
为了获得想要的结果,此时可以模拟http请求的返回满足测试需要

 


方法一:直接获取结果文件

apache配置的对应路径下新建一个文件,如

DocumentRoot /data/server/xxxx/htdocs

然后用IP/文件名来访问,或者放在alias指定的文件夹下面

新建一个文件名字,比如result,键入以下内容:

result=0&res_info=OK

 

在浏览器里直接输入http://xxx.xxx.xxx.xxx/result,访问该文件,可以看到返回结果

技术分享

 

 

这个只是相当于把文件内容给取出来了,如果真正模拟cgi的返回的话我一般用shell写个桩cgi

 


方法二:写一个桩cgi

什么是cgi,见apache指南:cgi

http://man.chinaunix.net/newsoft/ApacheManual/howto/cgi.html

简言之,要自己写一个cgi需要如下条件:

1.apache配置支持cgi

一般机器上有部署过cgi,在该目录下编写一个自己写的cgi是不会有什么不支持的问题,如果是在其他目录新部署自己的cgi,也许会遇到apache的支持问题

如,直接在刚才的目录下面新建一个shell脚本,如test.sh

#!/bin/sh

print "result=0&res_info=OK"

 

 再在浏览器里运行,运行的结果就是把这个脚本文件下载下来,而不是执行输出

必须配置Apache以允许CGI的执行,其方法有多种:

  (1)ScriptAlias

  ScriptAlias指令使Apache允许执行一个特定目录中的CGI程序。当客户端请求此特定目录中的资源时,Apache假定其中文件都是CGI程序并试图运行。

  ScriptAlias指令形如: 

ScriptAlias /cgi-bin/ /usr/local/apache/cgi-bin/

  如果Apache被安装到默认的位置,默认的配置文件httpd.conf中则会有上述配置。ScriptAlias指令定义了映射到一个特定目录的URL前缀,与Alias指令非常相似,两者一般都用于指定位于DocumentRoot目录以外的目录,其区别是ScriptAlias又多了一层含义,即其URL前缀中任何文件都被视为CGI程序。所以,上述例子会指示Apache/cgi-bin/应该指向/usr/local/apache/cgi-bin/目录,且视之为CGI程序。

 

  (2)用Options显式地允许CGI的执行

可以在主服务器配置文件中,使用Options指令显式地允许特定目录中CGI的执行:

<Directory /usr/local/apache/htdocs/somedir>Options +ExecCGI</Directory>

上述指令使Apache允许CGI文件的执行。另外,还必须告诉服务器哪些文件是CGI文件。下面的AddHandler指令告诉服务器所有带有cgipl后缀的文件是CGI程序:

AddHandler cgi-script cgi pl

 

  (3).htaccess文件

  在主服务器配置中如此配置:

AllowOverride Options

  在.htaccess文件中,需要如此配置:  

Options +ExecCGI

  以使Apache允许此目录中CGI程序的执行。 

 

 

2.按照cgi的格式输出内容

CGI程序的所有输出前面必须有一个MIME类型的头,即HTTP

有三个类型的头部: Content-type, Location, Status. Content-type 最普遍的。

有关content-type解释可以见有关HTML的说明一个你可以发出的特定编码象这样:Content-type: text/html在这个例子中,输出数据的类型是text/html; 换句话说他是个HTML文件. 其他详尽的说明参照apache文档

基本使用方法是

 

echo "xxxxxxx"

echo ""

其他详尽的说明参照apache文档

 

 

 

看完了1和2后可以做一个简单的demo:

apache配置为:

ScriptAlias /cgi-bin/ /data/server/xxxxxx/htdocs/cgi-bin/

 在目录下新建文件test.sh(写成test.cgi可能会逼格高一点,实际是一样的)

#!/bin/sh

echo "Content-type:text/html;charset=UTF8\n"

echo ""

echo "result=0&res_info=OK"

执行后应该能够返回

result=0&res_info=OK

 

再让我们干点cgi应该干的事情,解析输入,进行处理,再输出

这里要能够获取请求串中的参数就需要从环境变量env中取出REQUEST_METHOD和QUERY_STRING

REQUEST_METHOD为提交方式 get或post

QUERY_STRING为请求参数串,可能需要自己分割处理下

比如我需要调一个cgi查询手机号的验证码,传入的是手机号,处理逻辑是sql查询,返回的是查询结果

 

#!/bin/sh

echo "Content-type:text/html;charset=UTF8\n"
echo ""
method="$REQUEST_METHOD"
mobile=`echo  $QUERY_STRING | cut -d "=" -f2`

y=${mobile:0-3:1}
xx=${mobile:0-2:2}
verifycode=""
verifycode=`mysql -uroot -p111111 -e "select Fverify_code from verify_code_$xx.t_code_$y where Fmobile_no=‘$mobile‘ order by Fcreate_time  desc limit 1"|grep -v Fverify_code`
if [ !-n $verifycode ]; then echo "fail" else echo $verifycode fi

 curl "http://172.27.207.203:23080/wx_pay/v1.0/wx_get_sms.cgi?mobile=13xxxxxxxxxx” 或直接在浏览器中访问,返回的就是验证码,若不带参数或者mobile错误,则返回的是"fail"

 

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。