模拟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指令告诉服务器所有带有cgi或pl后缀的文件是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

时间: 2024-10-10 02:35:25

模拟HTTP请求的返回&shell写cgi的相关文章

20150108--HTTP协议+PHP模拟HTTP请求-02

HTTP协议 1. 什么是http协议? 协议:协议是一种双方约定好的规范,双方在做某一件事情的事情,必须按照事先定义好的规范去实现和操作. HTTP:超文本传输协议,HyperText Transport Protocol,超文本在服务器与浏览器之间传输的时候必须遵循的协议. 2. 什么是html? 超文本标记语言:HyperText Markup Language html的作用:保证同一数据在不同的电脑(用户),看到的效果一样. HTTP协议工作原理 HTTP协议特点 支持客户/服务器模式

postman模拟http请求

一.http请求(仅描述get和post请求) 1.get请求:在URL中直接展示参数名称和数值,请求长度有限制 例如,请求userid=1的用户信息,url:http://hostname/getuser?userid=1 2.post请求:将数据放在body中进行传输,因此,url中不会暴露请求的参数.post请求的数据可以非常大,可能会修改服务器中的资源.post请求需要借助工具,例如postman 1)上传文件 2)传输json数据类型:选择Body-raw,将最后一个选项Text修改成

Web后端语言模拟http请求(带用户名和密码)实例代码大全

RESTful API是目前比较成熟的一套互联网应用程序的API设计理论.而随着RESTful API的成熟和流行,应用开发方面就需要以模拟http请求的方式来调用RESTful API接口:经过一段时间的IBM的云平台Blumemix的学习及语言翻译服务的应用,积累了Java.ASP.NET.Nodejs.Go.PHP.Python.Ruby等语言调用Rest API的方法,这里整理到一起,和大家分享一下. 有关RESTful API请参考:理解RESTful架构,RESTful API 设计

多个网络请求成功返回再执行另外任务的思路分析(iOS)

前言 今天我们来讨论一个经常出现的需求场景,也是一个老话题.在开发中我们往往会遇到需要进行多个网络请求,并且需要多个网络请求成功返回后再做其他事的场景.比如同一个界面显示的内容需要用到两个网络接口,而需求又希望成功返回两个接口的数据再进行页面展示:又比如喜欢挖坑的后台同学就只提供了返回一条数据的接口,但需求却希望我们在一个界面同时显示几条数据的情况. 正题 我们不讨论什么执行完一个请求再执行一个这种串行的低效率方法,以下分析都是在异步的基础上进行的.废话少说,直奔正题!先上个网络请求的模拟代码.

linux系统里模拟并发请求siege

siege压力测试,siege会将接口进行模拟并发,返回每秒的并发数! 一.siege的安装下载:wget 一.siege的安装下载:wget http://download.joedog.org/siege/siege-latest.tar.gz http://www.joedog.org/pub/siege/siege-latest.tar.gz解压: tar -zxvf siege-latest.tar.gzcd siege-..*./configure --prefix=/usr/loc

php模拟post请求发送文件

由于项目需要,需要本地服务器接收数据后,再将数据转发到另外一台服务器上,故要用到模拟post请求发送数据,当然数据中也包含文件流. curl是php比较常用的方式之一,一般代码如下: $params1 = "test"; $params2 = "@".$absolute_path;//如果是文件 则参数为"@"+绝对路径 $post_data = array( 'params1' => $params1, 'params2' => $

PHP+SOCKET 模拟HTTP请求

HTTP消息结构 客户端请求包括四部份:请求行(状态行).请求头.空行.请求主体(数据),如下图: 服务端响应包括四部份:响应行(状态行).响应头.空行.响应主体(数据),如图: HTTP请求方法: POST .GET  .HEADE.  PUT.  TRACE  .DELETE .OPTIONS .CONNECT  (前三种最实用),有这麽多的请求方法,但web服务器不一定所有的都支持. GET   基本一致,请求指定的页面信息,并返回实体主体. HEAD  基本和GET一致 ,只不过返回的响

JQuery请求WebService返回数据的几种处理方式

打开自己的博客仔细浏览了一番,发现已经好久没有写博客了,由于最近一直比较忙碌懈怠了好多.默默反省三分钟.......言归正传,现在就对最近在学习webservice的过程中遇到的几种类型的问题中我的理解和解决方案.对于webservice大家肯定知道,它是一种使不同站点之间可以相互通信的技术,可以理解为一种接口.一个站点可以通过其它站点提供的webservice接口获得其它站点提供的相应服务.webservice使用起来非常小巧,轻便被很多站点所使用.对于webservice我不做过多说明,we

python利用requests模拟http请求及请求头

一.通过requests发送请求 之前一直使用urllib以及urllib2模拟http请求发送,在实际场景中,我们需要造自己定义好的header.body等等,使用urllib很麻烦,很偶然的机会,接触到了requests,可以通过发送xml.简单易用,直接上代码: requests  connected():          #通过形参传入url以及请求参数,get方法发送请求     (param):         get = requests.get(==param)