Completed
Push — master ( 28d91a...df7455 )
by Sam
08:52
created

HttpRequestManager::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 19
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 19
ccs 0
cts 14
cp 0
rs 9.4285
cc 1
eloc 12
nc 1
nop 4
crap 2
1
<?php
2
3
namespace Jalle19\StatusManager\Manager;
4
5
use Jalle19\ReactHttpStatic\Authentication\Handler\Basic as BasicAuthenticationHandler;
6
use Jalle19\ReactHttpStatic\StaticWebServer;
7
use Jalle19\StatusManager\Configuration\Configuration;
8
use Jalle19\StatusManager\Event\Events;
9
use Psr\Log\LoggerInterface;
10
use React\EventLoop\LoopInterface;
11
use React\Http\Server as HttpServer;
12
use React\Socket\Server as SocketServer;
13
use Symfony\Component\EventDispatcher\EventDispatcher;
14
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
15
16
/**
17
 * Class HttpRequestManager
18
 * @package   Jalle19\StatusManager\Manager
19
 * @copyright Copyright &copy; Sam Stenvall 2016-
20
 * @license   https://www.gnu.org/licenses/gpl.html The GNU General Public License v2.0
21
 */
22
class HttpRequestManager extends AbstractManager implements EventSubscriberInterface
23
{
24
25
	/**
26
	 * @var StaticWebServer
27
	 */
28
	private $_staticWebServer;
29
30
31
	/**
32
	 * @inheritdoc
33
	 */
34
	public function __construct(
35
		Configuration $configuration,
36
		LoggerInterface $logger,
37
		EventDispatcher $eventDispatcher,
38
		LoopInterface $loop
39
	) {
40
		parent::__construct($configuration, $logger, $eventDispatcher);
41
42
		$socket = new SocketServer($loop);
43
		$socket->listen($configuration->getHttpListenPort(), $configuration->getListenAddress());
44
45
		// Configure the web server
46
		$webroot                = realpath(__DIR__ . '/../../client/app');
47
		$this->_staticWebServer = new StaticWebServer(new HttpServer($socket), $webroot, $logger);
48
49
		// Configure the authentication handler
50
		$this->_staticWebServer->setAuthenticationHandler(
51
			new BasicAuthenticationHandler('tvheadend-status-manager', [$this, 'validateCredentials']));
52
	}
53
54
55
	/**
56
	 * @inheritdoc
57
	 */
58
	public static function getSubscribedEvents()
59
	{
60
		return [
61
			Events::MAIN_LOOP_STARTING => 'onMainLoopStarted',
62
		];
63
	}
64
65
66
	/**
67
	 * Called when the main loop has started
68
	 */
69
	public function onMainLoopStarted()
70
	{
71
		$this->logger->notice('Starting the HTTP server on {address}:{port}', [
72
			'address' => $this->configuration->getListenAddress(),
73
			'port'    => $this->configuration->getHttpListenPort(),
74
		]);
75
	}
76
77
78
	/**
79
	 * Checks whether the supplied username and password matches the configuration
80
	 *
81
	 * @param string $username
82
	 * @param string $password
83
	 *
84
	 * @return bool
85
	 */
86
	public function validateCredentials($username, $password)
87
	{
88
		return $username === $this->configuration->getHttpUsername() && $password === $this->configuration->getHttpPassword();
89
	}
90
91
}
92