1: <?php
2:
3: 4: 5: 6:
7:
8: namespace Nette\Http;
9:
10: use Nette;
11:
12:
13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
32: class Request extends Nette\Object implements IRequest
33: {
34:
35: private $method;
36:
37:
38: private $url;
39:
40:
41: private $post;
42:
43:
44: private $files;
45:
46:
47: private $cookies;
48:
49:
50: private ;
51:
52:
53: private $remoteAddress;
54:
55:
56: private $remoteHost;
57:
58:
59: private $rawBodyCallback;
60:
61:
62: public function __construct(UrlScript $url, $query = NULL, $post = NULL, $files = NULL, $cookies = NULL,
63: $headers = NULL, $method = NULL, $remoteAddress = NULL, $remoteHost = NULL, $rawBodyCallback = NULL)
64: {
65: $this->url = $url;
66: if ($query !== NULL) {
67: trigger_error('Nette\Http\Request::__construct(): parameter $query is deprecated.', E_USER_DEPRECATED);
68: $url->setQuery($query);
69: }
70: $this->post = (array) $post;
71: $this->files = (array) $files;
72: $this->cookies = (array) $cookies;
73: $this->headers = array_change_key_case((array) $headers, CASE_LOWER);
74: $this->method = $method ?: 'GET';
75: $this->remoteAddress = $remoteAddress;
76: $this->remoteHost = $remoteHost;
77: $this->rawBodyCallback = $rawBodyCallback;
78: }
79:
80:
81: 82: 83: 84:
85: public function getUrl()
86: {
87: return clone $this->url;
88: }
89:
90:
91:
92:
93:
94: 95: 96: 97: 98: 99: 100:
101: public function getQuery($key = NULL, $default = NULL)
102: {
103: if (func_num_args() === 0) {
104: return $this->url->getQueryParameters();
105: } else {
106: return $this->url->getQueryParameter($key, $default);
107: }
108: }
109:
110:
111: 112: 113: 114: 115: 116: 117:
118: public function getPost($key = NULL, $default = NULL)
119: {
120: if (func_num_args() === 0) {
121: return $this->post;
122:
123: } elseif (isset($this->post[$key])) {
124: return $this->post[$key];
125:
126: } else {
127: return $default;
128: }
129: }
130:
131:
132: 133: 134: 135: 136:
137: public function getFile($key)
138: {
139: if (func_num_args() > 1) {
140: trigger_error('Calling getFile() with multiple keys is deprecated.', E_USER_DEPRECATED);
141: return Nette\Utils\Arrays::get($this->files, func_get_args(), NULL);
142: }
143:
144: return isset($this->files[$key]) ? $this->files[$key] : NULL;
145: }
146:
147:
148: 149: 150: 151:
152: public function getFiles()
153: {
154: return $this->files;
155: }
156:
157:
158: 159: 160: 161: 162: 163:
164: public function getCookie($key, $default = NULL)
165: {
166: return isset($this->cookies[$key]) ? $this->cookies[$key] : $default;
167: }
168:
169:
170: 171: 172: 173:
174: public function getCookies()
175: {
176: return $this->cookies;
177: }
178:
179:
180:
181:
182:
183: 184: 185: 186:
187: public function getMethod()
188: {
189: return $this->method;
190: }
191:
192:
193: 194: 195: 196: 197:
198: public function isMethod($method)
199: {
200: return strcasecmp($this->method, $method) === 0;
201: }
202:
203:
204: 205: 206:
207: public function isPost()
208: {
209: return $this->isMethod('POST');
210: }
211:
212:
213: 214: 215: 216: 217: 218: 219:
220: public function ($header, $default = NULL)
221: {
222: $header = strtolower($header);
223: return isset($this->headers[$header]) ? $this->headers[$header] : $default;
224: }
225:
226:
227: 228: 229: 230:
231: public function ()
232: {
233: return $this->headers;
234: }
235:
236:
237: 238: 239: 240:
241: public function getReferer()
242: {
243: return isset($this->headers['referer']) ? new Url($this->headers['referer']) : NULL;
244: }
245:
246:
247: 248: 249: 250:
251: public function isSecured()
252: {
253: return $this->url->getScheme() === 'https';
254: }
255:
256:
257: 258: 259: 260:
261: public function isAjax()
262: {
263: return $this->getHeader('X-Requested-With') === 'XMLHttpRequest';
264: }
265:
266:
267: 268: 269: 270:
271: public function getRemoteAddress()
272: {
273: return $this->remoteAddress;
274: }
275:
276:
277: 278: 279: 280:
281: public function getRemoteHost()
282: {
283: if ($this->remoteHost === NULL && $this->remoteAddress !== NULL) {
284: $this->remoteHost = getHostByAddr($this->remoteAddress);
285: }
286: return $this->remoteHost;
287: }
288:
289:
290: 291: 292: 293:
294: public function getRawBody()
295: {
296: return $this->rawBodyCallback ? call_user_func($this->rawBodyCallback) : NULL;
297: }
298:
299:
300: 301: 302: 303: 304:
305: public function detectLanguage(array $langs)
306: {
307: $header = $this->getHeader('Accept-Language');
308: if (!$header) {
309: return NULL;
310: }
311:
312: $s = strtolower($header);
313: $s = strtr($s, '_', '-');
314: rsort($langs);
315: preg_match_all('#(' . implode('|', $langs) . ')(?:-[^\s,;=]+)?\s*(?:;\s*q=([0-9.]+))?#', $s, $matches);
316:
317: if (!$matches[0]) {
318: return NULL;
319: }
320:
321: $max = 0;
322: $lang = NULL;
323: foreach ($matches[1] as $key => $value) {
324: $q = $matches[2][$key] === '' ? 1.0 : (float) $matches[2][$key];
325: if ($q > $max) {
326: $max = $q; $lang = $value;
327: }
328: }
329:
330: return $lang;
331: }
332:
333: }
334: