天天看点

无聊时写的模拟HTTP请求类(模拟POST或GET)

<?php

/**

* HTTP Request Class

* @author Chelin Tsien

* @since 2010-11-15

* @param :

* $option = array(

* 'ssl_enable' => true,

* 'ssl_verifypeer' => false, //依赖于ssl_enable

* 'http_header' => array( // OR FALSE

* 'User-Agent: Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 6.0)',

* "Referer: http://XXXXXX/index.php?controller=game&action=index&id=$game",

* ),

* 'cookie_enable' => true,

* 'cookiefile' => true, //依赖于cookie_enable

* 'cookiejar' => true, //依赖于cookie_enable

* 'referer' => "http://".$host,

* 'header' => true,

* 'returntransfer' => true,

* 'cookie_save_file'=> false,

* );

*/

class fSocket{

public $method = "POST";

public $port = 80;

public $cookie_save_file;

/**

* Use Curl

*/

protected function _curl ($host, $path, $data, $option){

$url = $host.$path;

//echo $url ;exit;

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);

if($this->is_enable($option, 'ssl_enable')) {

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, $this->is_enable($option,'ssl_verifypeer'));

}

//TRUE to return the transfer as a string of the return value of curl_exec() instead of outputting it out directly

curl_setopt($ch, CURLOPT_RETURNTRANSFER, !isset($option['returntransfer']) ? TRUE : $option['returntransfer']);

curl_setopt($ch, CURLOPT_HEADER, $this->is_enable($option,'header'));

if (!empty($option['http_header'])&& is_array($option['http_header'])) {

curl_setopt($ch, CURLOPT_HTTPHEADER, $option['http_header']);

}

if($this->is_enable($option,'cookie_enable')) {

if (!$this->cookie_save_file) {

if (!empty($option['cookie_save_file'])) {

$this->cookie_save_file = $option['cookie_save_file'];

} else {

$this->cookie_save_file = tempnam('./tmp/','~');

}

}

//The name of the file containing the cookie data.

//The cookie file can be in Netscape format, or just plain HTTP-style headers dumped into a file.

$this->is_enable($option,'cookiefile') && curl_setopt($ch, CURLOPT_COOKIEFILE, $this->cookie_save_file);

//The name of a file to save all internal cookies to when the handle is closed, e.g. after a call to curl_close

$this->is_enable($option,'cookiejar') && curl_setopt($ch, CURLOPT_COOKIEJAR, $this->cookie_save_file);

}

if ($this->method == 'POST') {

curl_setopt($ch, CURLOPT_POST, TRUE);

curl_setopt($ch, CURLOPT_POSTFIELDS, $data);;

}

$this->is_enable($option,'referer') && curl_setopt($ch, CURLOPT_REFERER, $option['referer']);

$result = curl_exec($ch);

if(curl_errno($ch)) {

echo 'Curl error: ' . curl_error($ch);

}

//Close a cURL session

curl_close($ch);

return $result;

}

/**

* Open Internet or Unix domain socket connection

*/

protected function _fsockopen($host, $path, $data, $option) {

$port = isset($option['port']) && is_numeric($option['port']) ? $option['port'] : $this->port;

$fp = fsockopen($host, $port, $errorNumber, $errorString);

if(!$fp) {

return FALSE;

}

//push param

$send_params = $this->method . " " . $path ." HTTP/1.1/r/n";

$send_params .= "Host: $host/r/n";

if (!empty($option['http_header'])&& is_array($option['http_header'])){

$send_params .= implode("/r/n", $option['http_header']) . "/r/n";

}

$send_params .= "Content-Type: application/x-www-form-urlencoded/r/n";

if ($this->method == "POST") {

$send_params.= "Content-Length: ".strlen($data)."/r/n";

}

$send_params.= "Connection: close/r/n/r/n";

if ($this->method == "POST") {

$send_params .= $data;

}

fwrite($fp, $send_params);

$response = '';

while (!feof($fp)) {

$response.= fgets($fp, 128);

}

$response = preg_split("//r/n/r/n/",$response);

$header = $response[0];

$responsecontent = $response[1];

if(!(strpos($header,"Transfer-Encoding: chunked") === FALSE)){

$aux = preg_split("//r/n/",$responsecontent);

$count = count($aux);

for($i=0;$i < $count;$i++) {

if($i==0 || ($i%2==0)) {

$aux[$i] = "";

}

}

$responsecontent = implode("",$aux);

}//if

fclose($fp);

return rtrim($responsecontent);

}

/**

* send a request

*/

public function send($host, $path, $data = '', $option = array(), $method = "POST" ){

if(in_array($method, array('GET', 'POST'), TRUE)) {

$this->method = $method;

}

if((!function_exists("curl_init") && is_array($data)) || ($method == "GET" && is_array($data))) {

$url = '';

foreach ($data as $key => $val) {

$url .= $key . '=' . $val . '&';

}

$data = $url;

}

if ($method == "GET" && $data) {

if (strpos($path, '?') === FALSE) {

$path .= '?' . $data;

} else {

$path .= '&' . $data;

}

}

//优先调用Curl组件,从效率上来说会好点

if(function_exists("curl_init")) {

$return_info = $this->_curl($host, $path, $data, $option); //CURL组件

}else {

$return_info = $this->_fsockopen($host, $path, $data, $option); //fsockopen connection

}

return $return_info;

}

public function is_enable($param, $key) {

return !empty($param[$key]) ? $param[$key] : FALSE;

}

}

Example :

$f = new fSocket;

$http_header =array(

'User-Agent: Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 6.0)',

'Referer: http://{$host}/index.php?controller=game&action=index&id=$game',

);

$option = array(

'ssl_enable' => true,

'ssl_verifypeer' => false, //依赖于ssl_enable

'http_header' => false,

'cookie_enable' => true,

'cookiefile' => true, //依赖于cookie_enable

'cookiejar' => true, //依赖于cookie_enable

'referer' => "http://".$host,

'header' => true,

'returntransfer' => true,

'cookie_save_file'=> false,

);

$response = $f->send("https://xxxx.xx.xxx", "/xx/xx.aspx?siteflag=11", $data, $option);

继续阅读