More tests, misc fixes
This commit is contained in:
parent
7953ce51ee
commit
b730b82ef7
@ -8,6 +8,10 @@ class Configuration
|
||||
{
|
||||
private array $config = [];
|
||||
|
||||
public function __construct(array $config=[])
|
||||
{
|
||||
$this->config = $config;
|
||||
}
|
||||
|
||||
public static function createDefault(): Configuration
|
||||
{
|
||||
|
@ -11,6 +11,7 @@ use React\EventLoop\Loop;
|
||||
use React\EventLoop\LoopInterface;
|
||||
use React\Socket\SecureServer;
|
||||
use React\Socket\SocketServer;
|
||||
use React\Socket\TcpServer;
|
||||
|
||||
class Daemon
|
||||
{
|
||||
@ -20,10 +21,11 @@ class Daemon
|
||||
|
||||
private Server $server;
|
||||
|
||||
private LoggerInterface $logger;
|
||||
private Logger $logger;
|
||||
|
||||
public function __construct(Configuration $config, bool $verbose=false, ?LoopInterface $loop=null)
|
||||
{
|
||||
if (!defined("MERCUREACT_VERSION")) define("MERCUREACT_VERSION", "0.0.0");
|
||||
$this->config = $config;
|
||||
$this->loop = $loop??Loop::get();
|
||||
$this->logger = $this->createLogger($verbose);
|
||||
@ -42,7 +44,7 @@ class Daemon
|
||||
{
|
||||
$this->server = new Server($this->config, $this->logger, $this->loop);
|
||||
|
||||
$this->logger->info("NoccyLabs Mercureact Daemon v".MERCUREACT_VERSION);
|
||||
$this->logger->info("Starting NoccyLabs Mercureact Daemon v".MERCUREACT_VERSION." (".MERCUREACT_BUILDTIME.")");
|
||||
|
||||
$listenAddress = $this->config->getListenAddress();
|
||||
if (!$listenAddress) {
|
||||
@ -53,16 +55,19 @@ class Daemon
|
||||
$certificate = $this->config->get("server.encryption.local_cert");
|
||||
|
||||
if ($certificate) {
|
||||
$this->logger->warning("SSL/TLS suport is broken.");
|
||||
$this->logger->info("Using local cert: {$certificate}");
|
||||
$context = [
|
||||
'tls' => $this->config->get("server.encryption.")
|
||||
];
|
||||
$context = $this->config->get("server.encryption.");
|
||||
$uri = 'tls://' . $listenAddress;
|
||||
$context['crypto_method'] = STREAM_CRYPTO_METHOD_TLSv1_3_SERVER;
|
||||
$socket = new TcpServer($listenAddress);
|
||||
$socket = new SecureServer($socket, null, $context??[]);
|
||||
} else {
|
||||
$uri = 'tcp://' . $listenAddress;
|
||||
$context = [];
|
||||
$socket = new SocketServer($uri);
|
||||
}
|
||||
|
||||
$socket = new SocketServer($uri, $context??[]);
|
||||
|
||||
$this->server->listen($socket);
|
||||
}
|
||||
|
@ -32,6 +32,11 @@ class ApiHandler
|
||||
return new Promise(
|
||||
function (callable $resolve, callable $reject) use ($next, $request) {
|
||||
|
||||
if (!$this->config->get('server.enable_api', true)) {
|
||||
$resolve($next($request));
|
||||
return;
|
||||
}
|
||||
|
||||
$path = $request->getUri()->getPath();
|
||||
|
||||
// FIXME remove this when done debugging
|
||||
|
@ -75,11 +75,14 @@ class ResponseMiddleware
|
||||
'method' => $request->getMethod(),
|
||||
'path' => $request->getUri()->getPath(),
|
||||
]);
|
||||
|
||||
return $response
|
||||
// ->withAddedHeader('Link', '<https://'.$host.'/.well-known/mercure>; rel="mercure"')
|
||||
// ->withAddedHeader('Link', '<wss://'.$host.'/.well-known/mercure>; rel="mercure+ws"')
|
||||
->withHeader('Access-Control-Allow-Origin', '*')
|
||||
->withHeader('Content-Security-Policy', "default-src * 'self' http: 'unsafe-eval' 'unsafe-inline'; connect-src * 'self'")
|
||||
->withHeader('Access-Control-Allow-Origin',
|
||||
$this->config->get('server.cors.allow_origin', '*'))
|
||||
->withHeader('Content-Security-Policy',
|
||||
$this->config->get('server.cors.csp', "default-src * 'self' http: 'unsafe-eval' 'unsafe-inline'; connect-src * 'self'"))
|
||||
->withHeader('Cache-Control', 'must-revalidate')
|
||||
->withHeader('Server', 'Mercureact/0.1.0');
|
||||
}
|
||||
|
@ -32,7 +32,7 @@ class Server
|
||||
private SplObjectStorage $webSocketClients;
|
||||
|
||||
private TopicManager $topicManager;
|
||||
|
||||
|
||||
private Logger $logger;
|
||||
|
||||
private ResponseMiddleware $responseMiddleware;
|
||||
@ -47,13 +47,13 @@ class Server
|
||||
*
|
||||
*
|
||||
*/
|
||||
public function __construct(Configuration $config, ?LoggerInterface $logger, ?LoopInterface $loop=null)
|
||||
public function __construct(Configuration $config, ?Logger $logger, ?LoopInterface $loop=null)
|
||||
{
|
||||
$this->loop = $loop??Loop::get();
|
||||
|
||||
$this->config = $config;
|
||||
|
||||
$this->logger = $logger ?? new NullLogger();
|
||||
$this->logger = $logger ?? new Logger("main");
|
||||
if ($logger instanceof Logger) {
|
||||
$topicLogger = $logger->withName("broker");
|
||||
} else {
|
||||
@ -89,7 +89,7 @@ class Server
|
||||
* @return HttpServer
|
||||
*/
|
||||
private function createHttpServer(): HttpServer
|
||||
{
|
||||
{
|
||||
$stack = [
|
||||
$this->responseMiddleware = new ResponseMiddleware(
|
||||
config: $this->config,
|
||||
|
48
tests/ConfigurationTest.php
Normal file
48
tests/ConfigurationTest.php
Normal file
@ -0,0 +1,48 @@
|
||||
<?php
|
||||
|
||||
namespace NoccyLabs\Mercureact;
|
||||
|
||||
use PHPUnit\Framework\Attributes\CoversClass;
|
||||
|
||||
#[CoversClass(Configuration::class)]
|
||||
class ConfigurationTest extends \PHPUnit\Framework\TestCase
|
||||
{
|
||||
|
||||
public function testCreatingDefaultConfiguration()
|
||||
{
|
||||
$config = Configuration::createDefault();
|
||||
$this->assertInstanceOf(Configuration::class, $config);
|
||||
}
|
||||
|
||||
public function testGettingSingleValues()
|
||||
{
|
||||
$config = new Configuration([
|
||||
'foo.bar' => 'baz',
|
||||
'foo.baz' => true,
|
||||
'foo.bin' => 42,
|
||||
]);
|
||||
|
||||
$this->assertEquals('baz', $config->get("foo.bar"));
|
||||
$this->assertEquals(true, $config->get("foo.baz"));
|
||||
$this->assertEquals(42, $config->get("foo.bin"));
|
||||
}
|
||||
|
||||
public function testGettingMultipleValues()
|
||||
{
|
||||
$config = new Configuration([
|
||||
'foo.bar' => 'baz',
|
||||
'foo.baz' => true,
|
||||
'foo.bin' => 42,
|
||||
'bar' => false,
|
||||
]);
|
||||
|
||||
$this->assertEquals([
|
||||
'foo.bar' => 'baz',
|
||||
'foo.baz' => true,
|
||||
'foo.bin' => 42,
|
||||
], $config->get("foo."));
|
||||
$this->assertEquals(false, $config->get("bar"));
|
||||
$this->assertEquals([], $config->get("bar."));
|
||||
}
|
||||
|
||||
}
|
29
tests/Http/Middleware/NotFoundHandlerTest.php
Normal file
29
tests/Http/Middleware/NotFoundHandlerTest.php
Normal file
@ -0,0 +1,29 @@
|
||||
<?php
|
||||
|
||||
namespace NoccyLabs\Mercureact\Http\Middleware;
|
||||
|
||||
use PHPUnit\Framework\Attributes\CoversClass;
|
||||
use Psr\Http\Message\ResponseInterface;
|
||||
use React\Http\Message\ServerRequest;
|
||||
use React\Promise\Promise;
|
||||
|
||||
#[CoversClass(NotFoundHandler::class)]
|
||||
class NotFoundHandlerTest extends \PHPUnit\Framework\TestCase
|
||||
{
|
||||
|
||||
public function testAlwaysResolvesTo404Response()
|
||||
{
|
||||
|
||||
$handler = new NotFoundHandler();
|
||||
$request = new ServerRequest("GET", "/");
|
||||
$result = null;
|
||||
$promise = $handler->__invoke($request)->then(function ($r) use (&$result) {
|
||||
$result = $r;
|
||||
});
|
||||
|
||||
$this->assertInstanceOf(ResponseInterface::class, $result);
|
||||
/** @var ResponseInterface $result */
|
||||
$this->assertEquals(404, $result->getStatusCode());
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user