Skip to content

Commit 78bf25a

Browse files
authored
Added HostReaderInterface for rpc-multiplex. (#6504)
1 parent 6e649c9 commit 78bf25a

File tree

9 files changed

+80
-9
lines changed

9 files changed

+80
-9
lines changed

src/ConfigProvider.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@
1111
*/
1212
namespace Hyperf\RpcMultiplex;
1313

14+
use Hyperf\RpcMultiplex\Contract\HostReaderInterface;
1415
use Hyperf\RpcMultiplex\Contract\HttpMessageBuilderInterface;
16+
use Hyperf\RpcMultiplex\HttpMessage\HostReader\NullHostReader;
1517
use Hyperf\RpcMultiplex\Listener\RegisterProtocolListener;
1618
use Multiplex\Contract\IdGeneratorInterface;
1719
use Multiplex\Contract\PackerInterface;
@@ -30,6 +32,7 @@ public function __invoke(): array
3032
SerializerInterface::class => StringSerializer::class,
3133
PackerInterface::class => Packer::class,
3234
HttpMessageBuilderInterface::class => HttpMessageBuilder::class,
35+
HostReaderInterface::class => NullHostReader::class,
3336
],
3437
'listeners' => [
3538
RegisterProtocolListener::class,

src/Constant.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ class Constant
2929

3030
public const CONTEXT = 'context';
3131

32+
public const EXTRA = 'extra';
33+
3234
public const ERROR = 'error';
3335

3436
public const CODE = 'code';

src/Contract/HostReaderInterface.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
/**
5+
* This file is part of Hyperf.
6+
*
7+
* @link https://www.hyperf.io
8+
* @document https://hyperf.wiki
9+
* @contact group@hyperf.io
10+
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE
11+
*/
12+
namespace Hyperf\RpcMultiplex\Contract;
13+
14+
use Hyperf\Contract\IPReaderInterface;
15+
16+
interface HostReaderInterface extends IPReaderInterface
17+
{
18+
}

src/Contract/HttpMessageBuilderInterface.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
interface HttpMessageBuilderInterface
1919
{
20-
public function buildRequest(array $data): ServerRequestPlusInterface;
20+
public function buildRequest(array $data, array $config = []): ServerRequestPlusInterface;
2121

2222
public function buildResponse(ServerRequestInterface $request, array $data): ResponsePlusInterface;
2323

src/DataFormatter.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ public function formatRequest(Request $request): array
3636
Constant::ID => $request->getId(),
3737
Constant::PATH => $request->getPath(),
3838
Constant::DATA => $request->getParams(),
39+
Constant::EXTRA => $request->getExtra(),
3940
Constant::CONTEXT => $this->context->getData(),
4041
];
4142
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
/**
5+
* This file is part of Hyperf.
6+
*
7+
* @link https://www.hyperf.io
8+
* @document https://hyperf.wiki
9+
* @contact group@hyperf.io
10+
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE
11+
*/
12+
namespace Hyperf\RpcMultiplex\HttpMessage\HostReader;
13+
14+
use Hyperf\RpcMultiplex\Contract\HostReaderInterface;
15+
16+
class NullHostReader implements HostReaderInterface
17+
{
18+
public function read(): string
19+
{
20+
return 'unknown';
21+
}
22+
}

src/HttpMessageBuilder.php

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
use Hyperf\HttpMessage\Stream\SwooleStream;
2020
use Hyperf\HttpMessage\Uri\Uri;
2121
use Hyperf\Rpc\Context as RpcContext;
22+
use Hyperf\RpcMultiplex\Contract\HostReaderInterface;
2223
use Hyperf\RpcMultiplex\Contract\HttpMessageBuilderInterface;
2324
use Psr\Http\Message\ServerRequestInterface;
2425
use Psr\Http\Message\UriInterface;
@@ -27,23 +28,24 @@
2728

2829
class HttpMessageBuilder implements HttpMessageBuilderInterface
2930
{
30-
public function __construct(protected PackerInterface $packer, protected RpcContext $context)
31+
public function __construct(protected PackerInterface $packer, protected RpcContext $context, protected HostReaderInterface $hostReader)
3132
{
3233
}
3334

34-
public function buildRequest(array $data): ServerRequestPlusInterface
35+
public function buildRequest(array $data, array $config = []): ServerRequestPlusInterface
3536
{
37+
$extra = $data[Constant::EXTRA] ?? [];
3638
$uri = $this->buildUri(
3739
$data[Constant::PATH] ?? '/',
38-
$data[Constant::HOST] ?? 'unknown',
39-
$data[Constant::PORT] ?? 80
40+
$data[Constant::HOST] ?? $this->hostReader->read(),
41+
$data[Constant::PORT] ?? $config['port'] ?? 80
4042
);
4143

4244
$parsedData = $data[Constant::DATA] ?? [];
4345

4446
$this->context->setData($data[Constant::CONTEXT] ?? []);
4547

46-
$request = new Request('POST', $uri, ['Content-Type' => 'application/json'], new SwooleStream(Json::encode($parsedData)));
48+
$request = new Request('POST', $uri, ['Content-Type' => 'application/json', ...$extra], new SwooleStream(Json::encode($parsedData)));
4749

4850
return $request->setParsedBody($parsedData);
4951
}

src/TcpServer.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ protected function buildRequest(int $fd, int $reactorId, string $data): ServerRe
119119
{
120120
$parsed = $this->packer->unpack($data);
121121

122-
$request = $this->messageBuilder->buildRequest($parsed);
122+
$request = $this->messageBuilder->buildRequest($parsed, $this->serverConfig);
123123

124124
return $request->withAttribute('fd', $fd)->withAttribute('request_id', $parsed['id'] ?? null);
125125
}

tests/Cases/HttpMessageBuilderTest.php

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,14 @@
1212
namespace HyperfTest\RpcMultiplex\Cases;
1313

1414
use Hyperf\Rpc\Context;
15+
use Hyperf\RpcMultiplex\Contract\HostReaderInterface;
16+
use Hyperf\RpcMultiplex\HttpMessage\HostReader\NullHostReader;
1517
use Hyperf\RpcMultiplex\HttpMessageBuilder;
1618
use Hyperf\RpcMultiplex\Packer\JsonPacker;
1719
use Hyperf\Support\Reflection\ClassInvoker;
1820
use PHPUnit\Framework\Attributes\CoversNothing;
1921
use Psr\Http\Message\UriInterface;
22+
use Swow\Psr7\Message\ServerRequestPlusInterface;
2023

2124
/**
2225
* @internal
@@ -27,7 +30,7 @@ class HttpMessageBuilderTest extends AbstractTestCase
2730
{
2831
public function testBuildUri()
2932
{
30-
$invoker = new ClassInvoker(new HttpMessageBuilder(new JsonPacker(), new Context()));
33+
$invoker = new ClassInvoker(new HttpMessageBuilder(new JsonPacker(), new Context(), new NullHostReader()));
3134
/** @var UriInterface $uri */
3235
$uri = $invoker->buildUri('/', $host = uniqid(), 8806);
3336
$this->assertSame('http', $uri->getScheme());
@@ -36,9 +39,29 @@ public function testBuildUri()
3639
$this->assertSame(8806, $uri->getPort());
3740
}
3841

42+
public function testBuildRequestWithHostReader()
43+
{
44+
$invoker = new ClassInvoker(new HttpMessageBuilder(new JsonPacker(), new Context(), new class() implements HostReaderInterface {
45+
public function read(): string
46+
{
47+
return 'test_case';
48+
}
49+
}));
50+
/** @var ServerRequestPlusInterface $request */
51+
$request = $invoker->buildRequest(['path' => '/hi', 'extra' => ['from' => 'test']], ['port' => 9502]);
52+
$uri = $request->getUri();
53+
54+
$this->assertSame('http', $uri->getScheme());
55+
$this->assertSame('/hi', $uri->getPath());
56+
$this->assertSame('test_case', $uri->getHost());
57+
$this->assertSame(9502, $uri->getPort());
58+
59+
$this->assertSame('test', $request->getHeaderLine('from'));
60+
}
61+
3962
public function testStoreContext()
4063
{
41-
$builder = new HttpMessageBuilder(new JsonPacker(), $context = new Context());
64+
$builder = new HttpMessageBuilder(new JsonPacker(), $context = new Context(), new NullHostReader());
4265

4366
$request = $builder->buildRequest([
4467
'path' => '/',

0 commit comments

Comments
 (0)