Chris@0
|
1 <?php
|
Chris@0
|
2 /**
|
Chris@0
|
3 * Zend Framework (http://framework.zend.com/)
|
Chris@0
|
4 *
|
Chris@0
|
5 * @link http://github.com/zendframework/zf2 for the canonical source repository
|
Chris@0
|
6 * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
|
Chris@0
|
7 * @license http://framework.zend.com/license/new-bsd New BSD License
|
Chris@0
|
8 */
|
Chris@0
|
9
|
Chris@0
|
10 namespace Zend\Feed\Reader\Http;
|
Chris@0
|
11
|
Chris@0
|
12 use Zend\Feed\Reader\Exception;
|
Chris@0
|
13
|
Chris@0
|
14 class Response implements HeaderAwareResponseInterface
|
Chris@0
|
15 {
|
Chris@0
|
16 /**
|
Chris@0
|
17 * @var string
|
Chris@0
|
18 */
|
Chris@0
|
19 private $body;
|
Chris@0
|
20
|
Chris@0
|
21 /**
|
Chris@0
|
22 * @var array
|
Chris@0
|
23 */
|
Chris@0
|
24 private $headers;
|
Chris@0
|
25
|
Chris@0
|
26 /**
|
Chris@0
|
27 * @var int
|
Chris@0
|
28 */
|
Chris@0
|
29 private $statusCode;
|
Chris@0
|
30
|
Chris@0
|
31 /**
|
Chris@0
|
32 * @param int $statusCode
|
Chris@0
|
33 * @param string|object $body
|
Chris@0
|
34 * @param array $headers
|
Chris@0
|
35 * @throws Exception\InvalidArgumentException
|
Chris@0
|
36 */
|
Chris@0
|
37 public function __construct($statusCode, $body = '', array $headers = [])
|
Chris@0
|
38 {
|
Chris@0
|
39 $this->validateStatusCode($statusCode);
|
Chris@0
|
40 $this->validateBody($body);
|
Chris@0
|
41 $this->validateHeaders($headers);
|
Chris@0
|
42
|
Chris@0
|
43 $this->statusCode = (int) $statusCode;
|
Chris@0
|
44 $this->body = (string) $body;
|
Chris@0
|
45 $this->headers = $this->normalizeHeaders($headers);
|
Chris@0
|
46 }
|
Chris@0
|
47
|
Chris@0
|
48 /**
|
Chris@0
|
49 * {@inheritDoc}
|
Chris@0
|
50 */
|
Chris@0
|
51 public function getStatusCode()
|
Chris@0
|
52 {
|
Chris@0
|
53 return $this->statusCode;
|
Chris@0
|
54 }
|
Chris@0
|
55
|
Chris@0
|
56 /**
|
Chris@0
|
57 * {@inheritDoc}
|
Chris@0
|
58 */
|
Chris@0
|
59 public function getBody()
|
Chris@0
|
60 {
|
Chris@0
|
61 return $this->body;
|
Chris@0
|
62 }
|
Chris@0
|
63
|
Chris@0
|
64 /**
|
Chris@0
|
65 * {@inheritDoc}
|
Chris@0
|
66 */
|
Chris@0
|
67 public function getHeaderLine($name, $default = null)
|
Chris@0
|
68 {
|
Chris@0
|
69 $normalizedName = strtolower($name);
|
Chris@0
|
70 return isset($this->headers[$normalizedName])
|
Chris@0
|
71 ? $this->headers[$normalizedName]
|
Chris@0
|
72 : $default;
|
Chris@0
|
73 }
|
Chris@0
|
74
|
Chris@0
|
75 /**
|
Chris@0
|
76 * Validate that we have a status code argument that will work for our context.
|
Chris@0
|
77 *
|
Chris@17
|
78 * @param int $statusCode
|
Chris@0
|
79 * @throws Exception\InvalidArgumentException for arguments not castable
|
Chris@0
|
80 * to integer HTTP status codes.
|
Chris@0
|
81 */
|
Chris@0
|
82 private function validateStatusCode($statusCode)
|
Chris@0
|
83 {
|
Chris@0
|
84 if (! is_numeric($statusCode)) {
|
Chris@0
|
85 throw new Exception\InvalidArgumentException(sprintf(
|
Chris@0
|
86 '%s expects a numeric status code; received %s',
|
Chris@0
|
87 __CLASS__,
|
Chris@0
|
88 (is_object($statusCode) ? get_class($statusCode) : gettype($statusCode))
|
Chris@0
|
89 ));
|
Chris@0
|
90 }
|
Chris@0
|
91
|
Chris@0
|
92 if (100 > $statusCode || 599 < $statusCode) {
|
Chris@0
|
93 throw new Exception\InvalidArgumentException(sprintf(
|
Chris@0
|
94 '%s expects an integer status code between 100 and 599 inclusive; received %s',
|
Chris@0
|
95 __CLASS__,
|
Chris@0
|
96 $statusCode
|
Chris@0
|
97 ));
|
Chris@0
|
98 }
|
Chris@0
|
99
|
Chris@0
|
100 if (intval($statusCode) != $statusCode) {
|
Chris@0
|
101 throw new Exception\InvalidArgumentException(sprintf(
|
Chris@0
|
102 '%s expects an integer status code; received %s',
|
Chris@0
|
103 __CLASS__,
|
Chris@0
|
104 $statusCode
|
Chris@0
|
105 ));
|
Chris@0
|
106 }
|
Chris@0
|
107 }
|
Chris@0
|
108
|
Chris@0
|
109 /**
|
Chris@0
|
110 * Validate that we have a body argument that will work for our context.
|
Chris@0
|
111 *
|
Chris@0
|
112 * @param mixed $body
|
Chris@0
|
113 * @throws Exception\InvalidArgumentException for arguments not castable
|
Chris@0
|
114 * to strings.
|
Chris@0
|
115 */
|
Chris@0
|
116 private function validateBody($body)
|
Chris@0
|
117 {
|
Chris@0
|
118 if (is_string($body)) {
|
Chris@0
|
119 return;
|
Chris@0
|
120 }
|
Chris@0
|
121
|
Chris@0
|
122 if (is_object($body) && method_exists($body, '__toString')) {
|
Chris@0
|
123 return;
|
Chris@0
|
124 }
|
Chris@0
|
125
|
Chris@0
|
126 throw new Exception\InvalidArgumentException(sprintf(
|
Chris@0
|
127 '%s expects a string body, or an object that can cast to string; received %s',
|
Chris@0
|
128 __CLASS__,
|
Chris@0
|
129 (is_object($body) ? get_class($body) : gettype($body))
|
Chris@0
|
130 ));
|
Chris@0
|
131 }
|
Chris@0
|
132
|
Chris@0
|
133 /**
|
Chris@0
|
134 * Validate header values.
|
Chris@0
|
135 *
|
Chris@0
|
136 * @param array $headers
|
Chris@0
|
137 * @throws Exception\InvalidArgumentException
|
Chris@0
|
138 */
|
Chris@0
|
139 private function validateHeaders(array $headers)
|
Chris@0
|
140 {
|
Chris@0
|
141 foreach ($headers as $name => $value) {
|
Chris@0
|
142 if (! is_string($name) || is_numeric($name) || empty($name)) {
|
Chris@0
|
143 throw new Exception\InvalidArgumentException(sprintf(
|
Chris@0
|
144 'Header names provided to %s must be non-empty, non-numeric strings; received %s',
|
Chris@0
|
145 __CLASS__,
|
Chris@0
|
146 $name
|
Chris@0
|
147 ));
|
Chris@0
|
148 }
|
Chris@0
|
149
|
Chris@0
|
150 if (! is_string($value) && ! is_numeric($value)) {
|
Chris@0
|
151 throw new Exception\InvalidArgumentException(sprintf(
|
Chris@0
|
152 'Individual header values provided to %s must be a string or numeric; received %s for header %s',
|
Chris@0
|
153 __CLASS__,
|
Chris@0
|
154 (is_object($value) ? get_class($value) : gettype($value)),
|
Chris@0
|
155 $name
|
Chris@0
|
156 ));
|
Chris@0
|
157 }
|
Chris@0
|
158 }
|
Chris@0
|
159 }
|
Chris@0
|
160
|
Chris@0
|
161 /**
|
Chris@0
|
162 * Normalize header names to lowercase.
|
Chris@0
|
163 *
|
Chris@0
|
164 * @param array $headers
|
Chris@0
|
165 * @return array
|
Chris@0
|
166 */
|
Chris@0
|
167 private function normalizeHeaders(array $headers)
|
Chris@0
|
168 {
|
Chris@0
|
169 $normalized = [];
|
Chris@0
|
170 foreach ($headers as $name => $value) {
|
Chris@0
|
171 $normalized[strtolower($name)] = $value;
|
Chris@0
|
172 }
|
Chris@0
|
173 return $normalized;
|
Chris@0
|
174 }
|
Chris@0
|
175 }
|