PluginProbe
Yoast SEO – Advanced SEO with real-time guidance and built-in AI / 28.0
Yoast SEO – Advanced SEO with real-time guidance and built-in AI v28.0
28.5 28.4 28.3 28.2 28.1 28.0 27.9 27.8 27.7 27.6 27.5 trunk 18.0 18.1 18.2 18.3 18.4 18.4.1 18.5 18.5.1 18.6 18.7 18.8 18.9 19.0 All 129 releases
wordpress-seo / vendor_prefixed / guzzlehttp / psr7 / src / Header.php

Header.php in Yoast SEO – Advanced SEO with real-time guidance and built-in AI 28.0, at vendor_prefixed/guzzlehttp/psr7/src/Header.php

151 lines 4.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 declare (strict_types=1);
4 namespace YoastSEO_Vendor\GuzzleHttp\Psr7;
5
6 final class Header
7 {
8 /**
9 * Parse an array of header values containing ";" separated data into an
10 * array of associative arrays representing the header key value pair data
11 * of the header. When a parameter does not contain a value, but just
12 * contains a key, this function will inject a key with a '' string value.
13 *
14 * @param string|array $header Header to parse into components.
15 */
16 public static function parse($header) : array
17 {
18 static $trimmed = "\"' \n\t\r";
19 $params = $matches = [];
20 foreach ((array) $header as $value) {
21 foreach (self::splitList($value) as $val) {
22 $part = [];
23 foreach (self::splitParameters($val) as $kvp) {
24 if (\preg_match_all('/<[^>]+>|[^=]+/', $kvp, $matches)) {
25 $m = $matches[0];
26 if (isset($m[1])) {
27 $part[\trim($m[0], $trimmed)] = \trim($m[1], $trimmed);
28 } else {
29 $part[] = \trim($m[0], $trimmed);
30 }
31 }
32 }
33 if ($part) {
34 $params[] = $part;
35 }
36 }
37 }
38 return $params;
39 }
40 /**
41 * Split a header value into semicolon-separated parameters.
42 *
43 * @return string[]
44 */
45 private static function splitParameters(string $value) : array
46 {
47 $values = [];
48 $start = 0;
49 $isQuoted = \false;
50 $isEscaped = \false;
51 for ($i = 0, $max = \strlen($value); $i < $max; ++$i) {
52 $char = $value[$i];
53 if ($isEscaped) {
54 $isEscaped = \false;
55 continue;
56 }
57 if ($isQuoted && $char === '\\') {
58 $isEscaped = \true;
59 continue;
60 }
61 if ($char === '"') {
62 $isQuoted = !$isQuoted;
63 continue;
64 }
65 if (!$isQuoted && $char === ';') {
66 $values[] = \substr($value, $start, $i - $start);
67 $start = $i + 1;
68 }
69 }
70 $values[] = \substr($value, $start);
71 return $values;
72 }
73 /**
74 * Converts an array of header values that may contain comma separated
75 * headers into an array of headers with no comma separated values.
76 *
77 * @param string|array $header Header to normalize.
78 *
79 * @deprecated Use self::splitList() instead.
80 */
81 public static function normalize($header) : array
82 {
83 $result = [];
84 foreach ((array) $header as $value) {
85 foreach (self::splitList($value) as $parsed) {
86 $result[] = $parsed;
87 }
88 }
89 return $result;
90 }
91 /**
92 * Splits a HTTP header defined to contain a comma-separated list into
93 * each individual value. Empty values will be removed.
94 *
95 * Example headers include 'accept', 'cache-control' and 'if-none-match'.
96 *
97 * This method must not be used to parse headers that are not defined as
98 * a list, such as 'user-agent' or 'set-cookie'.
99 *
100 * @param string|string[] $values Header value as returned by MessageInterface::getHeader()
101 *
102 * @return string[]
103 */
104 public static function splitList($values) : array
105 {
106 if (!\is_array($values)) {
107 $values = [$values];
108 }
109 $result = [];
110 foreach ($values as $value) {
111 if (!\is_string($value)) {
112 throw new \TypeError('$header must either be a string or an array containing strings.');
113 }
114 $v = '';
115 $isQuoted = \false;
116 $isEscaped = \false;
117 for ($i = 0, $max = \strlen($value); $i < $max; ++$i) {
118 if ($isEscaped) {
119 $v .= $value[$i];
120 $isEscaped = \false;
121 continue;
122 }
123 if (!$isQuoted && $value[$i] === ',') {
124 $v = \trim($v);
125 if ($v !== '') {
126 $result[] = $v;
127 }
128 $v = '';
129 continue;
130 }
131 if ($isQuoted && $value[$i] === '\\') {
132 $isEscaped = \true;
133 $v .= $value[$i];
134 continue;
135 }
136 if ($value[$i] === '"') {
137 $isQuoted = !$isQuoted;
138 $v .= $value[$i];
139 continue;
140 }
141 $v .= $value[$i];
142 }
143 $v = \trim($v);
144 if ($v !== '') {
145 $result[] = $v;
146 }
147 }
148 return $result;
149 }
150 }
151