Chris@0: 'Continue', Chris@0: 101 => 'Switching Protocols', Chris@0: 102 => 'Processing', Chris@12: 103 => 'Early Hints', Chris@0: // SUCCESS CODES Chris@0: 200 => 'OK', Chris@0: 201 => 'Created', Chris@0: 202 => 'Accepted', Chris@0: 203 => 'Non-Authoritative Information', Chris@0: 204 => 'No Content', Chris@0: 205 => 'Reset Content', Chris@0: 206 => 'Partial Content', Chris@0: 207 => 'Multi-Status', Chris@0: 208 => 'Already Reported', Chris@0: 226 => 'IM Used', Chris@0: // REDIRECTION CODES Chris@0: 300 => 'Multiple Choices', Chris@0: 301 => 'Moved Permanently', Chris@0: 302 => 'Found', Chris@0: 303 => 'See Other', Chris@0: 304 => 'Not Modified', Chris@0: 305 => 'Use Proxy', Chris@0: 306 => 'Switch Proxy', // Deprecated to 306 => '(Unused)' Chris@0: 307 => 'Temporary Redirect', Chris@0: 308 => 'Permanent Redirect', Chris@0: // CLIENT ERROR Chris@0: 400 => 'Bad Request', Chris@0: 401 => 'Unauthorized', Chris@0: 402 => 'Payment Required', Chris@0: 403 => 'Forbidden', Chris@0: 404 => 'Not Found', Chris@0: 405 => 'Method Not Allowed', Chris@0: 406 => 'Not Acceptable', Chris@0: 407 => 'Proxy Authentication Required', Chris@0: 408 => 'Request Timeout', Chris@0: 409 => 'Conflict', Chris@0: 410 => 'Gone', Chris@0: 411 => 'Length Required', Chris@0: 412 => 'Precondition Failed', Chris@0: 413 => 'Payload Too Large', Chris@0: 414 => 'URI Too Long', Chris@0: 415 => 'Unsupported Media Type', Chris@0: 416 => 'Range Not Satisfiable', Chris@0: 417 => 'Expectation Failed', Chris@0: 418 => 'I\'m a teapot', Chris@0: 421 => 'Misdirected Request', Chris@0: 422 => 'Unprocessable Entity', Chris@0: 423 => 'Locked', Chris@0: 424 => 'Failed Dependency', Chris@16: 425 => 'Too Early', Chris@0: 426 => 'Upgrade Required', Chris@0: 428 => 'Precondition Required', Chris@0: 429 => 'Too Many Requests', Chris@0: 431 => 'Request Header Fields Too Large', Chris@0: 444 => 'Connection Closed Without Response', Chris@0: 451 => 'Unavailable For Legal Reasons', Chris@0: // SERVER ERROR Chris@0: 499 => 'Client Closed Request', Chris@0: 500 => 'Internal Server Error', Chris@0: 501 => 'Not Implemented', Chris@0: 502 => 'Bad Gateway', Chris@0: 503 => 'Service Unavailable', Chris@0: 504 => 'Gateway Timeout', Chris@0: 505 => 'HTTP Version Not Supported', Chris@0: 506 => 'Variant Also Negotiates', Chris@0: 507 => 'Insufficient Storage', Chris@0: 508 => 'Loop Detected', Chris@0: 510 => 'Not Extended', Chris@0: 511 => 'Network Authentication Required', Chris@0: 599 => 'Network Connect Timeout Error', Chris@0: ]; Chris@0: Chris@0: /** Chris@0: * @var string Chris@0: */ Chris@17: private $reasonPhrase; Chris@0: Chris@0: /** Chris@0: * @var int Chris@0: */ Chris@0: private $statusCode; Chris@0: Chris@0: /** Chris@0: * @param string|resource|StreamInterface $body Stream identifier and/or actual stream resource Chris@0: * @param int $status Status code for the response, if any. Chris@0: * @param array $headers Headers for the response, if any. Chris@0: * @throws InvalidArgumentException on any invalid element. Chris@0: */ Chris@0: public function __construct($body = 'php://memory', $status = 200, array $headers = []) Chris@0: { Chris@0: $this->setStatusCode($status); Chris@0: $this->stream = $this->getStream($body, 'wb+'); Chris@0: $this->setHeaders($headers); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getStatusCode() Chris@0: { Chris@0: return $this->statusCode; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getReasonPhrase() Chris@0: { Chris@0: return $this->reasonPhrase; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function withStatus($code, $reasonPhrase = '') Chris@0: { Chris@0: $new = clone $this; Chris@17: $new->setStatusCode($code, $reasonPhrase); Chris@0: return $new; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Set a valid status code. Chris@0: * Chris@0: * @param int $code Chris@17: * @param string $reasonPhrase Chris@0: * @throws InvalidArgumentException on an invalid status code. Chris@0: */ Chris@17: private function setStatusCode($code, $reasonPhrase = '') Chris@0: { Chris@0: if (! is_numeric($code) Chris@0: || is_float($code) Chris@0: || $code < static::MIN_STATUS_CODE_VALUE Chris@0: || $code > static::MAX_STATUS_CODE_VALUE Chris@0: ) { Chris@0: throw new InvalidArgumentException(sprintf( Chris@0: 'Invalid status code "%s"; must be an integer between %d and %d, inclusive', Chris@17: is_scalar($code) ? $code : gettype($code), Chris@0: static::MIN_STATUS_CODE_VALUE, Chris@0: static::MAX_STATUS_CODE_VALUE Chris@0: )); Chris@0: } Chris@17: Chris@17: if (! is_string($reasonPhrase)) { Chris@17: throw new InvalidArgumentException(sprintf( Chris@17: 'Unsupported response reason phrase; must be a string, received %s', Chris@17: is_object($reasonPhrase) ? get_class($reasonPhrase) : gettype($reasonPhrase) Chris@17: )); Chris@17: } Chris@17: Chris@17: if ($reasonPhrase === '' && isset($this->phrases[$code])) { Chris@17: $reasonPhrase = $this->phrases[$code]; Chris@17: } Chris@17: Chris@17: $this->reasonPhrase = $reasonPhrase; Chris@17: $this->statusCode = (int) $code; Chris@0: } Chris@0: }