| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 | <?phpnamespace Qiniu\Http;/** * HTTP response Object */final class Response{    public $statusCode;    public $headers;    public $body;    public $error;    private $jsonData;    public $duration;    /** @var array Mapping of status codes to reason phrases */    private static $statusTexts = array(        100 => 'Continue',        101 => 'Switching Protocols',        102 => 'Processing',        200 => 'OK',        201 => 'Created',        202 => 'Accepted',        203 => 'Non-Authoritative Information',        204 => 'No Content',        205 => 'Reset Content',        206 => 'Partial Content',        207 => 'Multi-Status',        208 => 'Already Reported',        226 => 'IM Used',        300 => 'Multiple Choices',        301 => 'Moved Permanently',        302 => 'Found',        303 => 'See Other',        304 => 'Not Modified',        305 => 'Use Proxy',        307 => 'Temporary Redirect',        308 => 'Permanent 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',        422 => 'Unprocessable Entity',        423 => 'Locked',        424 => 'Failed Dependency',        425 => 'Reserved for WebDAV advanced collections expired proposal',        426 => 'Upgrade required',        428 => 'Precondition Required',        429 => 'Too Many Requests',        431 => 'Request Header Fields Too Large',        500 => 'Internal Server Error',        501 => 'Not Implemented',        502 => 'Bad Gateway',        503 => 'Service Unavailable',        504 => 'Gateway Timeout',        505 => 'HTTP Version Not Supported',        506 => 'Variant Also Negotiates (Experimental)',        507 => 'Insufficient Storage',        508 => 'Loop Detected',        510 => 'Not Extended',        511 => 'Network Authentication Required',    );    /**     * @param int $code 状态码     * @param double $duration 请求时长     * @param array $headers 响应头部     * @param string $body 响应内容     * @param string $error 错误描述     */    public function __construct($code, $duration, array $headers = array(), $body = null, $error = null)    {        $this->statusCode = $code;        $this->duration = $duration;        $this->headers = $headers;        $this->body = $body;        $this->error = $error;        $this->jsonData = null;        if ($error !== null) {            return;        }        if ($body === null) {            if ($code >= 400) {                $this->error = self::$statusTexts[$code];            }            return;        }        if (self::isJson($headers)) {            try {                $jsonData = self::bodyJson($body);                if ($code >= 400) {                    $this->error = $body;                    if ($jsonData['error'] !== null) {                        $this->error = $jsonData['error'];                    }                }                $this->jsonData = $jsonData;            } catch (\InvalidArgumentException $e) {                $this->error = $body;                if ($code >= 200 && $code < 300) {                    $this->error = $e->getMessage();                }            }        } elseif ($code >= 400) {            $this->error = $body;        }        return;    }    public function json()    {        return $this->jsonData;    }    private static function bodyJson($body)    {        return \Qiniu\json_decode((string) $body, true, 512);    }    public function xVia()    {        $via = $this->headers['X-Via'];        if ($via === null) {            $via = $this->headers['X-Px'];        }        if ($via === null) {            $via = $this->headers['Fw-Via'];        }        return $via;    }    public function xLog()    {        return $this->headers['X-Log'];    }    public function xReqId()    {        return $this->headers['X-Reqid'];    }    public function ok()    {        return $this->statusCode >= 200 && $this->statusCode < 300 && $this->error === null;    }    public function needRetry()    {        $code = $this->statusCode;        if ($code < 0 || ($code / 100 === 5 and $code !== 579) || $code === 996) {            return true;        }    }    private static function isJson($headers)    {        return array_key_exists('Content-Type', $headers) &&        strpos($headers['Content-Type'], 'application/json') === 0;    }}
 |