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