1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
/* |
4
|
|
|
* This file is part of the ICanBoogie package. |
5
|
|
|
* |
6
|
|
|
* (c) Olivier Laviale <[email protected]> |
7
|
|
|
* |
8
|
|
|
* For the full copyright and license information, please view the LICENSE |
9
|
|
|
* file that was distributed with this source code. |
10
|
|
|
*/ |
11
|
|
|
|
12
|
|
|
namespace ICanBoogie\HTTP; |
13
|
|
|
|
14
|
|
|
/** |
15
|
|
|
* Maps options to the environment. |
16
|
|
|
*/ |
17
|
|
|
class RequestOptionsMapper implements RequestOptions |
18
|
|
|
{ |
19
|
|
|
/** |
20
|
|
|
* Maps options to environment. |
21
|
|
|
* |
22
|
|
|
* The options mapped to the environment are removed from the `$options` array. |
23
|
|
|
* |
24
|
|
|
* @param array $options Reference to the options. |
25
|
|
|
* @param array $env Reference to the environment. |
26
|
|
|
* |
27
|
|
|
* @throws \InvalidArgumentException on invalid option. |
28
|
|
|
*/ |
29
|
|
|
public function map(array &$options, array &$env) |
30
|
|
|
{ |
31
|
|
|
$mappers = $this->get_mappers(); |
32
|
|
|
|
33
|
|
|
foreach ($options as $option => &$value) |
34
|
|
|
{ |
35
|
|
|
if (empty($mappers[$option])) |
36
|
|
|
{ |
37
|
|
|
throw new \InvalidArgumentException("Option not supported: `$option`."); |
38
|
|
|
} |
39
|
|
|
|
40
|
|
|
$value = $mappers[$option]($value, $env); |
41
|
|
|
|
42
|
|
|
if ($value === null) |
43
|
|
|
{ |
44
|
|
|
unset($options[$option]); |
45
|
|
|
} |
46
|
|
|
} |
47
|
|
|
} |
48
|
|
|
|
49
|
|
|
/** |
50
|
|
|
* Returns request properties mappers. |
51
|
|
|
* |
52
|
|
|
* @return \Closure[] |
53
|
|
|
*/ |
54
|
|
|
protected function get_mappers() |
55
|
|
|
{ |
56
|
|
|
return [ |
57
|
|
|
|
58
|
|
|
self::OPTION_PATH_PARAMS => function($value) { return $value; }, |
59
|
|
|
self::OPTION_QUERY_PARAMS => function($value) { return $value; }, |
60
|
|
|
self::OPTION_REQUEST_PARAMS => function($value) { return $value; }, |
61
|
|
|
self::OPTION_COOKIE => function($value) { return $value; }, |
62
|
|
|
self::OPTION_FILES => function($value) { return $value; }, |
63
|
|
|
self::OPTION_HEADERS => function($value) { return ($value instanceof Headers) ? $value : new Headers($value); }, |
64
|
|
|
|
65
|
|
|
self::OPTION_CACHE_CONTROL => function($value, array &$env) { $env['HTTP_CACHE_CONTROL'] = $value; }, |
66
|
|
|
self::OPTION_CONTENT_LENGTH => function($value, array &$env) { $env['CONTENT_LENGTH'] = $value; }, |
67
|
|
|
self::OPTION_IP => function($value, array &$env) { if ($value) $env['REMOTE_ADDR'] = $value; }, |
68
|
|
|
self::OPTION_IS_LOCAL => function($value, array &$env) { if ($value) $env['REMOTE_ADDR'] = '::1'; }, |
69
|
|
|
self::OPTION_IS_DELETE => function($value, array &$env) { if ($value) $env['REQUEST_METHOD'] = Request::METHOD_DELETE; }, |
70
|
|
|
self::OPTION_IS_CONNECT => function($value, array &$env) { if ($value) $env['REQUEST_METHOD'] = Request::METHOD_CONNECT; }, |
71
|
|
|
self::OPTION_IS_GET => function($value, array &$env) { if ($value) $env['REQUEST_METHOD'] = Request::METHOD_GET; }, |
72
|
|
|
self::OPTION_IS_HEAD => function($value, array &$env) { if ($value) $env['REQUEST_METHOD'] = Request::METHOD_HEAD; }, |
73
|
|
|
self::OPTION_IS_OPTIONS => function($value, array &$env) { if ($value) $env['REQUEST_METHOD'] = Request::METHOD_OPTIONS; }, |
74
|
|
|
self::OPTION_IS_PATCH => function($value, array &$env) { if ($value) $env['REQUEST_METHOD'] = Request::METHOD_PATCH; }, |
75
|
|
|
self::OPTION_IS_POST => function($value, array &$env) { if ($value) $env['REQUEST_METHOD'] = Request::METHOD_POST; }, |
76
|
|
|
self::OPTION_IS_PUT => function($value, array &$env) { if ($value) $env['REQUEST_METHOD'] = Request::METHOD_PUT; }, |
77
|
|
|
self::OPTION_IS_TRACE => function($value, array &$env) { if ($value) $env['REQUEST_METHOD'] = Request::METHOD_TRACE; }, |
78
|
|
|
self::OPTION_IS_XHR => function($value, array &$env) { if ($value) $env['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest'; else unset($env['HTTP_X_REQUESTED_WITH']); }, |
79
|
|
|
self::OPTION_METHOD => function($value, array &$env) { if ($value) $env['REQUEST_METHOD'] = $value; }, |
80
|
|
|
self::OPTION_PATH => function($value, array &$env) { $env['REQUEST_URI'] = $value; }, // TODO-20130521: handle query string |
81
|
|
|
self::OPTION_REFERER => function($value, array &$env) { $env['HTTP_REFERER'] = $value; }, |
82
|
|
|
self::OPTION_URI => function($value, array &$env) { $env['REQUEST_URI'] = $value; $qs = strpos($value, '?'); $env['QUERY_STRING'] = $qs === false ? '' : substr($value, $qs + 1); }, |
83
|
|
|
self::OPTION_USER_AGENT => function($value, array &$env) { $env['HTTP_USER_AGENT'] = $value; } |
84
|
|
|
|
85
|
|
|
]; |
86
|
|
|
} |
87
|
|
|
} |
88
|
|
|
|