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