|
1 <?php |
|
2 /** |
|
3 * Case-insensitive dictionary, suitable for HTTP headers |
|
4 * |
|
5 * @package Requests |
|
6 */ |
|
7 |
|
8 namespace WpOrg\Requests\Response; |
|
9 |
|
10 use WpOrg\Requests\Exception; |
|
11 use WpOrg\Requests\Exception\InvalidArgument; |
|
12 use WpOrg\Requests\Utility\CaseInsensitiveDictionary; |
|
13 use WpOrg\Requests\Utility\FilteredIterator; |
|
14 |
|
15 /** |
|
16 * Case-insensitive dictionary, suitable for HTTP headers |
|
17 * |
|
18 * @package Requests |
|
19 */ |
|
20 class Headers extends CaseInsensitiveDictionary { |
|
21 /** |
|
22 * Get the given header |
|
23 * |
|
24 * Unlike {@see \WpOrg\Requests\Response\Headers::getValues()}, this returns a string. If there are |
|
25 * multiple values, it concatenates them with a comma as per RFC2616. |
|
26 * |
|
27 * Avoid using this where commas may be used unquoted in values, such as |
|
28 * Set-Cookie headers. |
|
29 * |
|
30 * @param string $offset Name of the header to retrieve. |
|
31 * @return string|null Header value |
|
32 */ |
|
33 public function offsetGet($offset) { |
|
34 if (is_string($offset)) { |
|
35 $offset = strtolower($offset); |
|
36 } |
|
37 |
|
38 if (!isset($this->data[$offset])) { |
|
39 return null; |
|
40 } |
|
41 |
|
42 return $this->flatten($this->data[$offset]); |
|
43 } |
|
44 |
|
45 /** |
|
46 * Set the given item |
|
47 * |
|
48 * @param string $offset Item name |
|
49 * @param string $value Item value |
|
50 * |
|
51 * @throws \WpOrg\Requests\Exception On attempting to use dictionary as list (`invalidset`) |
|
52 */ |
|
53 public function offsetSet($offset, $value) { |
|
54 if ($offset === null) { |
|
55 throw new Exception('Object is a dictionary, not a list', 'invalidset'); |
|
56 } |
|
57 |
|
58 if (is_string($offset)) { |
|
59 $offset = strtolower($offset); |
|
60 } |
|
61 |
|
62 if (!isset($this->data[$offset])) { |
|
63 $this->data[$offset] = []; |
|
64 } |
|
65 |
|
66 $this->data[$offset][] = $value; |
|
67 } |
|
68 |
|
69 /** |
|
70 * Get all values for a given header |
|
71 * |
|
72 * @param string $offset Name of the header to retrieve. |
|
73 * @return array|null Header values |
|
74 * |
|
75 * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed argument is not valid as an array key. |
|
76 */ |
|
77 public function getValues($offset) { |
|
78 if (!is_string($offset) && !is_int($offset)) { |
|
79 throw InvalidArgument::create(1, '$offset', 'string|int', gettype($offset)); |
|
80 } |
|
81 |
|
82 if (is_string($offset)) { |
|
83 $offset = strtolower($offset); |
|
84 } |
|
85 |
|
86 if (!isset($this->data[$offset])) { |
|
87 return null; |
|
88 } |
|
89 |
|
90 return $this->data[$offset]; |
|
91 } |
|
92 |
|
93 /** |
|
94 * Flattens a value into a string |
|
95 * |
|
96 * Converts an array into a string by imploding values with a comma, as per |
|
97 * RFC2616's rules for folding headers. |
|
98 * |
|
99 * @param string|array $value Value to flatten |
|
100 * @return string Flattened value |
|
101 * |
|
102 * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed argument is not a string or an array. |
|
103 */ |
|
104 public function flatten($value) { |
|
105 if (is_string($value)) { |
|
106 return $value; |
|
107 } |
|
108 |
|
109 if (is_array($value)) { |
|
110 return implode(',', $value); |
|
111 } |
|
112 |
|
113 throw InvalidArgument::create(1, '$value', 'string|array', gettype($value)); |
|
114 } |
|
115 |
|
116 /** |
|
117 * Get an iterator for the data |
|
118 * |
|
119 * Converts the internally stored values to a comma-separated string if there is more |
|
120 * than one value for a key. |
|
121 * |
|
122 * @return \ArrayIterator |
|
123 */ |
|
124 public function getIterator() { |
|
125 return new FilteredIterator($this->data, [$this, 'flatten']); |
|
126 } |
|
127 } |