1<?php
2
3namespace Sabre\HTTP;
4
5/**
6 * This trait contains a bunch of methods, shared by both the RequestDecorator
7 * and the ResponseDecorator.
8 *
9 * Didn't seem needed to create a full class for this, so we're just
10 * implementing it as a trait.
11 *
12 * @copyright Copyright (C) 2009-2015 fruux GmbH (https://fruux.com/).
13 * @author Evert Pot (http://evertpot.com/)
14 * @license http://sabre.io/license/ Modified BSD License
15 */
16trait MessageDecoratorTrait {
17
18    /**
19     * The inner request object.
20     *
21     * All method calls will be forwarded here.
22     *
23     * @var MessageInterface
24     */
25    protected $inner;
26
27    /**
28     * Returns the body as a readable stream resource.
29     *
30     * Note that the stream may not be rewindable, and therefore may only be
31     * read once.
32     *
33     * @return resource
34     */
35    function getBodyAsStream() {
36
37        return $this->inner->getBodyAsStream();
38
39    }
40
41    /**
42     * Returns the body as a string.
43     *
44     * Note that because the underlying data may be based on a stream, this
45     * method could only work correctly the first time.
46     *
47     * @return string
48     */
49    function getBodyAsString() {
50
51        return $this->inner->getBodyAsString();
52
53    }
54
55    /**
56     * Returns the message body, as it's internal representation.
57     *
58     * This could be either a string or a stream.
59     *
60     * @return resource|string
61     */
62    function getBody() {
63
64        return $this->inner->getBody();
65
66    }
67
68    /**
69     * Updates the body resource with a new stream.
70     *
71     * @param resource $body
72     * @return void
73     */
74    function setBody($body) {
75
76        $this->inner->setBody($body);
77
78    }
79
80    /**
81     * Returns all the HTTP headers as an array.
82     *
83     * Every header is returned as an array, with one or more values.
84     *
85     * @return array
86     */
87    function getHeaders() {
88
89        return $this->inner->getHeaders();
90
91    }
92
93    /**
94     * Will return true or false, depending on if a HTTP header exists.
95     *
96     * @param string $name
97     * @return bool
98     */
99    function hasHeader($name) {
100
101        return $this->inner->hasHeader($name);
102
103    }
104
105    /**
106     * Returns a specific HTTP header, based on it's name.
107     *
108     * The name must be treated as case-insensitive.
109     * If the header does not exist, this method must return null.
110     *
111     * If a header appeared more than once in a HTTP request, this method will
112     * concatenate all the values with a comma.
113     *
114     * Note that this not make sense for all headers. Some, such as
115     * `Set-Cookie` cannot be logically combined with a comma. In those cases
116     * you *should* use getHeaderAsArray().
117     *
118     * @param string $name
119     * @return string|null
120     */
121    function getHeader($name) {
122
123        return $this->inner->getHeader($name);
124
125    }
126
127    /**
128     * Returns a HTTP header as an array.
129     *
130     * For every time the HTTP header appeared in the request or response, an
131     * item will appear in the array.
132     *
133     * If the header did not exists, this method will return an empty array.
134     *
135     * @param string $name
136     * @return string[]
137     */
138    function getHeaderAsArray($name) {
139
140        return $this->inner->getHeaderAsArray($name);
141
142    }
143
144    /**
145     * Updates a HTTP header.
146     *
147     * The case-sensitity of the name value must be retained as-is.
148     *
149     * If the header already existed, it will be overwritten.
150     *
151     * @param string $name
152     * @param string|string[] $value
153     * @return void
154     */
155    function setHeader($name, $value) {
156
157        $this->inner->setHeader($name, $value);
158
159    }
160
161    /**
162     * Sets a new set of HTTP headers.
163     *
164     * The headers array should contain headernames for keys, and their value
165     * should be specified as either a string or an array.
166     *
167     * Any header that already existed will be overwritten.
168     *
169     * @param array $headers
170     * @return void
171     */
172    function setHeaders(array $headers) {
173
174        $this->inner->setHeaders($headers);
175
176    }
177
178    /**
179     * Adds a HTTP header.
180     *
181     * This method will not overwrite any existing HTTP header, but instead add
182     * another value. Individual values can be retrieved with
183     * getHeadersAsArray.
184     *
185     * @param string $name
186     * @param string $value
187     * @return void
188     */
189    function addHeader($name, $value) {
190
191        $this->inner->addHeader($name, $value);
192
193    }
194
195    /**
196     * Adds a new set of HTTP headers.
197     *
198     * Any existing headers will not be overwritten.
199     *
200     * @param array $headers
201     * @return void
202     */
203    function addHeaders(array $headers) {
204
205        $this->inner->addHeaders($headers);
206
207    }
208
209
210    /**
211     * Removes a HTTP header.
212     *
213     * The specified header name must be treated as case-insenstive.
214     * This method should return true if the header was successfully deleted,
215     * and false if the header did not exist.
216     *
217     * @return bool
218     */
219    function removeHeader($name) {
220
221        $this->inner->removeHeader($name);
222
223    }
224
225    /**
226     * Sets the HTTP version.
227     *
228     * Should be 1.0 or 1.1.
229     *
230     * @param string $version
231     * @return void
232     */
233    function setHttpVersion($version) {
234
235        $this->inner->setHttpVersion($version);
236
237    }
238
239    /**
240     * Returns the HTTP version.
241     *
242     * @return string
243     */
244    function getHttpVersion() {
245
246        return $this->inner->getHttpVersion();
247
248    }
249
250}
251