1<?php
2
3namespace GuzzleHttp\Psr7;
4
5final class Header
6{
7    /**
8     * Parse an array of header values containing ";" separated data into an
9     * array of associative arrays representing the header key value pair data
10     * of the header. When a parameter does not contain a value, but just
11     * contains a key, this function will inject a key with a '' string value.
12     *
13     * @param string|array $header Header to parse into components.
14     *
15     * @return array Returns the parsed header values.
16     */
17    public static function parse($header)
18    {
19        static $trimmed = "\"'  \n\t\r";
20        $params = $matches = [];
21
22        foreach (self::normalize($header) as $val) {
23            $part = [];
24            foreach (preg_split('/;(?=([^"]*"[^"]*")*[^"]*$)/', $val) as $kvp) {
25                if (preg_match_all('/<[^>]+>|[^=]+/', $kvp, $matches)) {
26                    $m = $matches[0];
27                    if (isset($m[1])) {
28                        $part[trim($m[0], $trimmed)] = trim($m[1], $trimmed);
29                    } else {
30                        $part[] = trim($m[0], $trimmed);
31                    }
32                }
33            }
34            if ($part) {
35                $params[] = $part;
36            }
37        }
38
39        return $params;
40    }
41
42    /**
43     * Converts an array of header values that may contain comma separated
44     * headers into an array of headers with no comma separated values.
45     *
46     * @param string|array $header Header to normalize.
47     *
48     * @return array Returns the normalized header field values.
49     */
50    public static function normalize($header)
51    {
52        if (!is_array($header)) {
53            return array_map('trim', explode(',', $header));
54        }
55
56        $result = [];
57        foreach ($header as $value) {
58            foreach ((array) $value as $v) {
59                if (strpos($v, ',') === false) {
60                    $result[] = $v;
61                    continue;
62                }
63                foreach (preg_split('/,(?=([^"]*"[^"]*")*[^"]*$)/', $v) as $vv) {
64                    $result[] = trim($vv);
65                }
66            }
67        }
68
69        return $result;
70    }
71}
72