类名:httprequest($url="",$method="get",$usesocket=0)
$url为请求的地址;默认请求方法为get;$usesocket默认为0,使用fsockopen方法,如果设置为1则使用socket_create方法
方法:
open($ip="",$port=-1) //打开同服务器的连接,默认不用设置这两个参数(一个同事在linux用的时候,请求的不是hostname解析的ip,因此加了这两个参数,以连接真实的服务器ip)
settimeout($timeout=0) //设置获取数据的超时时间,必须在send方法调用之前设置才有效,单位秒,默认值0为不限制
setrequestheader($key,$value="") //设置请求头,必须在send方法调用之前设置才有效
removerequestheader($key,$value="") //移除指定键值的请求头,必须在send方法调用之前调用才有效
send($data="") //发送数据$data到服务器
getresponsebody() //获取服务器返回的文本
getallresponseheaders() //获取服务器响应的所有头信息
getresponseheader($key) //获取服务器响应的某个头信息,例如server,set_cookie等
属性:
$url //要请求的url
$method //请求方法(post/get)
$port //请求的端口
$hostname //请求的主机名
$uri //url的文件部分
$protocol //请求协议(http)(包括本属性的以上5个属性均由程序自动通过url分析)
$excption //异常信息
$_headers=array() //请求头array("key"=>"value")
$_senddata //发送到服务器的数据
$status //返回的状态码
$statustext //状态信息
$httpprotocolversion //服务器的http协议版本
注意:
host头由程序自动设置,当用post方法请求时,content-length和content-type已被自动设置.
支持gzip压缩的页面,inc.http.php文件代码如下:
- <?php
- class httprequest{
- public $url,$method,$port,$hostname,$uri,$protocol,$excption,$_headers=array(),$_senddata,$status,$statustext,$httpprotocolversion;
- private $fp=0,$_buffer="",$responsebody,$responseheader,$timeout=0,$usesocket;
-
- function __construct($url="",$method="get",$usesocket=0){
- $this->url = $url;
- $this->method = strtoupper($method);
- $this->usesocket = $usesocket;
- $this->setrequestheader("accept","*/*");
- $this->setrequestheader("accept-language","zh-cn");
- $this->setrequestheader("accept-encoding","gzip, deflate");
- $this->setrequestheader("user-agent","httprequest class 1.0");
- }
-
-
- public function open($ip="",$port=-1){
- if(!$this->_geturlinfo()) return false;
- $this->setrequestheader("host",$this->hostname);
- $this->setrequestheader("connection","close");
- $ip = ($ip=="" ? $this->hostname : $ip);
- $port = ($port==-1 ? $this->port : $port);
- if($this->usesocket==1){
- if(!$this->fp=$socket=socket_create(af_inet,sock_stream,0)) {
- $this->excption="can not create socket";return false;
- }else{
- if(!socket_connect($this->fp,$ip, $port) ){
- $this->excption="can not connect to server " . $this->hostname . " on port" . $this->port;return false;
- }
- }
- }else{
- if(!$this->fp=fsockopen($ip, $port,$errno,$errstr,10)) {
- $this->excption="can not connect to server " . $this->hostname . " on port" . $this->port;return false;
- }
- }
- return true;
- }
-
- public function send($data=""){
- if(!$this->fp){$this->excption="is not a resource id";return false;}
- if($this->method=="get" && $data!=""){
- $s_str="?";
- if(strpos($this->uri,"?")>0) $s_str = "&";
- $this->uri.= $s_str . $data;
- $data="";
- }
- $senddata=$this->method . " " . $this->uri . " http/1.1rn";
- if($this->method=="post"){
- $this->setrequestheader("content-length",strlen($data));
- $this->setrequestheader("content-type", "application/x-www-form-urlencoded");
- }
- foreach($this->_headers as $keys => $value){
- $senddata .= "$keys: $valuern";
- }
- $senddata .= "rn";
- if($this->method=="post") $senddata .= $data;
- $this->_senddata = $senddata;
- if($this->usesocket==1){
- socket_write($this->fp,$this->_senddata);
- $buffer="";
- $timestart = time();
- do{
- if($this->timeout>0){
- if(time()-$timestart>$this->timeout){break;}
- }
- $this->_buffer.=$buffer;
- $buffer = socket_read($this->fp,4096);
- }while($buffer!="");
- socket_close($this->fp);
- }else{
- fputs($this->fp, $senddata);
- $this->_buffer="";
- $timestart = time();
- while(!feof($this->fp))
- {
- if($this->timeout>0){
- if(time()-$timestart>$this->timeout){break;}
- }
- $this->_buffer.=fgets($this->fp,4096);
- }
- fclose($this->fp);
- }
- $this->_splitcontent();
- $this->_getheaderinfo();
- }
-
- public function getresponsebody(){
- if($this->getresponseheader("content-encoding")=="gzip" && $this->getresponseheader("transfer-encoding")=="chunked"){
- return gzdecode_1(transfer_encoding_chunked_decode($this->responsebody));
- }else if($this->getresponseheader("content-encoding")=="gzip"){
- return gzdecode_1($this->responsebody);
- }else{
- return $this->responsebody;
- }
- }
-
- public function getallresponseheaders(){
- return $this->responseheader;
- }
-
- public function getresponseheader($key){
- $key = str_replace("-","-",$key);
- $headerstr = $this->responseheader . "rn";
- $count = preg_match_all("/n$key:(.+?)r/is",$headerstr,$result,preg_set_order);
- if($count>0){
- $returnstr="";
- foreach($result as $key1=>$value){
- if(strtoupper($key)=="set-cookie"){
- $value[1] = substr($value[1],0,strpos($value[1],";"));
- }
- $returnstr .= ltrim($value[1]) . "; ";
- }
- $returnstr = substr($returnstr,0,strlen($returnstr)-2);
- return $returnstr;
- }else{return "";}
- }
-
- public function settimeout($timeout=0){
- $this->timeout = $timeout;
- }
-
- public function setrequestheader($key,$value=""){
- $this->_headers[$key]=$value;
- }
-
- public function removerequestheader($key){
- if(count($this->_headers)==0){return;}
- $_temp=array();
- foreach($this->_headers as $keys => $value){
- if($keys!=$key){
- $_temp[$keys]=$value;
- }
- }
- $this->_headers = $_temp;
- }
-
-
- private function _geturlinfo(){
- $url = $this->url;
- $count = preg_match("/^http://([^:/]+?)(:(d+))?/(.+?)$/is",$url,$result);
- if($count>0){
- $this->uri="/" . $result[4];
- }else{
- $count = preg_match("/^http://([^:/]+?)(:(d+))?(/)?$/is",$url,$result);
- if($count>0){
- $this->uri="/";
- }
- }
- if($count>0){
- $this->protocol="http";
- $this->hostname=$result[1];
- if(isset($result[2]) && $result[2]!="") {$this->port=intval($result[3]);}else{$this->port=80;}
- return true;
- }else{$this->excption="url format error";return false;}
- }
-
- private function _splitcontent(){
- $this->responseheader="";
- $this->responsebody="";
- $p1 = strpos($this->_buffer,"rnrn");
- if($p1>0){
- $this->responseheader = substr($this->_buffer,0,$p1);
- if($p1+4<strlen($this->_buffer)){
- $this->responsebody = substr($this->_buffer,$p1+4);
- }
- }
- }
-
- private function _getheaderinfo(){
- $headerstr = $this->responseheader;
- $count = preg_match("/^http/(.+?)s(d+)s(.+?)rn/is",$headerstr,$result);
- if($count>0){
- $this->httpprotocolversion = $result[1];
- $this->status = intval($result[2]);
- $this->statustext = $result[3];
- }
- }
- }
-
-
- function gzdecode_1 ($data) {
- $data = ($data);
- if (!function_exists ( 'gzdecode' )) {
- $flags = ord ( substr ( $data, 3, 1 ) );
- $headerlen = 10;
- $extralen = 0;
- $filenamelen = 0;
- if ($flags & 4) {
- $extralen = unpack ( 'v', substr ( $data, 10, 2 ) );
- $extralen = $extralen [1];
- $headerlen += 2 + $extralen;
- }
- if ($flags & 8)
- $headerlen = strpos ( $data, chr ( 0 ), $headerlen ) + 1;
- if ($flags & 16)
- $headerlen = strpos ( $data, chr ( 0 ), $headerlen ) + 1;
- if ($flags & 2)
- $headerlen += 2;
- $unpacked = @gzinflate ( substr ( $data, $headerlen ) );
- if ($unpacked === false)
- $unpacked = $data;
- return $unpacked;
- }else{
- return gzdecode($data);
- }
- }
- function transfer_encoding_chunked_decode($in) {
- $out = "";
- while ( $in !="") {
- $lf_pos = strpos ( $in, "12" );
- if ($lf_pos === false) {
- $out .= $in;
- break;
- }
- $chunk_hex = trim ( substr ( $in, 0, $lf_pos ) );
- $sc_pos = strpos ( $chunk_hex, ';' );
- if ($sc_pos !== false)
- $chunk_hex = substr ( $chunk_hex, 0, $sc_pos );
- if ($chunk_hex =="") {
- $out .= substr ( $in, 0, $lf_pos );
- $in = substr ( $in, $lf_pos + 1 );
- continue;
- }
- $chunk_len = hexdec ( $chunk_hex );
- if ($chunk_len) {
- $out .= substr ( $in, $lf_pos + 1, $chunk_len );
- $in = substr ( $in, $lf_pos + 2 + $chunk_len );
- } else {
- $in = "";
- }
- }
- return $out;
- }
- function utf8togb($str){
- return iconv("utf-8","gbk",$str);
- }
- function gbtoutf8($str){
- return iconv("gbk","utf-8",$str);
- }
- ?>
response.asp文件,代码如下:
- <%
- response.cookies("a") = "anlige"
- response.cookies("a").expires = dateadd("yyyy",1,now())
- response.cookies("b")("c") = "wsdasdadsa"
- response.cookies("b")("d") = "ddd"
- response.cookies("b").expires = dateadd("yyyy",1,now())
- response.write "querystring : " & request.querystring & "<br />"
- for each v in request.querystring
- response.write v & "=" & request.querystring(v) & "<br />"
- next
- response.write "<br />form : " & request.form & "<br />"
- for each v in request.form
- response.write v & "=" & request.form(v) & "<br />"
- next
- response.write "<br />url : " & request.servervariables("url") & "<br />"
- response.write "referer : " & request.servervariables("http_referer") & "<br />"
- response.write "host : " & request.servervariables("http_host") & "<br />"
- response.write "user-agent : " & request.servervariables("http_user_agent") & "<br />"
- response.write "cookie" & request.servervariables("http_cookie")
- %>
- index.php文件
- <a href="?action=get">get传数据</a>
- <a href="?action=post">post传数据</a>
- <a href="?action=header_referer">向服务器发送来路信息</a>
- <a href="?action=header_useragent">向服务器发送user-agent</a>
- <a href="?action=status">获取服务器返回的状态</a>
- <a href="?action=get_headers">获取服务器响应头</a>
- <a href="?action=get_image">保存图片</a><br /><br /><br />
- <?php
- include("inc_http.php");
- $responseurl = "http://dev.mo.cn/aiencode/http/response.asp";
- $act = isset($_get["action"]) ? $_get["action"] : "";
- if($act == "get"){ //get传数据
- $myhttp = new httprequest("$responseurl?a=text");
- $myhttp->open();
- $myhttp->send("name=anlige&city=" . urlencode("杭州"));
- echo($myhttp->getresponsebody());
-
- }else if($act == "post"){ //post传数据
- $myhttp = new httprequest("$responseurl?a=text","post");
- $myhttp->open();
- $myhttp->send("name=anlige&city=" . urlencode("杭州"));
- echo($myhttp->getresponsebody());
-
- }else if($act == "header_referer"){ //向服务器发送来路信息
- $myhttp = new httprequest("$responseurl?a=text","post");
- $myhttp->open();
- $myhttp->setrequestheader("referer","http://www.baidu.com");
- $myhttp->send("name=anlige&city=" . urlencode("杭州"));
- echo($myhttp->getresponsebody());
-
- }else if($act == "header_useragent"){ //向服务器发送user-agent
- $myhttp = new httprequest("$responseurl?a=text","post");
- $myhttp->open();
- $myhttp->setrequestheader("referer","http://www.baidu.com");
- $myhttp->setrequestheader("user-agent","mozilla/4.0 (compatible; msie 7.0; windows nt 6.0; trident/4.0)");
- $myhttp->send("name=anlige&city=" . urlencode("杭州"));
- echo($myhttp->getresponsebody());
-
- }else if($act == "status"){ //获取服务器返回的状态
- $myhttp = new httprequest("$responseurl?a=text","post");
- $myhttp->open();
- $myhttp->send("name=anlige&city=" . urlencode("杭州"));
- echo($myhttp->status . " " . $myhttp->statustext ."<br /><br />");
- echo($myhttp->getresponsebody());
-
- }else if($act == "get_headers"){ //获取服务器响应头
- $myhttp = new httprequest("$responseurl?a=text","get");
- $myhttp->open();
- $myhttp->send("name=anlige&city=" . urlencode("杭州"));
- echo($myhttp->getallresponseheaders()."<br /><br />");
- echo($myhttp->getresponseheader("server")."<br /><br />");
-
- }else if($act == "get_image"){
-
- $myhttp = new httprequest("http://www.baidu.com/img/baidu_logo.gif");
- $myhttp->open();
- $myhttp->send();
- $fp = @fopen("demo.gif","w");
- fwrite($fp,$myhttp->getresponsebody());
- fclose($fp);
- echo("<img src="demo.gif" />");
- }
- ?>
|