Completed
Pull Request — master (#1308)
by
unknown
09:08
created
core/services/request/Request.php 1 patch
Indentation   +658 added lines, -658 removed lines patch added patch discarded remove patch
@@ -17,662 +17,662 @@
 block discarded – undo
17 17
 class Request implements InterminableInterface, RequestInterface, ReservedInstanceInterface
18 18
 {
19 19
 
20
-    /**
21
-     * $_GET parameters
22
-     *
23
-     * @var array $get
24
-     */
25
-    private $get;
26
-
27
-    /**
28
-     * $_POST parameters
29
-     *
30
-     * @var array $post
31
-     */
32
-    private $post;
33
-
34
-    /**
35
-     * $_COOKIE parameters
36
-     *
37
-     * @var array $cookie
38
-     */
39
-    private $cookie;
40
-
41
-    /**
42
-     * $_SERVER parameters
43
-     *
44
-     * @var array $server
45
-     */
46
-    private $server;
47
-
48
-    /**
49
-     * $_FILES parameters
50
-     *
51
-     * @var array $files
52
-     */
53
-    private $files;
54
-
55
-    /**
56
-     * $_REQUEST parameters
57
-     *
58
-     * @var array $request
59
-     */
60
-    private $request;
61
-
62
-    /**
63
-     * @var RequestTypeContextCheckerInterface
64
-     */
65
-    private $request_type;
66
-
67
-    /**
68
-     * IP address for request
69
-     *
70
-     * @var string $ip_address
71
-     */
72
-    private $ip_address;
73
-
74
-    /**
75
-     * @var string $user_agent
76
-     */
77
-    private $user_agent;
78
-
79
-    /**
80
-     * true if current user appears to be some kind of bot
81
-     *
82
-     * @var bool $is_bot
83
-     */
84
-    private $is_bot;
85
-
86
-
87
-    /**
88
-     * @param array $get
89
-     * @param array $post
90
-     * @param array $cookie
91
-     * @param array $server
92
-     * @param array $files
93
-     */
94
-    public function __construct(array $get, array $post, array $cookie, array $server, array $files = array())
95
-    {
96
-        // grab request vars
97
-        $this->get = $get;
98
-        $this->post = $post;
99
-        $this->cookie = $cookie;
100
-        $this->server = $server;
101
-        $this->files = $files;
102
-        $this->request = array_merge($this->get, $this->post);
103
-        $this->ip_address = $this->visitorIp();
104
-    }
105
-
106
-
107
-    /**
108
-     * @param RequestTypeContextCheckerInterface $type
109
-     */
110
-    public function setRequestTypeContextChecker(RequestTypeContextCheckerInterface $type)
111
-    {
112
-        $this->request_type = $type;
113
-    }
114
-
115
-
116
-    /**
117
-     * @return array
118
-     */
119
-    public function getParams()
120
-    {
121
-        return $this->get;
122
-    }
123
-
124
-
125
-    /**
126
-     * @return array
127
-     */
128
-    public function postParams()
129
-    {
130
-        return $this->post;
131
-    }
132
-
133
-
134
-    /**
135
-     * @return array
136
-     */
137
-    public function cookieParams()
138
-    {
139
-        return $this->cookie;
140
-    }
141
-
142
-
143
-    /**
144
-     * @return array
145
-     */
146
-    public function serverParams()
147
-    {
148
-        return $this->server;
149
-    }
150
-
151
-
152
-    /**
153
-     * @return array
154
-     */
155
-    public function filesParams()
156
-    {
157
-        return $this->files;
158
-    }
159
-
160
-
161
-    /**
162
-     * returns contents of $_REQUEST
163
-     *
164
-     * @return array
165
-     */
166
-    public function requestParams()
167
-    {
168
-        return $this->request;
169
-    }
170
-
171
-
172
-    /**
173
-     * @param      $key
174
-     * @param      $value
175
-     * @param bool $override_ee
176
-     * @return    void
177
-     */
178
-    public function setRequestParam($key, $value, $override_ee = false)
179
-    {
180
-        // don't allow "ee" to be overwritten unless explicitly instructed to do so
181
-        if ($key !== 'ee'
182
-            || ($key === 'ee' && empty($this->request['ee']))
183
-            || ($key === 'ee' && ! empty($this->request['ee']) && $override_ee)
184
-        ) {
185
-            $this->request[ $key ] = $value;
186
-        }
187
-    }
188
-
189
-
190
-    /**
191
-     * returns   the value for a request param if the given key exists
192
-     *
193
-     * @param       $key
194
-     * @param null  $default
195
-     * @return mixed
196
-     */
197
-    public function getRequestParam($key, $default = null)
198
-    {
199
-        return $this->requestParameterDrillDown($key, $default, 'get');
200
-    }
201
-
202
-
203
-    /**
204
-     * check if param exists
205
-     *
206
-     * @param       $key
207
-     * @return bool
208
-     */
209
-    public function requestParamIsSet($key)
210
-    {
211
-        return $this->requestParameterDrillDown($key);
212
-    }
213
-
214
-
215
-    /**
216
-     * check if a request parameter exists whose key that matches the supplied wildcard pattern
217
-     * and return the value for the first match found
218
-     * wildcards can be either of the following:
219
-     *      ? to represent a single character of any type
220
-     *      * to represent one or more characters of any type
221
-     *
222
-     * @param string     $pattern
223
-     * @param null|mixed $default
224
-     * @return mixed
225
-     */
226
-    public function getMatch($pattern, $default = null)
227
-    {
228
-        return $this->requestParameterDrillDown($pattern, $default, 'match');
229
-    }
230
-
231
-
232
-    /**
233
-     * check if a request parameter exists whose key matches the supplied wildcard pattern
234
-     * wildcards can be either of the following:
235
-     *      ? to represent a single character of any type
236
-     *      * to represent one or more characters of any type
237
-     * returns true if a match is found or false if not
238
-     *
239
-     * @param string $pattern
240
-     * @return bool
241
-     */
242
-    public function matches($pattern)
243
-    {
244
-        return $this->requestParameterDrillDown($pattern, null, 'match') !== null;
245
-    }
246
-
247
-
248
-    /**
249
-     * @see https://stackoverflow.com/questions/6163055/php-string-matching-with-wildcard
250
-     * @param string $pattern               A string including wildcards to be converted to a regex pattern
251
-     *                                      and used to search through the current request's parameter keys
252
-     * @param array  $request_params        The array of request parameters to search through
253
-     * @param mixed  $default               [optional] The value to be returned if no match is found.
254
-     *                                      Default is null
255
-     * @param string $return                [optional] Controls what kind of value is returned.
256
-     *                                      Options are:
257
-     *                                      'bool' will return true or false if match is found or not
258
-     *                                      'key' will return the first key found that matches the supplied pattern
259
-     *                                      'value' will return the value for the first request parameter
260
-     *                                      whose key matches the supplied pattern
261
-     *                                      Default is 'value'
262
-     * @return boolean|string
263
-     */
264
-    private function match($pattern, array $request_params, $default = null, $return = 'value')
265
-    {
266
-        $return = in_array($return, array('bool', 'key', 'value'), true)
267
-            ? $return
268
-            : 'is_set';
269
-        // replace wildcard chars with regex chars
270
-        $pattern = str_replace(
271
-            array("\*", "\?"),
272
-            array('.*', '.'),
273
-            preg_quote($pattern, '/')
274
-        );
275
-        foreach ($request_params as $key => $request_param) {
276
-            if (preg_match('/^' . $pattern . '$/is', $key)) {
277
-                // return value for request param
278
-                if ($return === 'value') {
279
-                    return $request_params[ $key ];
280
-                }
281
-                // or actual key or true just to indicate it was found
282
-                return $return === 'key' ? $key : true;
283
-            }
284
-        }
285
-        // match not found so return default value or false
286
-        return $return === 'value' ? $default : false;
287
-    }
288
-
289
-
290
-    /**
291
-     * the supplied key can be a simple string to represent a "top-level" request parameter
292
-     * or represent a key for a request parameter that is nested deeper within the request parameter array,
293
-     * by using square brackets to surround keys for deeper array elements.
294
-     * For example :
295
-     * if the supplied $key was: "first[second][third]"
296
-     * then this will attempt to drill down into the request parameter array to find a value.
297
-     * Given the following request parameters:
298
-     *  array(
299
-     *      'first' => array(
300
-     *          'second' => array(
301
-     *              'third' => 'has a value'
302
-     *          )
303
-     *      )
304
-     *  )
305
-     * would return true if default parameters were set
306
-     *
307
-     * @param string $callback
308
-     * @param        $key
309
-     * @param null   $default
310
-     * @param array  $request_params
311
-     * @return bool|mixed|null
312
-     */
313
-    private function requestParameterDrillDown(
314
-        $key,
315
-        $default = null,
316
-        $callback = 'is_set',
317
-        array $request_params = array()
318
-    ) {
319
-        $callback = in_array($callback, array('is_set', 'get', 'match'), true)
320
-            ? $callback
321
-            : 'is_set';
322
-        $request_params = ! empty($request_params)
323
-            ? $request_params
324
-            : $this->request;
325
-        // does incoming key represent an array like 'first[second][third]'  ?
326
-        if (strpos($key, '[') !== false) {
327
-            // turn it into an actual array
328
-            $key = str_replace(']', '', $key);
329
-            $keys = explode('[', $key);
330
-            $key = array_shift($keys);
331
-            if ($callback === 'match') {
332
-                $real_key = $this->match($key, $request_params, $default, 'key');
333
-                $key = $real_key ? $real_key : $key;
334
-            }
335
-            // check if top level key exists
336
-            if (isset($request_params[ $key ])) {
337
-                // build a new key to pass along like: 'second[third]'
338
-                // or just 'second' depending on depth of keys
339
-                $key_string = array_shift($keys);
340
-                if (! empty($keys)) {
341
-                    $key_string .= '[' . implode('][', $keys) . ']';
342
-                }
343
-                return $this->requestParameterDrillDown(
344
-                    $key_string,
345
-                    $default,
346
-                    $callback,
347
-                    $request_params[ $key ]
348
-                );
349
-            }
350
-        }
351
-        if ($callback === 'is_set') {
352
-            return isset($request_params[ $key ]);
353
-        }
354
-        if ($callback === 'match') {
355
-            return $this->match($key, $request_params, $default);
356
-        }
357
-        return isset($request_params[ $key ])
358
-            ? $request_params[ $key ]
359
-            : $default;
360
-    }
361
-
362
-
363
-    /**
364
-     * remove param
365
-     *
366
-     * @param      $key
367
-     * @param bool $unset_from_global_too
368
-     */
369
-    public function unSetRequestParam($key, $unset_from_global_too = false)
370
-    {
371
-        unset($this->request[ $key ]);
372
-        if ($unset_from_global_too) {
373
-            unset($_REQUEST[ $key ]);
374
-        }
375
-    }
376
-
377
-
378
-    /**
379
-     * @return string
380
-     */
381
-    public function ipAddress()
382
-    {
383
-        return $this->ip_address;
384
-    }
385
-
386
-
387
-    /**
388
-     * attempt to get IP address of current visitor from server
389
-     * plz see: http://stackoverflow.com/a/2031935/1475279
390
-     *
391
-     * @access public
392
-     * @return string
393
-     */
394
-    private function visitorIp()
395
-    {
396
-        $visitor_ip = '0.0.0.0';
397
-        $server_keys = array(
398
-            'HTTP_CLIENT_IP',
399
-            'HTTP_X_FORWARDED_FOR',
400
-            'HTTP_X_FORWARDED',
401
-            'HTTP_X_CLUSTER_CLIENT_IP',
402
-            'HTTP_FORWARDED_FOR',
403
-            'HTTP_FORWARDED',
404
-            'REMOTE_ADDR',
405
-        );
406
-        foreach ($server_keys as $key) {
407
-            if (isset($this->server[ $key ])) {
408
-                foreach (array_map('trim', explode(',', $this->server[ $key ])) as $ip) {
409
-                    if ($ip === '127.0.0.1' || filter_var($ip, FILTER_VALIDATE_IP) !== false) {
410
-                        $visitor_ip = $ip;
411
-                    }
412
-                }
413
-            }
414
-        }
415
-        return $visitor_ip;
416
-    }
417
-
418
-
419
-    /**
420
-     * Gets the request's literal URI. Related to `requestUriAfterSiteHomeUri`, see its description for a comparison.
421
-     * @return string
422
-     */
423
-    public function requestUri()
424
-    {
425
-        $request_uri = filter_input(
426
-            INPUT_SERVER,
427
-            'REQUEST_URI',
428
-            FILTER_SANITIZE_URL,
429
-            FILTER_NULL_ON_FAILURE
430
-        );
431
-        if (empty($request_uri)) {
432
-            // fallback sanitization if the above fails
433
-            $request_uri = wp_sanitize_redirect($this->server['REQUEST_URI']);
434
-        }
435
-        return $request_uri;
436
-    }
437
-
438
-
439
-    /**
440
-     * Returns the REQUEST_URI after the current blog's home URI.
441
-     * Eg, if this is a multisite, subdirectory install, the main blog lives at "http://mysite.com", and the current
442
-     * blog lives at "http://mysite.com/other/", and a request comes to "http://mysite.com/other/path-relative-to-site",
443
-     * this will return "/path-relative-to-site" whereas `requestUri` will return "/other/path-relative-to-site".
444
-     * @since $VID:$
445
-     * @return mixed|string
446
-     */
447
-    public function requestUriAfterSiteHomeUri()
448
-    {
449
-        $request_uri = filter_input(
450
-            INPUT_SERVER,
451
-            'REQUEST_URI',
452
-            FILTER_SANITIZE_URL,
453
-            FILTER_NULL_ON_FAILURE
454
-        );
455
-        // If it's a subdomain multisite install, we're actually only interested in
456
-
457
-        $home_path = parse_url(
458
-            home_url(),
459
-            PHP_URL_PATH
460
-        );
461
-        $request_uri = str_replace(
462
-            untrailingslashit($home_path),
463
-            '',
464
-            $request_uri
465
-        );
466
-
467
-
468
-        if (empty($request_uri)) {
469
-            // fallback sanitization if the above fails
470
-            $request_uri = $this->requestUri();
471
-        }
472
-        return $request_uri;
473
-    }
474
-
475
-
476
-    /**
477
-     * @return string
478
-     */
479
-    public function userAgent()
480
-    {
481
-        return $this->user_agent;
482
-    }
483
-
484
-
485
-    /**
486
-     * @param string $user_agent
487
-     */
488
-    public function setUserAgent($user_agent = '')
489
-    {
490
-        if ($user_agent === '' || ! is_string($user_agent)) {
491
-            $user_agent = isset($_SERVER['HTTP_USER_AGENT']) ? (string) esc_attr($_SERVER['HTTP_USER_AGENT']) : '';
492
-        }
493
-        $this->user_agent = $user_agent;
494
-    }
495
-
496
-
497
-    /**
498
-     * @return bool
499
-     */
500
-    public function isBot()
501
-    {
502
-        return $this->is_bot;
503
-    }
504
-
505
-
506
-    /**
507
-     * @param bool $is_bot
508
-     */
509
-    public function setIsBot($is_bot)
510
-    {
511
-        $this->is_bot = filter_var($is_bot, FILTER_VALIDATE_BOOLEAN);
512
-    }
513
-
514
-
515
-    /**
516
-     * @return bool
517
-     */
518
-    public function isActivation()
519
-    {
520
-        return $this->request_type->isActivation();
521
-    }
522
-
523
-
524
-    /**
525
-     * @param $is_activation
526
-     * @return bool
527
-     */
528
-    public function setIsActivation($is_activation)
529
-    {
530
-        return $this->request_type->setIsActivation($is_activation);
531
-    }
532
-
533
-
534
-    /**
535
-     * @return bool
536
-     */
537
-    public function isAdmin()
538
-    {
539
-        return $this->request_type->isAdmin();
540
-    }
541
-
542
-
543
-    /**
544
-     * @return bool
545
-     */
546
-    public function isAdminAjax()
547
-    {
548
-        return $this->request_type->isAdminAjax();
549
-    }
550
-
551
-
552
-    /**
553
-     * @return bool
554
-     */
555
-    public function isAjax()
556
-    {
557
-        return $this->request_type->isAjax();
558
-    }
559
-
560
-
561
-    /**
562
-     * @return bool
563
-     */
564
-    public function isEeAjax()
565
-    {
566
-        return $this->request_type->isEeAjax();
567
-    }
568
-
569
-
570
-    /**
571
-     * @return bool
572
-     */
573
-    public function isOtherAjax()
574
-    {
575
-        return $this->request_type->isOtherAjax();
576
-    }
577
-
578
-
579
-    /**
580
-     * @return bool
581
-     */
582
-    public function isApi()
583
-    {
584
-        return $this->request_type->isApi();
585
-    }
586
-
587
-
588
-    /**
589
-     * @return bool
590
-     */
591
-    public function isCli()
592
-    {
593
-        return $this->request_type->isCli();
594
-    }
595
-
596
-
597
-    /**
598
-     * @return bool
599
-     */
600
-    public function isCron()
601
-    {
602
-        return $this->request_type->isCron();
603
-    }
604
-
605
-
606
-    /**
607
-     * @return bool
608
-     */
609
-    public function isFeed()
610
-    {
611
-        return $this->request_type->isFeed();
612
-    }
613
-
614
-
615
-    /**
616
-     * @return bool
617
-     */
618
-    public function isFrontend()
619
-    {
620
-        return $this->request_type->isFrontend();
621
-    }
622
-
623
-
624
-    /**
625
-     * @return bool
626
-     */
627
-    public function isFrontAjax()
628
-    {
629
-        return $this->request_type->isFrontAjax();
630
-    }
631
-
632
-
633
-    /**
634
-     * @return bool
635
-     */
636
-    public function isIframe()
637
-    {
638
-        return $this->request_type->isIframe();
639
-    }
640
-
641
-
642
-    /**
643
-     * @return bool
644
-     */
645
-    public function isWordPressApi()
646
-    {
647
-        return $this->request_type->isWordPressApi();
648
-    }
649
-
650
-
651
-
652
-    /**
653
-     * @return bool
654
-     */
655
-    public function isWordPressHeartbeat()
656
-    {
657
-        return $this->request_type->isWordPressHeartbeat();
658
-    }
659
-
660
-
661
-
662
-    /**
663
-     * @return bool
664
-     */
665
-    public function isWordPressScrape()
666
-    {
667
-        return $this->request_type->isWordPressScrape();
668
-    }
669
-
670
-
671
-    /**
672
-     * @return string
673
-     */
674
-    public function slug()
675
-    {
676
-        return $this->request_type->slug();
677
-    }
20
+	/**
21
+	 * $_GET parameters
22
+	 *
23
+	 * @var array $get
24
+	 */
25
+	private $get;
26
+
27
+	/**
28
+	 * $_POST parameters
29
+	 *
30
+	 * @var array $post
31
+	 */
32
+	private $post;
33
+
34
+	/**
35
+	 * $_COOKIE parameters
36
+	 *
37
+	 * @var array $cookie
38
+	 */
39
+	private $cookie;
40
+
41
+	/**
42
+	 * $_SERVER parameters
43
+	 *
44
+	 * @var array $server
45
+	 */
46
+	private $server;
47
+
48
+	/**
49
+	 * $_FILES parameters
50
+	 *
51
+	 * @var array $files
52
+	 */
53
+	private $files;
54
+
55
+	/**
56
+	 * $_REQUEST parameters
57
+	 *
58
+	 * @var array $request
59
+	 */
60
+	private $request;
61
+
62
+	/**
63
+	 * @var RequestTypeContextCheckerInterface
64
+	 */
65
+	private $request_type;
66
+
67
+	/**
68
+	 * IP address for request
69
+	 *
70
+	 * @var string $ip_address
71
+	 */
72
+	private $ip_address;
73
+
74
+	/**
75
+	 * @var string $user_agent
76
+	 */
77
+	private $user_agent;
78
+
79
+	/**
80
+	 * true if current user appears to be some kind of bot
81
+	 *
82
+	 * @var bool $is_bot
83
+	 */
84
+	private $is_bot;
85
+
86
+
87
+	/**
88
+	 * @param array $get
89
+	 * @param array $post
90
+	 * @param array $cookie
91
+	 * @param array $server
92
+	 * @param array $files
93
+	 */
94
+	public function __construct(array $get, array $post, array $cookie, array $server, array $files = array())
95
+	{
96
+		// grab request vars
97
+		$this->get = $get;
98
+		$this->post = $post;
99
+		$this->cookie = $cookie;
100
+		$this->server = $server;
101
+		$this->files = $files;
102
+		$this->request = array_merge($this->get, $this->post);
103
+		$this->ip_address = $this->visitorIp();
104
+	}
105
+
106
+
107
+	/**
108
+	 * @param RequestTypeContextCheckerInterface $type
109
+	 */
110
+	public function setRequestTypeContextChecker(RequestTypeContextCheckerInterface $type)
111
+	{
112
+		$this->request_type = $type;
113
+	}
114
+
115
+
116
+	/**
117
+	 * @return array
118
+	 */
119
+	public function getParams()
120
+	{
121
+		return $this->get;
122
+	}
123
+
124
+
125
+	/**
126
+	 * @return array
127
+	 */
128
+	public function postParams()
129
+	{
130
+		return $this->post;
131
+	}
132
+
133
+
134
+	/**
135
+	 * @return array
136
+	 */
137
+	public function cookieParams()
138
+	{
139
+		return $this->cookie;
140
+	}
141
+
142
+
143
+	/**
144
+	 * @return array
145
+	 */
146
+	public function serverParams()
147
+	{
148
+		return $this->server;
149
+	}
150
+
151
+
152
+	/**
153
+	 * @return array
154
+	 */
155
+	public function filesParams()
156
+	{
157
+		return $this->files;
158
+	}
159
+
160
+
161
+	/**
162
+	 * returns contents of $_REQUEST
163
+	 *
164
+	 * @return array
165
+	 */
166
+	public function requestParams()
167
+	{
168
+		return $this->request;
169
+	}
170
+
171
+
172
+	/**
173
+	 * @param      $key
174
+	 * @param      $value
175
+	 * @param bool $override_ee
176
+	 * @return    void
177
+	 */
178
+	public function setRequestParam($key, $value, $override_ee = false)
179
+	{
180
+		// don't allow "ee" to be overwritten unless explicitly instructed to do so
181
+		if ($key !== 'ee'
182
+			|| ($key === 'ee' && empty($this->request['ee']))
183
+			|| ($key === 'ee' && ! empty($this->request['ee']) && $override_ee)
184
+		) {
185
+			$this->request[ $key ] = $value;
186
+		}
187
+	}
188
+
189
+
190
+	/**
191
+	 * returns   the value for a request param if the given key exists
192
+	 *
193
+	 * @param       $key
194
+	 * @param null  $default
195
+	 * @return mixed
196
+	 */
197
+	public function getRequestParam($key, $default = null)
198
+	{
199
+		return $this->requestParameterDrillDown($key, $default, 'get');
200
+	}
201
+
202
+
203
+	/**
204
+	 * check if param exists
205
+	 *
206
+	 * @param       $key
207
+	 * @return bool
208
+	 */
209
+	public function requestParamIsSet($key)
210
+	{
211
+		return $this->requestParameterDrillDown($key);
212
+	}
213
+
214
+
215
+	/**
216
+	 * check if a request parameter exists whose key that matches the supplied wildcard pattern
217
+	 * and return the value for the first match found
218
+	 * wildcards can be either of the following:
219
+	 *      ? to represent a single character of any type
220
+	 *      * to represent one or more characters of any type
221
+	 *
222
+	 * @param string     $pattern
223
+	 * @param null|mixed $default
224
+	 * @return mixed
225
+	 */
226
+	public function getMatch($pattern, $default = null)
227
+	{
228
+		return $this->requestParameterDrillDown($pattern, $default, 'match');
229
+	}
230
+
231
+
232
+	/**
233
+	 * check if a request parameter exists whose key matches the supplied wildcard pattern
234
+	 * wildcards can be either of the following:
235
+	 *      ? to represent a single character of any type
236
+	 *      * to represent one or more characters of any type
237
+	 * returns true if a match is found or false if not
238
+	 *
239
+	 * @param string $pattern
240
+	 * @return bool
241
+	 */
242
+	public function matches($pattern)
243
+	{
244
+		return $this->requestParameterDrillDown($pattern, null, 'match') !== null;
245
+	}
246
+
247
+
248
+	/**
249
+	 * @see https://stackoverflow.com/questions/6163055/php-string-matching-with-wildcard
250
+	 * @param string $pattern               A string including wildcards to be converted to a regex pattern
251
+	 *                                      and used to search through the current request's parameter keys
252
+	 * @param array  $request_params        The array of request parameters to search through
253
+	 * @param mixed  $default               [optional] The value to be returned if no match is found.
254
+	 *                                      Default is null
255
+	 * @param string $return                [optional] Controls what kind of value is returned.
256
+	 *                                      Options are:
257
+	 *                                      'bool' will return true or false if match is found or not
258
+	 *                                      'key' will return the first key found that matches the supplied pattern
259
+	 *                                      'value' will return the value for the first request parameter
260
+	 *                                      whose key matches the supplied pattern
261
+	 *                                      Default is 'value'
262
+	 * @return boolean|string
263
+	 */
264
+	private function match($pattern, array $request_params, $default = null, $return = 'value')
265
+	{
266
+		$return = in_array($return, array('bool', 'key', 'value'), true)
267
+			? $return
268
+			: 'is_set';
269
+		// replace wildcard chars with regex chars
270
+		$pattern = str_replace(
271
+			array("\*", "\?"),
272
+			array('.*', '.'),
273
+			preg_quote($pattern, '/')
274
+		);
275
+		foreach ($request_params as $key => $request_param) {
276
+			if (preg_match('/^' . $pattern . '$/is', $key)) {
277
+				// return value for request param
278
+				if ($return === 'value') {
279
+					return $request_params[ $key ];
280
+				}
281
+				// or actual key or true just to indicate it was found
282
+				return $return === 'key' ? $key : true;
283
+			}
284
+		}
285
+		// match not found so return default value or false
286
+		return $return === 'value' ? $default : false;
287
+	}
288
+
289
+
290
+	/**
291
+	 * the supplied key can be a simple string to represent a "top-level" request parameter
292
+	 * or represent a key for a request parameter that is nested deeper within the request parameter array,
293
+	 * by using square brackets to surround keys for deeper array elements.
294
+	 * For example :
295
+	 * if the supplied $key was: "first[second][third]"
296
+	 * then this will attempt to drill down into the request parameter array to find a value.
297
+	 * Given the following request parameters:
298
+	 *  array(
299
+	 *      'first' => array(
300
+	 *          'second' => array(
301
+	 *              'third' => 'has a value'
302
+	 *          )
303
+	 *      )
304
+	 *  )
305
+	 * would return true if default parameters were set
306
+	 *
307
+	 * @param string $callback
308
+	 * @param        $key
309
+	 * @param null   $default
310
+	 * @param array  $request_params
311
+	 * @return bool|mixed|null
312
+	 */
313
+	private function requestParameterDrillDown(
314
+		$key,
315
+		$default = null,
316
+		$callback = 'is_set',
317
+		array $request_params = array()
318
+	) {
319
+		$callback = in_array($callback, array('is_set', 'get', 'match'), true)
320
+			? $callback
321
+			: 'is_set';
322
+		$request_params = ! empty($request_params)
323
+			? $request_params
324
+			: $this->request;
325
+		// does incoming key represent an array like 'first[second][third]'  ?
326
+		if (strpos($key, '[') !== false) {
327
+			// turn it into an actual array
328
+			$key = str_replace(']', '', $key);
329
+			$keys = explode('[', $key);
330
+			$key = array_shift($keys);
331
+			if ($callback === 'match') {
332
+				$real_key = $this->match($key, $request_params, $default, 'key');
333
+				$key = $real_key ? $real_key : $key;
334
+			}
335
+			// check if top level key exists
336
+			if (isset($request_params[ $key ])) {
337
+				// build a new key to pass along like: 'second[third]'
338
+				// or just 'second' depending on depth of keys
339
+				$key_string = array_shift($keys);
340
+				if (! empty($keys)) {
341
+					$key_string .= '[' . implode('][', $keys) . ']';
342
+				}
343
+				return $this->requestParameterDrillDown(
344
+					$key_string,
345
+					$default,
346
+					$callback,
347
+					$request_params[ $key ]
348
+				);
349
+			}
350
+		}
351
+		if ($callback === 'is_set') {
352
+			return isset($request_params[ $key ]);
353
+		}
354
+		if ($callback === 'match') {
355
+			return $this->match($key, $request_params, $default);
356
+		}
357
+		return isset($request_params[ $key ])
358
+			? $request_params[ $key ]
359
+			: $default;
360
+	}
361
+
362
+
363
+	/**
364
+	 * remove param
365
+	 *
366
+	 * @param      $key
367
+	 * @param bool $unset_from_global_too
368
+	 */
369
+	public function unSetRequestParam($key, $unset_from_global_too = false)
370
+	{
371
+		unset($this->request[ $key ]);
372
+		if ($unset_from_global_too) {
373
+			unset($_REQUEST[ $key ]);
374
+		}
375
+	}
376
+
377
+
378
+	/**
379
+	 * @return string
380
+	 */
381
+	public function ipAddress()
382
+	{
383
+		return $this->ip_address;
384
+	}
385
+
386
+
387
+	/**
388
+	 * attempt to get IP address of current visitor from server
389
+	 * plz see: http://stackoverflow.com/a/2031935/1475279
390
+	 *
391
+	 * @access public
392
+	 * @return string
393
+	 */
394
+	private function visitorIp()
395
+	{
396
+		$visitor_ip = '0.0.0.0';
397
+		$server_keys = array(
398
+			'HTTP_CLIENT_IP',
399
+			'HTTP_X_FORWARDED_FOR',
400
+			'HTTP_X_FORWARDED',
401
+			'HTTP_X_CLUSTER_CLIENT_IP',
402
+			'HTTP_FORWARDED_FOR',
403
+			'HTTP_FORWARDED',
404
+			'REMOTE_ADDR',
405
+		);
406
+		foreach ($server_keys as $key) {
407
+			if (isset($this->server[ $key ])) {
408
+				foreach (array_map('trim', explode(',', $this->server[ $key ])) as $ip) {
409
+					if ($ip === '127.0.0.1' || filter_var($ip, FILTER_VALIDATE_IP) !== false) {
410
+						$visitor_ip = $ip;
411
+					}
412
+				}
413
+			}
414
+		}
415
+		return $visitor_ip;
416
+	}
417
+
418
+
419
+	/**
420
+	 * Gets the request's literal URI. Related to `requestUriAfterSiteHomeUri`, see its description for a comparison.
421
+	 * @return string
422
+	 */
423
+	public function requestUri()
424
+	{
425
+		$request_uri = filter_input(
426
+			INPUT_SERVER,
427
+			'REQUEST_URI',
428
+			FILTER_SANITIZE_URL,
429
+			FILTER_NULL_ON_FAILURE
430
+		);
431
+		if (empty($request_uri)) {
432
+			// fallback sanitization if the above fails
433
+			$request_uri = wp_sanitize_redirect($this->server['REQUEST_URI']);
434
+		}
435
+		return $request_uri;
436
+	}
437
+
438
+
439
+	/**
440
+	 * Returns the REQUEST_URI after the current blog's home URI.
441
+	 * Eg, if this is a multisite, subdirectory install, the main blog lives at "http://mysite.com", and the current
442
+	 * blog lives at "http://mysite.com/other/", and a request comes to "http://mysite.com/other/path-relative-to-site",
443
+	 * this will return "/path-relative-to-site" whereas `requestUri` will return "/other/path-relative-to-site".
444
+	 * @since $VID:$
445
+	 * @return mixed|string
446
+	 */
447
+	public function requestUriAfterSiteHomeUri()
448
+	{
449
+		$request_uri = filter_input(
450
+			INPUT_SERVER,
451
+			'REQUEST_URI',
452
+			FILTER_SANITIZE_URL,
453
+			FILTER_NULL_ON_FAILURE
454
+		);
455
+		// If it's a subdomain multisite install, we're actually only interested in
456
+
457
+		$home_path = parse_url(
458
+			home_url(),
459
+			PHP_URL_PATH
460
+		);
461
+		$request_uri = str_replace(
462
+			untrailingslashit($home_path),
463
+			'',
464
+			$request_uri
465
+		);
466
+
467
+
468
+		if (empty($request_uri)) {
469
+			// fallback sanitization if the above fails
470
+			$request_uri = $this->requestUri();
471
+		}
472
+		return $request_uri;
473
+	}
474
+
475
+
476
+	/**
477
+	 * @return string
478
+	 */
479
+	public function userAgent()
480
+	{
481
+		return $this->user_agent;
482
+	}
483
+
484
+
485
+	/**
486
+	 * @param string $user_agent
487
+	 */
488
+	public function setUserAgent($user_agent = '')
489
+	{
490
+		if ($user_agent === '' || ! is_string($user_agent)) {
491
+			$user_agent = isset($_SERVER['HTTP_USER_AGENT']) ? (string) esc_attr($_SERVER['HTTP_USER_AGENT']) : '';
492
+		}
493
+		$this->user_agent = $user_agent;
494
+	}
495
+
496
+
497
+	/**
498
+	 * @return bool
499
+	 */
500
+	public function isBot()
501
+	{
502
+		return $this->is_bot;
503
+	}
504
+
505
+
506
+	/**
507
+	 * @param bool $is_bot
508
+	 */
509
+	public function setIsBot($is_bot)
510
+	{
511
+		$this->is_bot = filter_var($is_bot, FILTER_VALIDATE_BOOLEAN);
512
+	}
513
+
514
+
515
+	/**
516
+	 * @return bool
517
+	 */
518
+	public function isActivation()
519
+	{
520
+		return $this->request_type->isActivation();
521
+	}
522
+
523
+
524
+	/**
525
+	 * @param $is_activation
526
+	 * @return bool
527
+	 */
528
+	public function setIsActivation($is_activation)
529
+	{
530
+		return $this->request_type->setIsActivation($is_activation);
531
+	}
532
+
533
+
534
+	/**
535
+	 * @return bool
536
+	 */
537
+	public function isAdmin()
538
+	{
539
+		return $this->request_type->isAdmin();
540
+	}
541
+
542
+
543
+	/**
544
+	 * @return bool
545
+	 */
546
+	public function isAdminAjax()
547
+	{
548
+		return $this->request_type->isAdminAjax();
549
+	}
550
+
551
+
552
+	/**
553
+	 * @return bool
554
+	 */
555
+	public function isAjax()
556
+	{
557
+		return $this->request_type->isAjax();
558
+	}
559
+
560
+
561
+	/**
562
+	 * @return bool
563
+	 */
564
+	public function isEeAjax()
565
+	{
566
+		return $this->request_type->isEeAjax();
567
+	}
568
+
569
+
570
+	/**
571
+	 * @return bool
572
+	 */
573
+	public function isOtherAjax()
574
+	{
575
+		return $this->request_type->isOtherAjax();
576
+	}
577
+
578
+
579
+	/**
580
+	 * @return bool
581
+	 */
582
+	public function isApi()
583
+	{
584
+		return $this->request_type->isApi();
585
+	}
586
+
587
+
588
+	/**
589
+	 * @return bool
590
+	 */
591
+	public function isCli()
592
+	{
593
+		return $this->request_type->isCli();
594
+	}
595
+
596
+
597
+	/**
598
+	 * @return bool
599
+	 */
600
+	public function isCron()
601
+	{
602
+		return $this->request_type->isCron();
603
+	}
604
+
605
+
606
+	/**
607
+	 * @return bool
608
+	 */
609
+	public function isFeed()
610
+	{
611
+		return $this->request_type->isFeed();
612
+	}
613
+
614
+
615
+	/**
616
+	 * @return bool
617
+	 */
618
+	public function isFrontend()
619
+	{
620
+		return $this->request_type->isFrontend();
621
+	}
622
+
623
+
624
+	/**
625
+	 * @return bool
626
+	 */
627
+	public function isFrontAjax()
628
+	{
629
+		return $this->request_type->isFrontAjax();
630
+	}
631
+
632
+
633
+	/**
634
+	 * @return bool
635
+	 */
636
+	public function isIframe()
637
+	{
638
+		return $this->request_type->isIframe();
639
+	}
640
+
641
+
642
+	/**
643
+	 * @return bool
644
+	 */
645
+	public function isWordPressApi()
646
+	{
647
+		return $this->request_type->isWordPressApi();
648
+	}
649
+
650
+
651
+
652
+	/**
653
+	 * @return bool
654
+	 */
655
+	public function isWordPressHeartbeat()
656
+	{
657
+		return $this->request_type->isWordPressHeartbeat();
658
+	}
659
+
660
+
661
+
662
+	/**
663
+	 * @return bool
664
+	 */
665
+	public function isWordPressScrape()
666
+	{
667
+		return $this->request_type->isWordPressScrape();
668
+	}
669
+
670
+
671
+	/**
672
+	 * @return string
673
+	 */
674
+	public function slug()
675
+	{
676
+		return $this->request_type->slug();
677
+	}
678 678
 }
Please login to merge, or discard this patch.