Chris@0
|
1 <?php
|
Chris@0
|
2 /**
|
Chris@12
|
3 * @see https://github.com/zendframework/zend-diactoros for the canonical source repository
|
Chris@12
|
4 * @copyright Copyright (c) 2015-2017 Zend Technologies USA Inc. (http://www.zend.com)
|
Chris@0
|
5 * @license https://github.com/zendframework/zend-diactoros/blob/master/LICENSE.md New BSD License
|
Chris@0
|
6 */
|
Chris@0
|
7
|
Chris@0
|
8 namespace Zend\Diactoros;
|
Chris@0
|
9
|
Chris@0
|
10 use InvalidArgumentException;
|
Chris@0
|
11 use Psr\Http\Message\UploadedFileInterface;
|
Chris@0
|
12 use stdClass;
|
Chris@0
|
13 use UnexpectedValueException;
|
Chris@0
|
14
|
Chris@16
|
15 use function array_change_key_case;
|
Chris@16
|
16 use function array_key_exists;
|
Chris@16
|
17 use function explode;
|
Chris@16
|
18 use function implode;
|
Chris@16
|
19 use function is_array;
|
Chris@16
|
20 use function is_callable;
|
Chris@16
|
21 use function strtolower;
|
Chris@16
|
22
|
Chris@16
|
23 use const CASE_LOWER;
|
Chris@16
|
24
|
Chris@0
|
25 /**
|
Chris@0
|
26 * Class for marshaling a request object from the current PHP environment.
|
Chris@0
|
27 *
|
Chris@0
|
28 * Logic largely refactored from the ZF2 Zend\Http\PhpEnvironment\Request class.
|
Chris@0
|
29 *
|
Chris@0
|
30 * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
|
Chris@0
|
31 * @license http://framework.zend.com/license/new-bsd New BSD License
|
Chris@0
|
32 */
|
Chris@0
|
33 abstract class ServerRequestFactory
|
Chris@0
|
34 {
|
Chris@0
|
35 /**
|
Chris@0
|
36 * Function to use to get apache request headers; present only to simplify mocking.
|
Chris@0
|
37 *
|
Chris@0
|
38 * @var callable
|
Chris@0
|
39 */
|
Chris@0
|
40 private static $apacheRequestHeaders = 'apache_request_headers';
|
Chris@0
|
41
|
Chris@0
|
42 /**
|
Chris@0
|
43 * Create a request from the supplied superglobal values.
|
Chris@0
|
44 *
|
Chris@0
|
45 * If any argument is not supplied, the corresponding superglobal value will
|
Chris@0
|
46 * be used.
|
Chris@0
|
47 *
|
Chris@0
|
48 * The ServerRequest created is then passed to the fromServer() method in
|
Chris@0
|
49 * order to marshal the request URI and headers.
|
Chris@0
|
50 *
|
Chris@0
|
51 * @see fromServer()
|
Chris@0
|
52 * @param array $server $_SERVER superglobal
|
Chris@0
|
53 * @param array $query $_GET superglobal
|
Chris@0
|
54 * @param array $body $_POST superglobal
|
Chris@0
|
55 * @param array $cookies $_COOKIE superglobal
|
Chris@0
|
56 * @param array $files $_FILES superglobal
|
Chris@0
|
57 * @return ServerRequest
|
Chris@0
|
58 * @throws InvalidArgumentException for invalid file values
|
Chris@0
|
59 */
|
Chris@0
|
60 public static function fromGlobals(
|
Chris@0
|
61 array $server = null,
|
Chris@0
|
62 array $query = null,
|
Chris@0
|
63 array $body = null,
|
Chris@0
|
64 array $cookies = null,
|
Chris@0
|
65 array $files = null
|
Chris@0
|
66 ) {
|
Chris@16
|
67 $server = normalizeServer(
|
Chris@16
|
68 $server ?: $_SERVER,
|
Chris@16
|
69 is_callable(self::$apacheRequestHeaders) ? self::$apacheRequestHeaders : null
|
Chris@16
|
70 );
|
Chris@16
|
71 $files = normalizeUploadedFiles($files ?: $_FILES);
|
Chris@16
|
72 $headers = marshalHeadersFromSapi($server);
|
Chris@0
|
73
|
Chris@0
|
74 if (null === $cookies && array_key_exists('cookie', $headers)) {
|
Chris@16
|
75 $cookies = parseCookieHeader($headers['cookie']);
|
Chris@0
|
76 }
|
Chris@0
|
77
|
Chris@0
|
78 return new ServerRequest(
|
Chris@0
|
79 $server,
|
Chris@0
|
80 $files,
|
Chris@16
|
81 marshalUriFromSapi($server, $headers),
|
Chris@16
|
82 marshalMethodFromSapi($server),
|
Chris@0
|
83 'php://input',
|
Chris@0
|
84 $headers,
|
Chris@0
|
85 $cookies ?: $_COOKIE,
|
Chris@0
|
86 $query ?: $_GET,
|
Chris@0
|
87 $body ?: $_POST,
|
Chris@16
|
88 marshalProtocolVersionFromSapi($server)
|
Chris@0
|
89 );
|
Chris@0
|
90 }
|
Chris@0
|
91
|
Chris@0
|
92 /**
|
Chris@0
|
93 * Access a value in an array, returning a default value if not found
|
Chris@0
|
94 *
|
Chris@16
|
95 * @deprecated since 1.8.0; no longer used internally.
|
Chris@0
|
96 * @param string $key
|
Chris@0
|
97 * @param array $values
|
Chris@0
|
98 * @param mixed $default
|
Chris@0
|
99 * @return mixed
|
Chris@0
|
100 */
|
Chris@0
|
101 public static function get($key, array $values, $default = null)
|
Chris@0
|
102 {
|
Chris@0
|
103 if (array_key_exists($key, $values)) {
|
Chris@0
|
104 return $values[$key];
|
Chris@0
|
105 }
|
Chris@0
|
106
|
Chris@0
|
107 return $default;
|
Chris@0
|
108 }
|
Chris@0
|
109
|
Chris@0
|
110 /**
|
Chris@0
|
111 * Search for a header value.
|
Chris@0
|
112 *
|
Chris@0
|
113 * Does a case-insensitive search for a matching header.
|
Chris@0
|
114 *
|
Chris@0
|
115 * If found, it is returned as a string, using comma concatenation.
|
Chris@0
|
116 *
|
Chris@0
|
117 * If not, the $default is returned.
|
Chris@0
|
118 *
|
Chris@16
|
119 * @deprecated since 1.8.0; no longer used internally.
|
Chris@0
|
120 * @param string $header
|
Chris@0
|
121 * @param array $headers
|
Chris@0
|
122 * @param mixed $default
|
Chris@0
|
123 * @return string
|
Chris@0
|
124 */
|
Chris@0
|
125 public static function getHeader($header, array $headers, $default = null)
|
Chris@0
|
126 {
|
Chris@17
|
127 $header = strtolower($header);
|
Chris@0
|
128 $headers = array_change_key_case($headers, CASE_LOWER);
|
Chris@0
|
129 if (array_key_exists($header, $headers)) {
|
Chris@0
|
130 $value = is_array($headers[$header]) ? implode(', ', $headers[$header]) : $headers[$header];
|
Chris@0
|
131 return $value;
|
Chris@0
|
132 }
|
Chris@0
|
133
|
Chris@0
|
134 return $default;
|
Chris@0
|
135 }
|
Chris@0
|
136
|
Chris@0
|
137 /**
|
Chris@0
|
138 * Marshal the $_SERVER array
|
Chris@0
|
139 *
|
Chris@0
|
140 * Pre-processes and returns the $_SERVER superglobal.
|
Chris@0
|
141 *
|
Chris@16
|
142 * @deprected since 1.8.0; use Zend\Diactoros\normalizeServer() instead.
|
Chris@0
|
143 * @param array $server
|
Chris@0
|
144 * @return array
|
Chris@0
|
145 */
|
Chris@0
|
146 public static function normalizeServer(array $server)
|
Chris@0
|
147 {
|
Chris@16
|
148 return normalizeServer(
|
Chris@16
|
149 $server ?: $_SERVER,
|
Chris@16
|
150 is_callable(self::$apacheRequestHeaders) ? self::$apacheRequestHeaders : null
|
Chris@16
|
151 );
|
Chris@0
|
152 }
|
Chris@0
|
153
|
Chris@0
|
154 /**
|
Chris@0
|
155 * Normalize uploaded files
|
Chris@0
|
156 *
|
Chris@0
|
157 * Transforms each value into an UploadedFileInterface instance, and ensures
|
Chris@0
|
158 * that nested arrays are normalized.
|
Chris@0
|
159 *
|
Chris@16
|
160 * @deprecated since 1.8.0; use \Zend\Diactoros\normalizeUploadedFiles instead.
|
Chris@0
|
161 * @param array $files
|
Chris@0
|
162 * @return array
|
Chris@0
|
163 * @throws InvalidArgumentException for unrecognized values
|
Chris@0
|
164 */
|
Chris@0
|
165 public static function normalizeFiles(array $files)
|
Chris@0
|
166 {
|
Chris@16
|
167 return normalizeUploadedFiles($files);
|
Chris@0
|
168 }
|
Chris@0
|
169
|
Chris@0
|
170 /**
|
Chris@0
|
171 * Marshal headers from $_SERVER
|
Chris@0
|
172 *
|
Chris@16
|
173 * @deprecated since 1.8.0; use Zend\Diactoros\marshalHeadersFromSapi().
|
Chris@0
|
174 * @param array $server
|
Chris@0
|
175 * @return array
|
Chris@0
|
176 */
|
Chris@0
|
177 public static function marshalHeaders(array $server)
|
Chris@0
|
178 {
|
Chris@16
|
179 return marshalHeadersFromSapi($server);
|
Chris@0
|
180 }
|
Chris@0
|
181
|
Chris@0
|
182 /**
|
Chris@0
|
183 * Marshal the URI from the $_SERVER array and headers
|
Chris@0
|
184 *
|
Chris@16
|
185 * @deprecated since 1.8.0; use Zend\Diactoros\marshalUriFromSapi() instead.
|
Chris@0
|
186 * @param array $server
|
Chris@0
|
187 * @param array $headers
|
Chris@0
|
188 * @return Uri
|
Chris@0
|
189 */
|
Chris@0
|
190 public static function marshalUriFromServer(array $server, array $headers)
|
Chris@0
|
191 {
|
Chris@16
|
192 return marshalUriFromSapi($server, $headers);
|
Chris@0
|
193 }
|
Chris@0
|
194
|
Chris@0
|
195 /**
|
Chris@0
|
196 * Marshal the host and port from HTTP headers and/or the PHP environment
|
Chris@0
|
197 *
|
Chris@16
|
198 * @deprecated since 1.8.0; use Zend\Diactoros\marshalUriFromSapi() instead,
|
Chris@16
|
199 * and pull the host and port from the Uri instance that function
|
Chris@16
|
200 * returns.
|
Chris@0
|
201 * @param stdClass $accumulator
|
Chris@0
|
202 * @param array $server
|
Chris@0
|
203 * @param array $headers
|
Chris@0
|
204 */
|
Chris@0
|
205 public static function marshalHostAndPortFromHeaders(stdClass $accumulator, array $server, array $headers)
|
Chris@0
|
206 {
|
Chris@16
|
207 $uri = marshalUriFromSapi($server, $headers);
|
Chris@16
|
208 $accumulator->host = $uri->getHost();
|
Chris@16
|
209 $accumulator->port = $uri->getPort();
|
Chris@0
|
210 }
|
Chris@0
|
211
|
Chris@0
|
212 /**
|
Chris@0
|
213 * Detect the base URI for the request
|
Chris@0
|
214 *
|
Chris@0
|
215 * Looks at a variety of criteria in order to attempt to autodetect a base
|
Chris@0
|
216 * URI, including rewrite URIs, proxy URIs, etc.
|
Chris@0
|
217 *
|
Chris@16
|
218 * @deprecated since 1.8.0; use Zend\Diactoros\marshalUriFromSapi() instead,
|
Chris@16
|
219 * and pull the path from the Uri instance that function returns.
|
Chris@0
|
220 * @param array $server
|
Chris@0
|
221 * @return string
|
Chris@0
|
222 */
|
Chris@0
|
223 public static function marshalRequestUri(array $server)
|
Chris@0
|
224 {
|
Chris@16
|
225 $uri = marshalUriFromSapi($server, []);
|
Chris@16
|
226 return $uri->getPath();
|
Chris@0
|
227 }
|
Chris@0
|
228
|
Chris@0
|
229 /**
|
Chris@0
|
230 * Strip the query string from a path
|
Chris@0
|
231 *
|
Chris@16
|
232 * @deprecated since 1.8.0; no longer used internally.
|
Chris@0
|
233 * @param mixed $path
|
Chris@0
|
234 * @return string
|
Chris@0
|
235 */
|
Chris@0
|
236 public static function stripQueryString($path)
|
Chris@0
|
237 {
|
Chris@16
|
238 return explode('?', $path, 2)[0];
|
Chris@0
|
239 }
|
Chris@0
|
240 }
|