Skip to content

Commit 5a26423

Browse files
committed
Add ServerRequestFactory
1 parent 742a526 commit 5a26423

File tree

2 files changed

+223
-0
lines changed

2 files changed

+223
-0
lines changed

src/ServerRequestFactory.php

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace HttpSoft\Request;
6+
7+
use HttpSoft\Stream\StreamPhpInput;
8+
use HttpSoft\UploadedFile\UploadedFileNormalizer;
9+
use Psr\Http\Message\ServerRequestFactoryInterface;
10+
use Psr\Http\Message\ServerRequestInterface;
11+
12+
final class ServerRequestFactory implements ServerRequestFactoryInterface
13+
{
14+
/**
15+
* @param ServerNormalizerInterface|null $normalizer
16+
* @return ServerRequestInterface
17+
*/
18+
public static function create(ServerNormalizerInterface $normalizer = null): ServerRequestInterface
19+
{
20+
return self::createFromGlobals(null, null, null, null, null, $normalizer);
21+
}
22+
23+
/**
24+
* @param array|null $server
25+
* @param array|null $files
26+
* @param array|null $cookie
27+
* @param array|null $get
28+
* @param array|null $post
29+
* @param ServerNormalizerInterface|null $normalizer
30+
* @return ServerRequestInterface
31+
*/
32+
public static function createFromGlobals(
33+
array $server = null,
34+
array $files = null,
35+
array $cookie = null,
36+
array $get = null,
37+
array $post = null,
38+
ServerNormalizerInterface $normalizer = null
39+
): ServerRequestInterface {
40+
$server ??= $_SERVER;
41+
$normalizer ??= new SapiNormalizer();
42+
43+
return new ServerRequest(
44+
$server,
45+
UploadedFileNormalizer::normalize($files ?? $_FILES),
46+
$cookie ?? $_COOKIE,
47+
$get ?? $_GET,
48+
$post ?? $_POST,
49+
$normalizer->normalizeMethod($server),
50+
$normalizer->normalizeUri($server),
51+
new StreamPhpInput(),
52+
$normalizer->normalizeHeaders($server),
53+
$normalizer->normalizeProtocolVersion($server)
54+
);
55+
}
56+
57+
/**
58+
* {@inheritDoc}
59+
*/
60+
public function createServerRequest(string $method, $uri, array $serverParams = []): ServerRequestInterface
61+
{
62+
return new ServerRequest($serverParams, [], [], [], null, $method, $uri, 'php://temp');
63+
}
64+
}

