friendship ended with social-app. php is my new best friend
1<?php
2
3namespace React\Http\Io;
4
5use Psr\Http\Message\MessageInterface;
6use Psr\Http\Message\StreamInterface;
7
8/**
9 * [Internal] Abstract HTTP message base class (PSR-7)
10 *
11 * @internal
12 * @see MessageInterface
13 */
14abstract class AbstractMessage implements MessageInterface
15{
16 /**
17 * [Internal] Regex used to match all request header fields into an array, thanks to @kelunik for checking the HTTP specs and coming up with this regex
18 *
19 * @internal
20 * @var string
21 */
22 const REGEX_HEADERS = '/^([^()<>@,;:\\\"\/\[\]?={}\x00-\x20\x7F]++):[\x20\x09]*+((?:[\x20\x09]*+[\x21-\x7E\x80-\xFF]++)*+)[\x20\x09]*+[\r]?+\n/m';
23
24 /** @var array<string,string[]> */
25 private $headers = array();
26
27 /** @var array<string,string> */
28 private $headerNamesLowerCase = array();
29
30 /** @var string */
31 private $protocolVersion;
32
33 /** @var StreamInterface */
34 private $body;
35
36 /**
37 * @param string $protocolVersion
38 * @param array<string,string|string[]> $headers
39 * @param StreamInterface $body
40 */
41 protected function __construct($protocolVersion, array $headers, StreamInterface $body)
42 {
43 foreach ($headers as $name => $value) {
44 if ($value !== array()) {
45 if (\is_array($value)) {
46 foreach ($value as &$one) {
47 $one = (string) $one;
48 }
49 } else {
50 $value = array((string) $value);
51 }
52
53 $lower = \strtolower($name);
54 if (isset($this->headerNamesLowerCase[$lower])) {
55 $value = \array_merge($this->headers[$this->headerNamesLowerCase[$lower]], $value);
56 unset($this->headers[$this->headerNamesLowerCase[$lower]]);
57 }
58
59 $this->headers[$name] = $value;
60 $this->headerNamesLowerCase[$lower] = $name;
61 }
62 }
63
64 $this->protocolVersion = (string) $protocolVersion;
65 $this->body = $body;
66 }
67
68 public function getProtocolVersion()
69 {
70 return $this->protocolVersion;
71 }
72
73 public function withProtocolVersion($version)
74 {
75 if ((string) $version === $this->protocolVersion) {
76 return $this;
77 }
78
79 $message = clone $this;
80 $message->protocolVersion = (string) $version;
81
82 return $message;
83 }
84
85 public function getHeaders()
86 {
87 return $this->headers;
88 }
89
90 public function hasHeader($name)
91 {
92 return isset($this->headerNamesLowerCase[\strtolower($name)]);
93 }
94
95 public function getHeader($name)
96 {
97 $lower = \strtolower($name);
98 return isset($this->headerNamesLowerCase[$lower]) ? $this->headers[$this->headerNamesLowerCase[$lower]] : array();
99 }
100
101 public function getHeaderLine($name)
102 {
103 return \implode(', ', $this->getHeader($name));
104 }
105
106 public function withHeader($name, $value)
107 {
108 if ($value === array()) {
109 return $this->withoutHeader($name);
110 } elseif (\is_array($value)) {
111 foreach ($value as &$one) {
112 $one = (string) $one;
113 }
114 } else {
115 $value = array((string) $value);
116 }
117
118 $lower = \strtolower($name);
119 if (isset($this->headerNamesLowerCase[$lower]) && $this->headerNamesLowerCase[$lower] === (string) $name && $this->headers[$this->headerNamesLowerCase[$lower]] === $value) {
120 return $this;
121 }
122
123 $message = clone $this;
124 if (isset($message->headerNamesLowerCase[$lower])) {
125 unset($message->headers[$message->headerNamesLowerCase[$lower]]);
126 }
127
128 $message->headers[$name] = $value;
129 $message->headerNamesLowerCase[$lower] = $name;
130
131 return $message;
132 }
133
134 public function withAddedHeader($name, $value)
135 {
136 if ($value === array()) {
137 return $this;
138 }
139
140 return $this->withHeader($name, \array_merge($this->getHeader($name), \is_array($value) ? $value : array($value)));
141 }
142
143 public function withoutHeader($name)
144 {
145 $lower = \strtolower($name);
146 if (!isset($this->headerNamesLowerCase[$lower])) {
147 return $this;
148 }
149
150 $message = clone $this;
151 unset($message->headers[$message->headerNamesLowerCase[$lower]], $message->headerNamesLowerCase[$lower]);
152
153 return $message;
154 }
155
156 public function getBody()
157 {
158 return $this->body;
159 }
160
161 public function withBody(StreamInterface $body)
162 {
163 if ($body === $this->body) {
164 return $this;
165 }
166
167 $message = clone $this;
168 $message->body = $body;
169
170 return $message;
171 }
172}