1: <?php
2:
3: namespace Psr\Http\Message;
4:
5: /**
6: * Representation of an incoming, server-side HTTP request.
7: *
8: * Per the HTTP specification, this interface includes properties for
9: * each of the following:
10: *
11: * - Protocol version
12: * - HTTP method
13: * - URI
14: * - Headers
15: * - Message body
16: *
17: * Additionally, it encapsulates all data as it has arrived to the
18: * application from the CGI and/or PHP environment, including:
19: *
20: * - The values represented in $_SERVER.
21: * - Any cookies provided (generally via $_COOKIE)
22: * - Query string arguments (generally via $_GET, or as parsed via parse_str())
23: * - Upload files, if any (as represented by $_FILES)
24: * - Deserialized body parameters (generally from $_POST)
25: *
26: * $_SERVER values MUST be treated as immutable, as they represent application
27: * state at the time of request; as such, no methods are provided to allow
28: * modification of those values. The other values provide such methods, as they
29: * can be restored from $_SERVER or the request body, and may need treatment
30: * during the application (e.g., body parameters may be deserialized based on
31: * content type).
32: *
33: * Additionally, this interface recognizes the utility of introspecting a
34: * request to derive and match additional parameters (e.g., via URI path
35: * matching, decrypting cookie values, deserializing non-form-encoded body
36: * content, matching authorization headers to users, etc). These parameters
37: * are stored in an "attributes" property.
38: *
39: * Requests are considered immutable; all methods that might change state MUST
40: * be implemented such that they retain the internal state of the current
41: * message and return an instance that contains the changed state.
42: */
43: interface ServerRequestInterface extends RequestInterface
44: {
45: /**
46: * Retrieve server parameters.
47: *
48: * Retrieves data related to the incoming request environment,
49: * typically derived from PHP's $_SERVER superglobal. The data IS NOT
50: * REQUIRED to originate from $_SERVER.
51: *
52: * @return array
53: */
54: public function getServerParams();
55:
56: /**
57: * Retrieve cookies.
58: *
59: * Retrieves cookies sent by the client to the server.
60: *
61: * The data MUST be compatible with the structure of the $_COOKIE
62: * superglobal.
63: *
64: * @return array
65: */
66: public function getCookieParams();
67:
68: /**
69: * Return an instance with the specified cookies.
70: *
71: * The data IS NOT REQUIRED to come from the $_COOKIE superglobal, but MUST
72: * be compatible with the structure of $_COOKIE. Typically, this data will
73: * be injected at instantiation.
74: *
75: * This method MUST NOT update the related Cookie header of the request
76: * instance, nor related values in the server params.
77: *
78: * This method MUST be implemented in such a way as to retain the
79: * immutability of the message, and MUST return an instance that has the
80: * updated cookie values.
81: *
82: * @param array $cookies Array of key/value pairs representing cookies.
83: * @return self
84: */
85: public function withCookieParams(array $cookies);
86:
87: /**
88: * Retrieve query string arguments.
89: *
90: * Retrieves the deserialized query string arguments, if any.
91: *
92: * Note: the query params might not be in sync with the URI or server
93: * params. If you need to ensure you are only getting the original
94: * values, you may need to parse the query string from `getUri()->getQuery()`
95: * or from the `QUERY_STRING` server param.
96: *
97: * @return array
98: */
99: public function getQueryParams();
100:
101: /**
102: * Return an instance with the specified query string arguments.
103: *
104: * These values SHOULD remain immutable over the course of the incoming
105: * request. They MAY be injected during instantiation, such as from PHP's
106: * $_GET superglobal, or MAY be derived from some other value such as the
107: * URI. In cases where the arguments are parsed from the URI, the data
108: * MUST be compatible with what PHP's parse_str() would return for
109: * purposes of how duplicate query parameters are handled, and how nested
110: * sets are handled.
111: *
112: * Setting query string arguments MUST NOT change the URI stored by the
113: * request, nor the values in the server params.
114: *
115: * This method MUST be implemented in such a way as to retain the
116: * immutability of the message, and MUST return an instance that has the
117: * updated query string arguments.
118: *
119: * @param array $query Array of query string arguments, typically from
120: * $_GET.
121: * @return self
122: */
123: public function withQueryParams(array $query);
124:
125: /**
126: * Retrieve normalized file upload data.
127: *
128: * This method returns upload metadata in a normalized tree, with each leaf
129: * an instance of Psr\Http\Message\UploadedFileInterface.
130: *
131: * These values MAY be prepared from $_FILES or the message body during
132: * instantiation, or MAY be injected via withUploadedFiles().
133: *
134: * @return array An array tree of UploadedFileInterface instances; an empty
135: * array MUST be returned if no data is present.
136: */
137: public function getUploadedFiles();
138:
139: /**
140: * Create a new instance with the specified uploaded files.
141: *
142: * This method MUST be implemented in such a way as to retain the
143: * immutability of the message, and MUST return an instance that has the
144: * updated body parameters.
145: *
146: * @param array An array tree of UploadedFileInterface instances.
147: * @return self
148: * @throws \InvalidArgumentException if an invalid structure is provided.
149: */
150: public function withUploadedFiles(array $uploadedFiles);
151:
152: /**
153: * Retrieve any parameters provided in the request body.
154: *
155: * If the request Content-Type is either application/x-www-form-urlencoded
156: * or multipart/form-data, and the request method is POST, this method MUST
157: * return the contents of $_POST.
158: *
159: * Otherwise, this method may return any results of deserializing
160: * the request body content; as parsing returns structured content, the
161: * potential types MUST be arrays or objects only. A null value indicates
162: * the absence of body content.
163: *
164: * @return null|array|object The deserialized body parameters, if any.
165: * These will typically be an array or object.
166: */
167: public function getParsedBody();
168:
169: /**
170: * Return an instance with the specified body parameters.
171: *
172: * These MAY be injected during instantiation.
173: *
174: * If the request Content-Type is either application/x-www-form-urlencoded
175: * or multipart/form-data, and the request method is POST, use this method
176: * ONLY to inject the contents of $_POST.
177: *
178: * The data IS NOT REQUIRED to come from $_POST, but MUST be the results of
179: * deserializing the request body content. Deserialization/parsing returns
180: * structured data, and, as such, this method ONLY accepts arrays or objects,
181: * or a null value if nothing was available to parse.
182: *
183: * As an example, if content negotiation determines that the request data
184: * is a JSON payload, this method could be used to create a request
185: * instance with the deserialized parameters.
186: *
187: * This method MUST be implemented in such a way as to retain the
188: * immutability of the message, and MUST return an instance that has the
189: * updated body parameters.
190: *
191: * @param null|array|object $data The deserialized body data. This will
192: * typically be in an array or object.
193: * @return self
194: * @throws \InvalidArgumentException if an unsupported argument type is
195: * provided.
196: */
197: public function withParsedBody($data);
198:
199: /**
200: * Retrieve attributes derived from the request.
201: *
202: * The request "attributes" may be used to allow injection of any
203: * parameters derived from the request: e.g., the results of path
204: * match operations; the results of decrypting cookies; the results of
205: * deserializing non-form-encoded message bodies; etc. Attributes
206: * will be application and request specific, and CAN be mutable.
207: *
208: * @return array Attributes derived from the request.
209: */
210: public function getAttributes();
211:
212: /**
213: * Retrieve a single derived request attribute.
214: *
215: * Retrieves a single derived request attribute as described in
216: * getAttributes(). If the attribute has not been previously set, returns
217: * the default value as provided.
218: *
219: * This method obviates the need for a hasAttribute() method, as it allows
220: * specifying a default value to return if the attribute is not found.
221: *
222: * @see getAttributes()
223: * @param string $name The attribute name.
224: * @param mixed $default Default value to return if the attribute does not exist.
225: * @return mixed
226: */
227: public function getAttribute($name, $default = null);
228:
229: /**
230: * Return an instance with the specified derived request attribute.
231: *
232: * This method allows setting a single derived request attribute as
233: * described in getAttributes().
234: *
235: * This method MUST be implemented in such a way as to retain the
236: * immutability of the message, and MUST return an instance that has the
237: * updated attribute.
238: *
239: * @see getAttributes()
240: * @param string $name The attribute name.
241: * @param mixed $value The value of the attribute.
242: * @return self
243: */
244: public function withAttribute($name, $value);
245:
246: /**
247: * Return an instance that removes the specified derived request attribute.
248: *
249: * This method allows removing a single derived request attribute as
250: * described in getAttributes().
251: *
252: * This method MUST be implemented in such a way as to retain the
253: * immutability of the message, and MUST return an instance that removes
254: * the attribute.
255: *
256: * @see getAttributes()
257: * @param string $name The attribute name.
258: * @return self
259: */
260: public function withoutAttribute($name);
261: }
262: