You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

121 lines
3.4 KiB

<?php
if (!defined('__TYPECHO_ROOT_DIR__')) exit;
/**
* CURL适配器
*
* @author qining
* @category typecho
* @package Http
* @copyright Copyright (c) 2008 Typecho team (http://www.typecho.org)
* @license GNU General Public License 2.0
* @version $Id$
*/
/**
* CURL适配器
*
* @author qining
* @category typecho
* @package Http
*/
class Typecho_Http_Client_Adapter_Curl extends Typecho_Http_Client_Adapter
{
/**
* 判断适配器是否可用
*
* @access public
* @return boolean
*/
public static function isAvailable()
{
return function_exists('curl_version');
}
/**
* 发送请求
*
* @access public
* @param string $url 请求地址
* @return string
*/
public function httpSend($url)
{
$ch = curl_init();
if ($this->ip) {
$url = $this->scheme . '://' . $this->ip . $this->path;
$this->headers['Rfc'] = $this->method . ' ' . $this->path . ' ' . $this->rfc;
$this->headers['Host'] = $this->host;
}
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_PORT, $this->port);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);
curl_setopt($ch, CURLOPT_TIMEOUT, $this->timeout);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
/** 设置HTTP版本 */
switch ($this->rfc) {
case 'HTTP/1.0':
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
break;
case 'HTTP/1.1':
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
break;
default:
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_NONE);
break;
}
/** 设置header信息 */
if (!empty($this->headers)) {
if (isset($this->headers['User-Agent'])) {
curl_setopt($ch, CURLOPT_USERAGENT, $this->headers['User-Agent']);
unset($this->headers['User-Agent']);
}
$headers = array();
if (isset($this->headers['Rfc'])) {
$headers[] = $this->headers['Rfc'];
unset($this->headers['Rfc']);
}
foreach ($this->headers as $key => $val) {
$headers[] = $key . ': ' . $val;
}
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
}
/** POST模式 */
if (Typecho_Http_Client::METHOD_POST == $this->method) {
if (!isset($this->headers['content-type'])) {
curl_setopt($ch, CURLOPT_POST, true);
}
if (!empty($this->data)) {
curl_setopt($ch, CURLOPT_POSTFIELDS, is_array($this->data) ? http_build_query($this->data) : $this->data);
}
if (!empty($this->files)) {
foreach ($this->files as $key => &$file) {
$file = '@' . $file;
}
curl_setopt($ch, CURLOPT_POSTFIELDS, $this->files);
}
}
$response = curl_exec($ch);
if (false === $response) {
throw new Typecho_Http_Client_Exception(curl_error($ch), 500);
}
curl_close($ch);
return $response;
}
}