Passed
Push — master ( 9acbb8...d979ac )
by Fabio
05:27
created

TRequestConnectionUpgrade::events()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 1
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 3
rs 10
1
<?php
2
/**
3
 * TRequestConnectionUpgrade class file.
4
 *
5
 * @author Brad Anderson <[email protected]>
6
 * @link https://github.com/pradosoft/prado
7
 * @license https://github.com/pradosoft/prado/blob/master/LICENSE
8
 */
9
10
namespace Prado\Web\Behaviors;
11
12
use Prado\Prado;
13
14
/**
15
 * TRequestConnectionUpgrade class.
16
 *
17
 * This is a behavior for {@see THttpRequest} that adds the "Connection: Upgrade"
18
 * header "Upgrade: <service>" to the URL Parameters of the request.
19
 *
20
 * For example, a URL parameter could be used to select the PRADO "websocket" service.
21
 * But this class allows selection of the "websocket" service from the injection of the
22
 * "Upgrade" HTTP headers into the URL parameters without the need for specifying
23
 * URL parameters.
24
 *
25
 * ```xml
26
 *		<behavior name="httpUpgrader" Class="Prado\Web\Behaviors\TRequestConnectionUpgrade" AttachToClass="Prado\Web\THttpRequest" />
27
 * ```
28
 *
29
 * @author Brad Anderson <[email protected]>
30
 * @since 4.2.3
31
 */
32
class TRequestConnectionUpgrade extends \Prado\Util\TBehavior
33
{
34
	public function events()
35
	{
36
		return ['onResolveRequest' => 'processHeaders'];
37
	}
38
39
	/**
40
	 * Move the contents of the Upgrade header to the urlParams.
41
	 * The Service can select on the "Upgrade" HTTP header like "websocket".
42
	 * @param \Prado\Web\THttpRequest $request
43
	 * @param \Prado\Web\THttpRequestParameter $param
44
	 */
45
	public function processHeaders($request, $param)
46
	{
47
		$urlParams = $param->getParameter();
48
		if (!is_array($urlParams)) {
49
			return;
50
		}
51
		$headers = $request->getHeaders(CASE_LOWER);
52
		if (!isset($headers['connection'])) {
53
			return;
54
		}
55
		$connections = array_map('trim', explode(',', strtolower($headers['connection'])));
56
		if (!in_array('upgrade', $connections)) {
57
			return;
58
		}
59
		if (!isset($headers['upgrade'])) {
60
			Prado::log("'Connection: Upgrade' without 'Upgrade' Header from " . $_SERVER['REMOTE_ADDR'], \Prado\Util\TLogger::NOTICE, static::class);
61
			return;
62
		}
63
		$upgrade = $headers['upgrade'];
64
		if (is_array($upgrade)) {
65
			$upgrade = implode(',', $upgrade);
66
		}
67
		$requestedUpgrade = array_map('trim', explode(',', $upgrade));
68
69
		if ($requestedUpgrade) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $requestedUpgrade of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using ! empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
70
			$urlParams = array_merge(array_flip($requestedUpgrade), $urlParams);
71
			$param->setParameter($urlParams); // Forward results
72
			return $urlParams;	 // return for use
73
		}
74
	}
75
}
76