| /** | |
| * Case-insensitive dictionary, suitable for HTTP headers | |
| * | |
| * @package Requests | |
| */ | |
| namespace WpOrg\Requests\Response; | |
| use WpOrg\Requests\Exception; | |
| use WpOrg\Requests\Exception\InvalidArgument; | |
| use WpOrg\Requests\Utility\CaseInsensitiveDictionary; | |
| use WpOrg\Requests\Utility\FilteredIterator; | |
| /** | |
| * Case-insensitive dictionary, suitable for HTTP headers | |
| * | |
| * @package Requests | |
| */ | |
| class Headers extends CaseInsensitiveDictionary { | |
| /** | |
| * Get the given header | |
| * | |
| * Unlike {@see \WpOrg\Requests\Response\Headers::getValues()}, this returns a string. If there are | |
| * multiple values, it concatenates them with a comma as per RFC2616. | |
| * | |
| * Avoid using this where commas may be used unquoted in values, such as | |
| * Set-Cookie headers. | |
| * | |
| * @param string $offset Name of the header to retrieve. | |
| * @return string|null Header value | |
| */ | |
| public function offsetGet($offset) { | |
| if (is_string($offset)) { | |
| $offset = strtolower($offset); | |
| } | |
| if (!isset($this->data[$offset])) { | |
| return null; | |
| } | |
| return $this->flatten($this->data[$offset]); | |
| } | |
| /** | |
| * Set the given item | |
| * | |
| * @param string $offset Item name | |
| * @param string $value Item value | |
| * | |
| * @throws \WpOrg\Requests\Exception On attempting to use dictionary as list (`invalidset`) | |
| */ | |
| public function offsetSet($offset, $value) { | |
| if ($offset === null) { | |
| throw new Exception('Object is a dictionary, not a list', 'invalidset'); | |
| } | |
| if (is_string($offset)) { | |
| $offset = strtolower($offset); | |
| } | |
| if (!isset($this->data[$offset])) { | |
| $this->data[$offset] = []; | |
| } | |
| $this->data[$offset][] = $value; | |
| } | |
| /** | |
| * Get all values for a given header | |
| * | |
| * @param string $offset Name of the header to retrieve. | |
| * @return array|null Header values | |
| * | |
| * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed argument is not valid as an array key. | |
| */ | |
| public function getValues($offset) { | |
| if (!is_string($offset) && !is_int($offset)) { | |
| throw InvalidArgument::create(1, '$offset', 'string|int', gettype($offset)); | |
| } | |
| if (is_string($offset)) { | |
| $offset = strtolower($offset); | |
| } | |
| if (!isset($this->data[$offset])) { | |
| return null; | |
| } | |
| return $this->data[$offset]; | |
| } | |
| /** | |
| * Flattens a value into a string | |
| * | |
| * Converts an array into a string by imploding values with a comma, as per | |
| * RFC2616's rules for folding headers. | |
| * | |
| * @param string|array $value Value to flatten | |
| * @return string Flattened value | |
| * | |
| * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed argument is not a string or an array. | |
| */ | |
| public function flatten($value) { | |
| if (is_string($value)) { | |
| return $value; | |
| } | |
| if (is_array($value)) { | |
| return implode(',', $value); | |
| } | |
| throw InvalidArgument::create(1, '$value', 'string|array', gettype($value)); | |
| } | |
| /** | |
| * Get an iterator for the data | |
| * | |
| * Converts the internally stored values to a comma-separated string if there is more | |
| * than one value for a key. | |
| * | |
| * @return \ArrayIterator | |
| */ | |
| public function getIterator() { | |
| return new FilteredIterator($this->data, [$this, 'flatten']); | |
| } | |
| } | |