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.
301 lines
7.3 KiB
301 lines
7.3 KiB
<?php |
|
/** |
|
* API方法,Typecho命名空间 |
|
* |
|
* @category typecho |
|
* @package Response |
|
* @copyright Copyright (c) 2008 Typecho team (http://www.typecho.org) |
|
* @license GNU General Public License 2.0 |
|
* @version $Id$ |
|
*/ |
|
|
|
/** |
|
* Typecho公用方法 |
|
* |
|
* @category typecho |
|
* @package Response |
|
* @copyright Copyright (c) 2008 Typecho team (http://www.typecho.org) |
|
* @license GNU General Public License 2.0 |
|
*/ |
|
class Typecho_Response |
|
{ |
|
/** |
|
* http code |
|
* |
|
* @access private |
|
* @var array |
|
*/ |
|
private static $_httpCode = array( |
|
100 => 'Continue', |
|
101 => 'Switching Protocols', |
|
200 => 'OK', |
|
201 => 'Created', |
|
202 => 'Accepted', |
|
203 => 'Non-Authoritative Information', |
|
204 => 'No Content', |
|
205 => 'Reset Content', |
|
206 => 'Partial Content', |
|
300 => 'Multiple Choices', |
|
301 => 'Moved Permanently', |
|
302 => 'Found', |
|
303 => 'See Other', |
|
304 => 'Not Modified', |
|
305 => 'Use Proxy', |
|
307 => 'Temporary Redirect', |
|
400 => 'Bad Request', |
|
401 => 'Unauthorized', |
|
402 => 'Payment Required', |
|
403 => 'Forbidden', |
|
404 => 'Not Found', |
|
405 => 'Method Not Allowed', |
|
406 => 'Not Acceptable', |
|
407 => 'Proxy Authentication Required', |
|
408 => 'Request Timeout', |
|
409 => 'Conflict', |
|
410 => 'Gone', |
|
411 => 'Length Required', |
|
412 => 'Precondition Failed', |
|
413 => 'Request Entity Too Large', |
|
414 => 'Request-URI Too Long', |
|
415 => 'Unsupported Media Type', |
|
416 => 'Requested Range Not Satisfiable', |
|
417 => 'Expectation Failed', |
|
500 => 'Internal Server Error', |
|
501 => 'Not Implemented', |
|
502 => 'Bad Gateway', |
|
503 => 'Service Unavailable', |
|
504 => 'Gateway Timeout', |
|
505 => 'HTTP Version Not Supported' |
|
); |
|
|
|
/** |
|
* 字符编码 |
|
* |
|
* @var mixed |
|
* @access private |
|
*/ |
|
private $_charset; |
|
|
|
//默认的字符编码 |
|
const CHARSET = 'UTF-8'; |
|
|
|
/** |
|
* 单例句柄 |
|
* |
|
* @access private |
|
* @var Typecho_Response |
|
*/ |
|
private static $_instance = null; |
|
|
|
/** |
|
* 获取单例句柄 |
|
* |
|
* @access public |
|
* @return Typecho_Response |
|
*/ |
|
public static function getInstance() |
|
{ |
|
if (null === self::$_instance) { |
|
self::$_instance = new Typecho_Response(); |
|
} |
|
|
|
return self::$_instance; |
|
} |
|
|
|
/** |
|
* 解析ajax回执的内部函数 |
|
* |
|
* @access private |
|
* @param mixed $message 格式化数据 |
|
* @return string |
|
*/ |
|
private function _parseXml($message) |
|
{ |
|
/** 对于数组型则继续递归 */ |
|
if (is_array($message)) { |
|
$result = ''; |
|
|
|
foreach ($message as $key => $val) { |
|
$tagName = is_int($key) ? 'item' : $key; |
|
$result .= '<' . $tagName . '>' . $this->_parseXml($val) . '</' . $tagName . '>'; |
|
} |
|
|
|
return $result; |
|
} else { |
|
return preg_match("/^[^<>]+$/is", $message) ? $message : '<![CDATA[' . $message . ']]>'; |
|
} |
|
} |
|
|
|
/** |
|
* 设置默认回执编码 |
|
* |
|
* @access public |
|
* @param string $charset 字符集 |
|
* @return void |
|
*/ |
|
public function setCharset($charset = null) |
|
{ |
|
$this->_charset = empty($charset) ? self::CHARSET : $charset; |
|
} |
|
|
|
/** |
|
* 获取字符集 |
|
* |
|
* @access public |
|
* @return string |
|
*/ |
|
public function getCharset() |
|
{ |
|
if (empty($this->_charset)) { |
|
$this->setCharset(); |
|
} |
|
|
|
return $this->_charset; |
|
} |
|
|
|
/** |
|
* 在http头部请求中声明类型和字符集 |
|
* |
|
* @access public |
|
* @param string $contentType 文档类型 |
|
* @return void |
|
*/ |
|
public function setContentType($contentType = 'text/html') |
|
{ |
|
header('Content-Type: ' . $contentType . '; charset=' . $this->getCharset(), true); |
|
} |
|
|
|
/** |
|
* 设置http头 |
|
* |
|
* @access public |
|
* @param string $name 名称 |
|
* @param string $value 对应值 |
|
* @return void |
|
*/ |
|
public function setHeader($name, $value) |
|
{ |
|
header($name . ': ' . $value, true); |
|
} |
|
|
|
/** |
|
* 设置HTTP状态 |
|
* |
|
* @access public |
|
* @param integer $code http代码 |
|
* @return void |
|
*/ |
|
public static function setStatus($code) |
|
{ |
|
if (isset(self::$_httpCode[$code])) { |
|
header((isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.1') . ' ' . $code . ' ' . self::$_httpCode[$code], true, $code); |
|
} |
|
} |
|
|
|
/** |
|
* 抛出ajax的回执信息 |
|
* |
|
* @access public |
|
* @param string $message 消息体 |
|
* @return void |
|
*/ |
|
public function throwXml($message) |
|
{ |
|
/** 设置http头信息 */ |
|
$this->setContentType('text/xml'); |
|
|
|
/** 构建消息体 */ |
|
echo '<?xml version="1.0" encoding="' . $this->getCharset() . '"?>', |
|
'<response>', |
|
$this->_parseXml($message), |
|
'</response>'; |
|
|
|
/** 终止后续输出 */ |
|
exit; |
|
} |
|
|
|
/** |
|
* 抛出json回执信息 |
|
* |
|
* @access public |
|
* @param mixed $message 消息体 |
|
* @return void |
|
*/ |
|
public function throwJson($message) |
|
{ |
|
/** 设置http头信息 */ |
|
$this->setContentType('application/json'); |
|
|
|
echo Json::encode($message); |
|
|
|
/** 终止后续输出 */ |
|
exit; |
|
} |
|
|
|
/** |
|
* 重定向函数 |
|
* |
|
* @access public |
|
* @param string $location 重定向路径 |
|
* @param boolean $isPermanently 是否为永久重定向 |
|
* @return void |
|
*/ |
|
public function redirect($location, $isPermanently = false) |
|
{ |
|
/** Typecho_Common */ |
|
$location = Typecho_Common::safeUrl($location); |
|
|
|
if ($isPermanently) { |
|
header('Location: ' . $location, false, 301); |
|
exit; |
|
} else { |
|
header('Location: ' . $location, false, 302); |
|
exit; |
|
} |
|
} |
|
|
|
/** |
|
* 返回来路 |
|
* |
|
* @access public |
|
* @param string $suffix 附加地址 |
|
* @param string $default 默认来路 |
|
*/ |
|
public function goBack($suffix = NULL, $default = NULL) |
|
{ |
|
//获取来源 |
|
$referer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : ''; |
|
|
|
//判断来源 |
|
if (!empty($referer)) { |
|
// ~ fix Issue 38 |
|
if (!empty($suffix)) { |
|
$parts = parse_url($referer); |
|
$myParts = parse_url($suffix); |
|
|
|
if (isset($myParts['fragment'])) { |
|
$parts['fragment'] = $myParts['fragment']; |
|
} |
|
|
|
if (isset($myParts['query'])) { |
|
$args = array(); |
|
if (isset($parts['query'])) { |
|
parse_str($parts['query'], $args); |
|
} |
|
|
|
parse_str($myParts['query'], $currentArgs); |
|
$args = array_merge($args, $currentArgs); |
|
$parts['query'] = http_build_query($args); |
|
} |
|
|
|
$referer = Typecho_Common::buildUrl($parts); |
|
} |
|
|
|
$this->redirect($referer, false); |
|
} else if (!empty($default)) { |
|
$this->redirect($default); |
|
} |
|
|
|
exit; |
|
} |
|
}
|
|
|