Skip to content

Commit 9e9e6ce

Browse files
committed
chore: add httpserver
1 parent cc7f5d8 commit 9e9e6ce

2 files changed

Lines changed: 96 additions & 12 deletions

File tree

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
<?php
2+
3+
namespace Utopia\Http\Adapter\Swoole;
4+
5+
use Swoole\Coroutine;
6+
use Utopia\Http\Adapter;
7+
use Utopia\DI\Container;
8+
use Swoole\Http\Server as SwooleServer;
9+
use Swoole\Http\Request as SwooleRequest;
10+
use Swoole\Http\Response as SwooleResponse;
11+
12+
class HttpServer extends Adapter
13+
{
14+
protected SwooleServer $server;
15+
protected const REQUEST_CONTAINER_CONTEXT_KEY = '__utopia_http_request_container';
16+
protected Container $container;
17+
protected ?Container $requestContainer = null;
18+
protected bool $coroutines;
19+
20+
public function __construct(string $host, ?string $port = null, array $settings = [], ?Container $container = null, bool $coroutines = false)
21+
{
22+
$this->coroutines = $coroutines;
23+
$this->server = new SwooleServer($host, (int) $port);
24+
$this->server->set(\array_merge($settings, [
25+
'open_http2_protocol' => true,
26+
'dispatch_mode' => 2,
27+
'enable_coroutine' => $coroutines,
28+
]));
29+
$this->container = $container ?? new Container();
30+
}
31+
32+
public function onRequest(callable $callback)
33+
{
34+
$this->server->on('request', function (SwooleRequest $request, SwooleResponse $response) use ($callback) {
35+
$handler = function () use ($request, $response, $callback) {
36+
$requestContainer = new Container($this->container);
37+
$requestContainer->set('swooleRequest', fn () => $request);
38+
$requestContainer->set('swooleResponse', fn () => $response);
39+
40+
if ($this->coroutines && Coroutine::getCid() !== -1) {
41+
Coroutine::getContext()[self::REQUEST_CONTAINER_CONTEXT_KEY] = $requestContainer;
42+
} else {
43+
$this->requestContainer = $requestContainer;
44+
}
45+
46+
\call_user_func($callback, new Request($request), new Response($response));
47+
};
48+
49+
if ($this->coroutines) {
50+
go($handler);
51+
} else {
52+
$handler();
53+
}
54+
});
55+
}
56+
57+
public function getContainer(): Container
58+
{
59+
if ($this->coroutines && Coroutine::getCid() !== -1) {
60+
return Coroutine::getContext()[self::REQUEST_CONTAINER_CONTEXT_KEY] ?? $this->container;
61+
}
62+
63+
return $this->requestContainer ?? $this->container;
64+
}
65+
66+
public function getServer(): SwooleServer
67+
{
68+
return $this->server;
69+
}
70+
71+
public function onStart(callable $callback)
72+
{
73+
$this->server->on('start', function () use ($callback) {
74+
if ($this->coroutines) {
75+
go(function () use ($callback) {
76+
\call_user_func($callback, $this);
77+
});
78+
} else {
79+
\call_user_func($callback, $this);
80+
}
81+
});
82+
}
83+
84+
public function start()
85+
{
86+
return $this->server->start();
87+
}
88+
}

src/Http/Adapter/Swoole/Server.php

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,14 @@ class Server extends Adapter
1616
protected SwooleServer $server;
1717
protected const REQUEST_CONTAINER_CONTEXT_KEY = '__utopia_http_request_container';
1818
protected Container $container;
19-
protected ?Container $requestContainer = null;
2019

2120
public function __construct(string $host, ?string $port = null, array $settings = [], ?Container $container = null)
2221
{
2322
$this->server = new SwooleServer($host, $port);
24-
$this->server->set(\array_merge([
23+
$this->server->set(\array_merge($settings, [
2524
'enable_coroutine' => true,
2625
'http_parse_cookie' => false,
27-
], $settings));
26+
]));
2827
$this->container = $container ?? new Container();
2928
}
3029

@@ -35,11 +34,7 @@ public function onRequest(callable $callback)
3534
$requestContainer->set('swooleRequest', fn () => $request);
3635
$requestContainer->set('swooleResponse', fn () => $response);
3736

38-
if (Coroutine::getCid() !== -1) {
39-
Coroutine::getContext()[self::REQUEST_CONTAINER_CONTEXT_KEY] = $requestContainer;
40-
} else {
41-
$this->requestContainer = $requestContainer;
42-
}
37+
Coroutine::getContext()[self::REQUEST_CONTAINER_CONTEXT_KEY] = $requestContainer;
4338

4439
$utopiaRequest = new Request($request);
4540
$utopiaResponse = new Response($response);
@@ -50,11 +45,12 @@ public function onRequest(callable $callback)
5045

5146
public function getContainer(): Container
5247
{
53-
if (Coroutine::getCid() !== -1) {
54-
return Coroutine::getContext()[self::REQUEST_CONTAINER_CONTEXT_KEY] ?? $this->container;
55-
}
48+
return Coroutine::getContext()[self::REQUEST_CONTAINER_CONTEXT_KEY] ?? $this->container;
49+
}
5650

57-
return $this->requestContainer ?? $this->container;
51+
public function getServer(): SwooleServer
52+
{
53+
return $this->server;
5854
}
5955

6056
public function onStart(callable $callback)

0 commit comments

Comments
 (0)