From 4034a88ddbc2e2a5b1b6c5c790e55128e4cf85f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B6ren=20Jensen?= Date: Sat, 14 Sep 2024 14:12:40 +0200 Subject: [PATCH] Server setContext --- composer.json | 4 ++-- src/Server.php | 13 +++++++++++++ tests/mock/MockStreamTrait.php | 5 ++++- tests/suites/server/ConfigTest.php | 23 +++++++++++++++++++++++ 4 files changed, 42 insertions(+), 3 deletions(-) diff --git a/composer.json b/composer.json index 4187617..e1f4987 100644 --- a/composer.json +++ b/composer.json @@ -28,14 +28,14 @@ "require": { "php": "^8.1", "phrity/net-uri": "^2.1", - "phrity/net-stream": "^2.0", + "phrity/net-stream": "^2.1", "psr/http-message": "^1.1 | ^2.0", "psr/log": "^1.0 | ^2.0 | ^3.0" }, "require-dev": { "php-coveralls/php-coveralls": "^2.0", "phpunit/phpunit": "^10.0 | ^11.0", - "phrity/net-mock": "^2.0", + "phrity/net-mock": "^2.1", "phrity/util-errorhandler": "^1.1", "squizlabs/php_codesniffer": "^3.5" } diff --git a/src/Server.php b/src/Server.php index b3315ca..5720dcd 100644 --- a/src/Server.php +++ b/src/Server.php @@ -59,6 +59,7 @@ class Server implements LoggerAwareInterface, Stringable private LoggerInterface $logger; private int $timeout = 60; private int $frameSize = 4096; + private array $context = []; // Internal resources private StreamFactory $streamFactory; @@ -244,6 +245,17 @@ public function getWritableConnections(): array }); } + /** + * Set connection context. + * @param array $context Context as array, see https://www.php.net/manual/en/context.php + * @return self + */ + public function setContext(array $context): self + { + $this->context = $context; + return $this; + } + /** * Add a middleware. * @param WebSocket\Middleware\MiddlewareInterface $middleware @@ -455,6 +467,7 @@ protected function createSocketServer(): void try { $uri = new Uri("{$this->scheme}://0.0.0.0:{$this->port}"); $this->server = $this->streamFactory->createSocketServer($uri); + $this->server->setContext($this->context); $this->streams = $this->streamFactory->createStreamCollection(); $this->streams->attach($this->server, '@server'); $this->logger->info("[server] Starting server on {$uri}."); diff --git a/tests/mock/MockStreamTrait.php b/tests/mock/MockStreamTrait.php index 5f1fbdc..9ce8502 100644 --- a/tests/mock/MockStreamTrait.php +++ b/tests/mock/MockStreamTrait.php @@ -104,7 +104,7 @@ function (string $method, array $params) use ($host, $path, $headers): void { /* ---------- WebSocket Server combinded asserts --------------------------------------------------------------- */ - private function expectWsServerSetup(string $scheme = 'tcp', int $port = 8000): void + private function expectWsServerSetup(string $scheme = 'tcp', int $port = 8000, array $context = []): void { $this->expectStreamFactoryCreateSocketServer()->addAssert(function ($method, $params) use ($scheme, $port) { $this->assertInstanceOf('Phrity\Net\Uri', $params[0]); @@ -116,6 +116,9 @@ private function expectWsServerSetup(string $scheme = 'tcp', int $port = 8000): }); $this->expectSocketServerGetTransports(); $this->expectSocketServerGetMetadata(); + $this->expectSocketServerSetContext()->addAssert(function ($method, $params) use ($context) { + $this->assertEquals($context, $params[0]); + }); $this->expectStreamFactoryCreateStreamCollection(); $this->expectStreamCollection(); $this->expectStreamCollectionAttach()->addAssert(function ($method, $params) { diff --git a/tests/suites/server/ConfigTest.php b/tests/suites/server/ConfigTest.php index 58c9209..75f33a6 100644 --- a/tests/suites/server/ConfigTest.php +++ b/tests/suites/server/ConfigTest.php @@ -134,4 +134,27 @@ public function testServerConfiguration(): void $this->expectSocketStreamClose(); unset($server); } + + public function testContextOption(): void + { + $this->expectStreamFactory(); + $server = new Server(8000); + $this->assertSame($server, $server->setStreamFactory(new StreamFactory())); + $this->assertSame($server, $server->setContext(['ssl' => ['verify_peer' => false]])); + + $this->expectWsServerSetup(scheme: 'tcp', port: 8000, context: ['ssl' => ['verify_peer' => false]]); + $this->expectStreamCollectionWaitRead()->addAssert(function ($method, $params) { + $this->assertEquals(60, $params[0]); + }); + $this->expectStreamCollection()->addAssert(function ($method, $params) use ($server) { + $this->assertTrue($server->isRunning()); + $this->assertEquals(0, $server->getConnectionCount()); + $server->stop(); + }); + $server->start(); + $this->assertEquals('WebSocket\Server(tcp://0.0.0.0:8000)', "{$server}"); + $this->assertFalse($server->isRunning()); + + unset($server); + } }