login returns

This commit is contained in:
GitProtogen
2026-03-05 12:08:57 +01:00
parent 0f3b5ed61a
commit 515d061cae
9 changed files with 188 additions and 9 deletions
+8
View File
@@ -0,0 +1,8 @@
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
+8
View File
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/php-com-cen.iml" filepath="$PROJECT_DIR$/.idea/php-com-cen.iml" />
</modules>
</component>
</project>
+29
View File
@@ -0,0 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="WEB_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" packagePrefix="ComCen\" />
<excludeFolder url="file://$MODULE_DIR$/vendor/cboden/ratchet" />
<excludeFolder url="file://$MODULE_DIR$/vendor/composer" />
<excludeFolder url="file://$MODULE_DIR$/vendor/evenement/evenement" />
<excludeFolder url="file://$MODULE_DIR$/vendor/guzzlehttp/psr7" />
<excludeFolder url="file://$MODULE_DIR$/vendor/psr/http-factory" />
<excludeFolder url="file://$MODULE_DIR$/vendor/psr/http-message" />
<excludeFolder url="file://$MODULE_DIR$/vendor/ralouphie/getallheaders" />
<excludeFolder url="file://$MODULE_DIR$/vendor/ratchet/rfc6455" />
<excludeFolder url="file://$MODULE_DIR$/vendor/react/cache" />
<excludeFolder url="file://$MODULE_DIR$/vendor/react/dns" />
<excludeFolder url="file://$MODULE_DIR$/vendor/react/event-loop" />
<excludeFolder url="file://$MODULE_DIR$/vendor/react/promise" />
<excludeFolder url="file://$MODULE_DIR$/vendor/react/socket" />
<excludeFolder url="file://$MODULE_DIR$/vendor/react/stream" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/deprecation-contracts" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/http-foundation" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/polyfill-mbstring" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/polyfill-php83" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/routing" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>
Generated
+45
View File
@@ -0,0 +1,45 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="MessDetectorOptionsConfiguration">
<option name="transferred" value="true" />
</component>
<component name="PHPCSFixerOptionsConfiguration">
<option name="transferred" value="true" />
</component>
<component name="PHPCodeSnifferOptionsConfiguration">
<option name="highlightLevel" value="WARNING" />
<option name="transferred" value="true" />
</component>
<component name="PhpIncludePathManager">
<include_path>
<path value="$PROJECT_DIR$/vendor/guzzlehttp/psr7" />
<path value="$PROJECT_DIR$/vendor/symfony/routing" />
<path value="$PROJECT_DIR$/vendor/symfony/deprecation-contracts" />
<path value="$PROJECT_DIR$/vendor/symfony/polyfill-mbstring" />
<path value="$PROJECT_DIR$/vendor/symfony/polyfill-php83" />
<path value="$PROJECT_DIR$/vendor/cboden/ratchet" />
<path value="$PROJECT_DIR$/vendor/symfony/http-foundation" />
<path value="$PROJECT_DIR$/vendor/composer" />
<path value="$PROJECT_DIR$/vendor/react/cache" />
<path value="$PROJECT_DIR$/vendor/react/stream" />
<path value="$PROJECT_DIR$/vendor/react/dns" />
<path value="$PROJECT_DIR$/vendor/react/promise" />
<path value="$PROJECT_DIR$/vendor/react/socket" />
<path value="$PROJECT_DIR$/vendor/psr/http-message" />
<path value="$PROJECT_DIR$/vendor/react/event-loop" />
<path value="$PROJECT_DIR$/vendor/evenement/evenement" />
<path value="$PROJECT_DIR$/vendor/psr/http-factory" />
<path value="$PROJECT_DIR$/vendor/ratchet/rfc6455" />
<path value="$PROJECT_DIR$/vendor/ralouphie/getallheaders" />
</include_path>
</component>
<component name="PhpProjectSharedConfiguration" php_language_level="7.4">
<option name="suggestChangeDefaultLanguageLevel" value="false" />
</component>
<component name="PhpStanOptionsConfiguration">
<option name="transferred" value="true" />
</component>
<component name="PsalmOptionsConfiguration">
<option name="transferred" value="true" />
</component>
</project>
Generated
+6
View File
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
</component>
</project>
+20 -7
View File
@@ -1,14 +1,21 @@
<?php <?php
require __DIR__ . '/../vendor/autoload.php'; require __DIR__ . "/../vendor/autoload.php";
use Ratchet\MessageComponentInterface; use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface; use Ratchet\ConnectionInterface;
use Ratchet\Server\IoServer; use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer; use Ratchet\Http\HttpServer;
use Ratchet\Http\Router;
use Ratchet\WebSocket\WsServer; use Ratchet\WebSocket\WsServer;
use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Routing\Route;
use Symfony\Component\Routing\RequestContext;
use Symfony\Component\Routing\Matcher\UrlMatcher;
use ComCen\Http\LoginController;
use ComCen\Http\RegisterController;
class TestServer implements MessageComponentInterface class WebSocketServer implements MessageComponentInterface
{ {
private array $connectedUsers = []; private array $connectedUsers = [];
@@ -24,18 +31,18 @@ class TestServer implements MessageComponentInterface
public function onOpen(ConnectionInterface $conn): void public function onOpen(ConnectionInterface $conn): void
{ {
$this->connectedUsers[] = $conn; $this->connectedUsers[] = $conn;
$conn->send("Connected users: " . count($this->connectedUsers)); $conn->send("Connected users: " . count($this->connectedUsers) . " (One is you)");
echo "New connection: {$conn->resourceId}\n"; echo "New connection: {$conn->resourceId}\n";
} }
public function onMessage(ConnectionInterface $from, $msg): void public function onMessage(ConnectionInterface $from, $msg): void
{ {
$from->send("Resending: $msg");
foreach ($this->connectedUsers as $conn) { foreach ($this->connectedUsers as $conn) {
if ($from->resourceId !== $conn->resourceId) { if ($from->resourceId !== $conn->resourceId) {
$conn->send("From user " . $from->resourceId . ": " . $msg); $conn->send("From user " . $from->resourceId . ": " . $msg);
} }
} }
$from->send("Message sent to others");
} }
public function onClose(ConnectionInterface $conn): void public function onClose(ConnectionInterface $conn): void
@@ -51,11 +58,17 @@ class TestServer implements MessageComponentInterface
} }
} }
$routes = new RouteCollection();
$routes->add("login", new Route("/login", ["_controller" => new LoginController()]));
$routes->add("register", new Route("/register", ["_controller" => new RegisterController()]));
$routes->add("ws", new Route("/ws", ["_controller" => new WsServer(new WebSocketServer())]));
$server = IoServer::factory( $server = IoServer::factory(
new HttpServer(new WsServer(new TestServer())), new HttpServer(new Router(new UrlMatcher($routes, new RequestContext()))),
8080 8080,
"0.0.0.0"
); );
echo "WebSocket server running on ws://localhost:8080\n"; echo "Server running on http://localhost:8080\n";
$server->run(); $server->run();
+2 -2
View File
@@ -10,7 +10,7 @@ $html->content .= "
<html lang=\"en\"> <html lang=\"en\">
<head> <head>
<meta charset=\"UTF-8\"> <meta charset=\"UTF-8\">
<title>Ratchet Hello World</title> <title>Chat</title>
</head> </head>
<body> <body>
<h2>WebSocket Test</h2> <h2>WebSocket Test</h2>
@@ -21,7 +21,7 @@ $html->content .= "
<script> <script>
const log = document.getElementById('log'); const log = document.getElementById('log');
const ws = new WebSocket('ws://localhost:8080'); const ws = new WebSocket('ws://localhost:8080/ws');
ws.onopen = () => append('Connected'); ws.onopen = () => append('Connected');
ws.onmessage = e => append('Server: ' + e.data); ws.onmessage = e => append('Server: ' + e.data);
+35
View File
@@ -0,0 +1,35 @@
<?php
namespace ComCen\Http;
use Ratchet\ConnectionInterface;
use Ratchet\Http\HttpServerInterface;
use Psr\Http\Message\RequestInterface;
class LoginController implements HttpServerInterface
{
public function onOpen(ConnectionInterface $conn, RequestInterface $request = null): void
{
$params = [];
$json = "";
parse_str($request->getUri()->getQuery(), $params);
$username = $params["username"];
$password = $params["password"];
if (!$username || !$password) {
$json = json_encode(["error" => "Bad Credentials"]);
$conn->send("HTTP/1.1 400 Bad Request\r\nContent-Type: application/json\r\n\r\n{$json}");
$conn->close();
return;
}
$json = json_encode(["token" => "token"]);
$conn->send("HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n{$json}");
$conn->close();
}
public function onMessage(ConnectionInterface $from, $msg): void {}
public function onClose(ConnectionInterface $conn): void {}
public function onError(ConnectionInterface $conn, \Exception $e): void { $conn->close(); }
}
+35
View File
@@ -0,0 +1,35 @@
<?php
namespace ComCen\Http;
use Ratchet\ConnectionInterface;
use Ratchet\Http\HttpServerInterface;
use Psr\Http\Message\RequestInterface;
class RegisterController implements HttpServerInterface
{
public function onOpen(ConnectionInterface $conn, RequestInterface $request = null): void
{
$params = [];
$json = "";
parse_str($request->getUri()->getQuery(), $params);
$username = $params["username"];
$password = $params["password"];
if (!$username || !$password) {
$json = json_encode(["error" => "Bad Credentials"]);
$conn->send("HTTP/1.1 400 Bad Request\r\nContent-Type: application/json\r\n\r\n{$json}");
$conn->close();
return;
}
$json = json_encode(["token" => "token"]);
$conn->send("HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n{$json}");
$conn->close();
}
public function onMessage(ConnectionInterface $from, $msg): void {}
public function onClose(ConnectionInterface $conn): void {}
public function onError(ConnectionInterface $conn, \Exception $e): void { $conn->close(); }
}