wp/wp-includes/Requests/src/Response/Headers.php
changeset 21 48c4eec2b7e6
equal deleted inserted replaced
20:7b1b88e27a20 21:48c4eec2b7e6
       
     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 }