Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
| Total | |
100.00% |
15 / 15 |
|
100.00% |
4 / 4 |
CRAP | |
100.00% |
1 / 1 |
| Header | |
100.00% |
15 / 15 |
|
100.00% |
4 / 4 |
4 | |
100.00% |
1 / 1 |
| getName | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
| setName | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
| getMultilines | |
100.00% |
12 / 12 |
|
100.00% |
1 / 1 |
1 | |||
| isMultiline | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
| 1 | <?php declare(strict_types=1); |
| 2 | /* |
| 3 | * This file is part of Aplus Framework HTTP Library. |
| 4 | * |
| 5 | * (c) Natan Felles <natanfelles@gmail.com> |
| 6 | * |
| 7 | * For the full copyright and license information, please view the LICENSE |
| 8 | * file that was distributed with this source code. |
| 9 | */ |
| 10 | namespace Framework\HTTP; |
| 11 | |
| 12 | /** |
| 13 | * Class Header. |
| 14 | * |
| 15 | * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers |
| 16 | * |
| 17 | * @package http |
| 18 | */ |
| 19 | class Header |
| 20 | { |
| 21 | // ------------------------------------------------------------------------- |
| 22 | // General headers (Request and Response) |
| 23 | // ------------------------------------------------------------------------- |
| 24 | /** |
| 25 | * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control |
| 26 | * |
| 27 | * @var string |
| 28 | */ |
| 29 | public const CACHE_CONTROL = 'Cache-Control'; |
| 30 | /** |
| 31 | * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Connection |
| 32 | * |
| 33 | * @var string |
| 34 | */ |
| 35 | public const CONNECTION = 'Connection'; |
| 36 | /** |
| 37 | * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition |
| 38 | * |
| 39 | * @var string |
| 40 | */ |
| 41 | public const CONTENT_DISPOSITION = 'Content-Disposition'; |
| 42 | /** |
| 43 | * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Date |
| 44 | * |
| 45 | * @var string |
| 46 | */ |
| 47 | public const DATE = 'Date'; |
| 48 | /** |
| 49 | * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Keep-Alive |
| 50 | * |
| 51 | * @var string |
| 52 | */ |
| 53 | public const KEEP_ALIVE = 'Keep-Alive'; |
| 54 | /** |
| 55 | * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Pragma |
| 56 | * |
| 57 | * @var string |
| 58 | */ |
| 59 | public const PRAGMA = 'Pragma'; |
| 60 | /** |
| 61 | * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Via |
| 62 | * |
| 63 | * @var string |
| 64 | */ |
| 65 | public const VIA = 'Via'; |
| 66 | /** |
| 67 | * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Warning |
| 68 | * |
| 69 | * @var string |
| 70 | */ |
| 71 | public const WARNING = 'Warning'; |
| 72 | // ------------------------------------------------------------------------- |
| 73 | // Representation headers (Request and Response) |
| 74 | // ------------------------------------------------------------------------- |
| 75 | /** |
| 76 | * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Encoding |
| 77 | * |
| 78 | * @var string |
| 79 | */ |
| 80 | public const CONTENT_ENCODING = 'Content-Encoding'; |
| 81 | /** |
| 82 | * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Language |
| 83 | * |
| 84 | * @var string |
| 85 | */ |
| 86 | public const CONTENT_LANGUAGE = 'Content-Language'; |
| 87 | /** |
| 88 | * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Location |
| 89 | * |
| 90 | * @var string |
| 91 | */ |
| 92 | public const CONTENT_LOCATION = 'Content-Location'; |
| 93 | /** |
| 94 | * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type |
| 95 | * |
| 96 | * @var string |
| 97 | */ |
| 98 | public const CONTENT_TYPE = 'Content-Type'; |
| 99 | // ------------------------------------------------------------------------- |
| 100 | // Payload headers (Request and Response) |
| 101 | // ------------------------------------------------------------------------- |
| 102 | /** |
| 103 | * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Length |
| 104 | * |
| 105 | * @var string |
| 106 | */ |
| 107 | public const CONTENT_LENGTH = 'Content-Length'; |
| 108 | /** |
| 109 | * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Range |
| 110 | * |
| 111 | * @var string |
| 112 | */ |
| 113 | public const CONTENT_RANGE = 'Content-Range'; |
| 114 | /** |
| 115 | * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Link |
| 116 | * |
| 117 | * @var string |
| 118 | */ |
| 119 | public const LINK = 'Link'; |
| 120 | /** |
| 121 | * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Trailer |
| 122 | * |
| 123 | * @var string |
| 124 | */ |
| 125 | public const TRAILER = 'Trailer'; |
| 126 | /** |
| 127 | * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Transfer-Encoding |
| 128 | * |
| 129 | * @var string |
| 130 | */ |
| 131 | public const TRANSFER_ENCODING = 'Transfer-Encoding'; |
| 132 | /** |
| 133 | * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Upgrade |
| 134 | * |
| 135 | * @var string |
| 136 | */ |
| 137 | public const UPGRADE = 'Upgrade'; |
| 138 | // ------------------------------------------------------------------------- |
| 139 | // Custom |
| 140 | // ------------------------------------------------------------------------- |
| 141 | /** |
| 142 | * @see https://riptutorial.com/http-headers/topic/10581/x-request-id |
| 143 | * |
| 144 | * @var string |
| 145 | */ |
| 146 | public const X_REQUEST_ID = 'X-Request-ID'; |
| 147 | /** |
| 148 | * Header names. |
| 149 | * |
| 150 | * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers |
| 151 | * |
| 152 | * @var array<string,string> |
| 153 | */ |
| 154 | protected static array $headers = [ |
| 155 | // --------------------------------------------------------------------- |
| 156 | // General headers (Request and Response) |
| 157 | // --------------------------------------------------------------------- |
| 158 | 'cache-control' => 'Cache-Control', |
| 159 | 'connection' => 'Connection', |
| 160 | 'content-disposition' => 'Content-Disposition', |
| 161 | 'date' => 'Date', |
| 162 | 'keep-alive' => 'Keep-Alive', |
| 163 | 'link' => 'Link', |
| 164 | 'pragma' => 'Pragma', |
| 165 | 'via' => 'Via', |
| 166 | 'warning' => 'Warning', |
| 167 | // --------------------------------------------------------------------- |
| 168 | // Representation headers (Request and Response) |
| 169 | // --------------------------------------------------------------------- |
| 170 | 'content-encoding' => 'Content-Encoding', |
| 171 | 'content-language' => 'Content-Language', |
| 172 | 'content-location' => 'Content-Location', |
| 173 | 'content-type' => 'Content-Type', |
| 174 | // --------------------------------------------------------------------- |
| 175 | // Payload headers (Request and Response) |
| 176 | // --------------------------------------------------------------------- |
| 177 | 'content-length' => 'Content-Length', |
| 178 | 'content-range' => 'Content-Range', |
| 179 | 'trailer' => 'Trailer', |
| 180 | 'transfer-encoding' => 'Transfer-Encoding', |
| 181 | // --------------------------------------------------------------------- |
| 182 | // Request headers |
| 183 | // --------------------------------------------------------------------- |
| 184 | 'accept' => 'Accept', |
| 185 | 'accept-charset' => 'Accept-Charset', |
| 186 | 'accept-encoding' => 'Accept-Encoding', |
| 187 | 'accept-language' => 'Accept-Language', |
| 188 | 'access-control-request-headers' => 'Access-Control-Request-Headers', |
| 189 | 'access-control-request-method' => 'Access-Control-Request-Method', |
| 190 | 'authorization' => 'Authorization', |
| 191 | 'cookie' => 'Cookie', |
| 192 | 'dnt' => 'DNT', |
| 193 | 'expect' => 'Expect', |
| 194 | 'forwarded' => 'Forwarded', |
| 195 | 'from' => 'From', |
| 196 | 'host' => 'Host', |
| 197 | 'if-match' => 'If-Match', |
| 198 | 'if-modified-since' => 'If-Modified-Since', |
| 199 | 'if-none-match' => 'If-None-Match', |
| 200 | 'if-range' => 'If-Range', |
| 201 | 'if-unmodified-since' => 'If-Unmodified-Since', |
| 202 | 'origin' => 'Origin', |
| 203 | 'proxy-authorization' => 'Proxy-Authorization', |
| 204 | 'range' => 'Range', |
| 205 | 'referer' => 'Referer', |
| 206 | 'sec-fetch-dest' => 'Sec-Fetch-Dest', |
| 207 | 'sec-fetch-mode' => 'Sec-Fetch-Mode', |
| 208 | 'sec-fetch-site' => 'Sec-Fetch-Site', |
| 209 | 'sec-fetch-user' => 'Sec-Fetch-User', |
| 210 | 'te' => 'TE', |
| 211 | 'upgrade-insecure-requests' => 'Upgrade-Insecure-Requests', |
| 212 | 'user-agent' => 'User-Agent', |
| 213 | 'x-forwarded-for' => 'X-Forwarded-For', |
| 214 | 'x-forwarded-host' => 'X-Forwarded-Host', |
| 215 | 'x-forwarded-proto' => 'X-Forwarded-Proto', |
| 216 | 'x-real-ip' => 'X-Real-IP', |
| 217 | 'x-requested-with' => 'X-Requested-With', |
| 218 | // --------------------------------------------------------------------- |
| 219 | // Response headers |
| 220 | // --------------------------------------------------------------------- |
| 221 | 'accept-ranges' => 'Accept-Ranges', |
| 222 | 'access-control-allow-credentials' => 'Access-Control-Allow-Credentials', |
| 223 | 'access-control-allow-headers' => 'Access-Control-Allow-Headers', |
| 224 | 'access-control-allow-methods' => 'Access-Control-Allow-Methods', |
| 225 | 'access-control-allow-origin' => 'Access-Control-Allow-Origin', |
| 226 | 'access-control-expose-headers' => 'Access-Control-Expose-Headers', |
| 227 | 'access-control-max-age' => 'Access-Control-Max-Age', |
| 228 | 'age' => 'Age', |
| 229 | 'allow' => 'Allow', |
| 230 | 'clear-site-data' => 'Clear-Site-Data', |
| 231 | 'content-security-policy' => 'Content-Security-Policy', |
| 232 | 'content-security-policy-report-only' => 'Content-Security-Policy-Report-Only', |
| 233 | 'etag' => 'ETag', |
| 234 | 'expect-ct' => 'Expect-CT', |
| 235 | 'expires' => 'Expires', |
| 236 | 'feature-policy' => 'Feature-Policy', |
| 237 | 'last-modified' => 'Last-Modified', |
| 238 | 'location' => 'Location', |
| 239 | 'proxy-authenticate' => 'Proxy-Authenticate', |
| 240 | 'public-key-pins' => 'Public-Key-Pins', |
| 241 | 'public-key-pins-report-only' => 'Public-Key-Pins-Report-Only', |
| 242 | 'referrer-policy' => 'Referrer-Policy', |
| 243 | 'retry-after' => 'Retry-After', |
| 244 | 'server' => 'Server', |
| 245 | 'set-cookie' => 'Set-Cookie', |
| 246 | 'sourcemap' => 'SourceMap', |
| 247 | 'strict-transport-security' => 'Strict-Transport-Security', |
| 248 | 'timing-allow-origin' => 'Timing-Allow-Origin', |
| 249 | 'tk' => 'Tk', |
| 250 | 'vary' => 'Vary', |
| 251 | 'www-authenticate' => 'WWW-Authenticate', |
| 252 | 'x-content-type-options' => 'X-Content-Type-Options', |
| 253 | 'x-dns-prefetch-control' => 'X-DNS-Prefetch-Control', |
| 254 | 'x-frame-options' => 'X-Frame-Options', |
| 255 | 'x-xss-protection' => 'X-XSS-Protection', |
| 256 | // --------------------------------------------------------------------- |
| 257 | // Custom (Response) |
| 258 | // --------------------------------------------------------------------- |
| 259 | 'x-request-id' => 'X-Request-ID', |
| 260 | 'x-powered-by' => 'X-Powered-By', |
| 261 | // --------------------------------------------------------------------- |
| 262 | // WebSocket |
| 263 | // --------------------------------------------------------------------- |
| 264 | 'sec-websocket-extensions' => 'Sec-WebSocket-Extensions', |
| 265 | 'sec-websocket-key' => 'Sec-WebSocket-Key', |
| 266 | 'sec-websocket-protocol' => 'Sec-WebSocket-Protocol', |
| 267 | 'sec-websocket-version' => 'Sec-WebSocket-Version', |
| 268 | ]; |
| 269 | |
| 270 | public static function getName(string $name) : string |
| 271 | { |
| 272 | return static::$headers[\strtolower($name)] ?? $name; |
| 273 | } |
| 274 | |
| 275 | public static function setName(string $name) : void |
| 276 | { |
| 277 | static::$headers[\strtolower($name)] = $name; |
| 278 | } |
| 279 | |
| 280 | /** |
| 281 | * @return array<string> |
| 282 | */ |
| 283 | public static function getMultilines() : array |
| 284 | { |
| 285 | return [ |
| 286 | 'date', |
| 287 | 'expires', |
| 288 | 'if-modified-since', |
| 289 | 'if-range', |
| 290 | 'if-unmodified-since', |
| 291 | 'last-modified', |
| 292 | 'proxy-authenticate', |
| 293 | 'retry-after', |
| 294 | 'set-cookie', |
| 295 | 'www-authenticate', |
| 296 | ]; |
| 297 | } |
| 298 | |
| 299 | public static function isMultiline(string $name) : bool |
| 300 | { |
| 301 | return \in_array(\strtolower($name), static::getMultilines(), true); |
| 302 | } |
| 303 | } |