<?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);