tests/ServerRequestFactoryTest.php

Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,159 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace HttpSoft\Tests\Request;
6+
7+
use HttpSoft\Request\SapiNormalizer;
8+
use HttpSoft\Request\ServerRequest;
9+
use HttpSoft\Request\ServerRequestFactory;
10+
use PHPUnit\Framework\TestCase;
11+
use Psr\Http\Message\ServerRequestInterface;
12+
13+
use const UPLOAD_ERR_OK;
14+
15+
class ServerRequestFactoryTest extends TestCase
16+
{
17+
/**
18+
* @var SapiNormalizer
19+
*/
20+
private SapiNormalizer $serverNormalizer;
21+
22+
public function setUp(): void
23+
{
24+
$this->serverNormalizer = new SapiNormalizer();
25+
}
26+
27+
public function testCreate(): void
28+
{
29+
$serverRequest = ServerRequestFactory::create();
30+
self::assertInstanceOf(ServerRequest::class, $serverRequest);
31+
self::assertInstanceOf(ServerRequestInterface::class, $serverRequest);
32+
self::assertNotEmpty($serverRequest->getServerParams());
33+
self::assertEquals([], $serverRequest->getUploadedFiles());
34+
self::assertEquals([], $serverRequest->getCookieParams());
35+
self::assertEquals([], $serverRequest->getQueryParams());
36+
self::assertEquals([], $serverRequest->getParsedBody());
37+
self::assertEquals([], $serverRequest->getAttributes());
38+
self::assertEquals('php://input', $serverRequest->getBody()->getMetadata('uri'));
39+
40+
$serverRequest = ServerRequestFactory::create($this->serverNormalizer);
41+
self::assertInstanceOf(ServerRequest::class, $serverRequest);
42+
self::assertInstanceOf(ServerRequestInterface::class, $serverRequest);
43+
self::assertNotEmpty($serverRequest->getServerParams());
44+
self::assertEquals([], $serverRequest->getUploadedFiles());
45+
self::assertEquals([], $serverRequest->getCookieParams());
46+
self::assertEquals([], $serverRequest->getQueryParams());
47+
self::assertEquals([], $serverRequest->getParsedBody());
48+
self::assertEquals([], $serverRequest->getAttributes());
49+
self::assertEquals('php://input', $serverRequest->getBody()->getMetadata('uri'));
50+
}
51+
52+
public function testCreateFromGlobalsWithDefaultValues(): void
53+
{
54+
$serverRequest = ServerRequestFactory::createFromGlobals();
55+
self::assertInstanceOf(ServerRequest::class, $serverRequest);
56+
self::assertInstanceOf(ServerRequestInterface::class, $serverRequest);
57+
self::assertNotEmpty($serverRequest->getServerParams());
58+
self::assertEquals([], $serverRequest->getUploadedFiles());
59+
self::assertEquals([], $serverRequest->getCookieParams());
60+
self::assertEquals([], $serverRequest->getQueryParams());
61+
self::assertEquals([], $serverRequest->getParsedBody());
62+
self::assertEquals([], $serverRequest->getAttributes());
63+
self::assertEquals('php://input', $serverRequest->getBody()->getMetadata('uri'));
64+
}
65+
66+
public function testCreateFromGlobalsWithProvidedEmptyArrays(): void
67+
{
68+
$serverRequest = ServerRequestFactory::createFromGlobals(
69+
$server = [],
70+
$files = [],
71+
$cookie = [],
72+
$get = [],
73+
$post = [],
74+
$this->serverNormalizer
75+
);
76+
self::assertInstanceOf(ServerRequest::class, $serverRequest);
77+
self::assertInstanceOf(ServerRequestInterface::class, $serverRequest);
78+
self::assertEquals($server, $serverRequest->getServerParams());
79+
self::assertEquals($files, $serverRequest->getUploadedFiles());
80+
self::assertEquals($cookie, $serverRequest->getCookieParams());
81+
self::assertEquals($get, $serverRequest->getQueryParams());
82+
self::assertEquals($post, $serverRequest->getParsedBody());
83+
self::assertEquals([], $serverRequest->getAttributes());
84+
self::assertEquals('php://input', $serverRequest->getBody()->getMetadata('uri'));
85+
}
86+
87+
public function testCreateFromGlobalsWithProvidedNotEmptyArrays(): void
88+
{
89+
$serverRequest = ServerRequestFactory::createFromGlobals(
90+
$server = [
91+
'HTTP_HOST' => 'example.com',
92+
'HTTP_COOKIE' => 'cookie-key=cookie-value',
93+
'CONTENT_TYPE' => 'text/html; charset=UTF-8',
94+
'REQUEST_URI' => '/path?get-key=get-value',
95+
'QUERY_STRING' => 'get-key=get-value',
96+
],
97+
$files = [
98+
'file' => [
99+
'name' => 'file.txt',
100+
'type' => 'text/plain',
101+
'tmp_name' => '/tmp/phpN3FmFr',
102+
'error' => UPLOAD_ERR_OK,
103+
'size' => 1024,
104+
],
105+
],
106+
$cookie = ['cookie-key' => 'cookie-value'],
107+
$get = ['get-key' => 'get-value'],
108+
$post = ['post-key' => 'post-value'],
109+
$this->serverNormalizer
110+
);
111+
self::assertInstanceOf(ServerRequest::class, $serverRequest);
112+
self::assertInstanceOf(ServerRequestInterface::class, $serverRequest);
113+
self::assertEquals($server, $serverRequest->getServerParams());
114+
self::assertEquals($files['file']['name'], $serverRequest->getUploadedFiles()['file']->getClientFilename());
115+
self::assertEquals($cookie, $serverRequest->getCookieParams());
116+
self::assertEquals($get, $serverRequest->getQueryParams());
117+
self::assertEquals($post, $serverRequest->getParsedBody());
118+
self::assertEquals([], $serverRequest->getAttributes());
119+
self::assertEquals('php://input', $serverRequest->getBody()->getMetadata('uri'));
120+
self::assertEquals(
121+
[
122+
'Host' => ['example.com'],
123+
'Cookie' => ['cookie-key=cookie-value'],
124+
'Content-Type' => ['text/html; charset=UTF-8'],
125+
],
126+
$serverRequest->getHeaders()
127+
);
128+
}
129+
130+
public function testCreateServerRequest(): void
131+
{
132+
$factory = new ServerRequestFactory();
133+
134+
$serverRequest = $factory->createServerRequest('GET', 'https://example.com');
135+
self::assertInstanceOf(ServerRequest::class, $serverRequest);
136+
self::assertInstanceOf(ServerRequestInterface::class, $serverRequest);
137+
self::assertEquals([], $serverRequest->getServerParams());
138+
self::assertEquals([], $serverRequest->getUploadedFiles());
139+
self::assertEquals([], $serverRequest->getCookieParams());
140+
self::assertEquals([], $serverRequest->getQueryParams());
141+
self::assertNull($serverRequest->getParsedBody());
142+
self::assertEquals([], $serverRequest->getAttributes());
143+
self::assertEquals('php://temp', $serverRequest->getBody()->getMetadata('uri'));
144+
145+
$serverRequest = $factory->createServerRequest('GET', 'https://example.com', $server = [
146+
'HTTP_HOST' => 'example.com',
147+
'CONTENT_TYPE' => 'text/html; charset=UTF-8',
148+
]);
149+
self::assertInstanceOf(ServerRequest::class, $serverRequest);
150+
self::assertInstanceOf(ServerRequestInterface::class, $serverRequest);
151+
self::assertEquals($server, $serverRequest->getServerParams());
152+
self::assertEquals([], $serverRequest->getUploadedFiles());
153+
self::assertEquals([], $serverRequest->getCookieParams());
154+
self::assertEquals([], $serverRequest->getQueryParams());
155+
self::assertNull($serverRequest->getParsedBody());
156+
self::assertEquals([], $serverRequest->getAttributes());
157+
self::assertEquals('php://temp', $serverRequest->getBody()->getMetadata('uri'));
158+
}
159+
}

0 commit comments

Comments
 (0)