Browse Source

cakephp/http package now provides PSR-17 Http Factories implementation.

ADmad 3 years ago
parent
commit
1f57728e3d

+ 2 - 0
composer.json

@@ -33,6 +33,7 @@
         "league/container": "^4.2",
         "psr/container": "^2.0",
         "psr/http-client": "^1.0",
+        "psr/http-factory": "^1.0",
         "psr/http-server-handler": "^1.0",
         "psr/http-server-middleware": "^1.0",
         "psr/log": "^3.0",
@@ -56,6 +57,7 @@
     },
     "require-dev": {
         "cakephp/cakephp-codesniffer": "^5.0",
+        "http-interop/http-factory-tests": "^0.9.0",
         "mikey179/vfsstream": "^1.6.10",
         "paragonie/csp-builder": "^2.3",
         "phpunit/phpunit": "^9.5.19"

+ 11 - 0
phpunit.xml.dist

@@ -16,6 +16,9 @@
             <directory>tests/TestCase/Database/</directory>
             <directory>tests/TestCase/ORM/</directory>
         </testsuite>
+        <testsuite name="http-interop-http-factory">
+            <directory>./vendor/http-interop/http-factory-tests/test</directory>
+        </testsuite>
     </testsuites>
 
     <extensions>
@@ -55,5 +58,13 @@
         <!-- SQL Server
         <env name="DB_URL" value="sqlserver://localhost/cake_test?timezone=UTC"/>
         -->
+
+        <!-- Fully qualified class names to your classes -->
+        <const name="REQUEST_FACTORY" value="Cake\Http\RequestFactory"/>
+        <const name="RESPONSE_FACTORY" value="Cake\Http\ResponseFactory"/>
+        <const name="SERVER_REQUEST_FACTORY" value="Cake\Http\ServerRequestFactory"/>
+        <const name="STREAM_FACTORY" value="Cake\Http\StreamFactory"/>
+        <const name="UPLOADED_FILE_FACTORY" value="Cake\Http\UploadedFileFactory"/>
+        <const name="URI_FACTORY" value="Cake\Http\UriFactory"/>
     </php>
 </phpunit>

+ 9 - 5
src/Http/ServerRequestFactory.php

@@ -176,11 +176,10 @@ class ServerRequestFactory implements ServerRequestFactoryInterface
         $serverParams['REQUEST_METHOD'] = $method;
         $options = ['environment' => $serverParams];
 
-        if ($uri instanceof UriInterface) {
-            $options['uri'] = $uri;
-        } else {
-            $options['url'] = $uri;
+        if (is_string($uri)) {
+            $uri = (new UriFactory())->createUri($uri);
         }
+        $options['uri'] = $uri;
 
         return new ServerRequest($options);
     }
@@ -288,7 +287,12 @@ class ServerRequestFactory implements ServerRequestFactoryInterface
         }
 
         if (!$baseUrl) {
-            $base = dirname(Hash::get($server, 'PHP_SELF'));
+            $phpSelf = Hash::get($server, 'PHP_SELF');
+            if ($phpSelf === null) {
+                return ['', '/'];
+            }
+
+            $base = dirname(Hash::get($server, 'PHP_SELF', DIRECTORY_SEPARATOR));
             // Clean up additional / which cause following code to fail..
             $base = (string)preg_replace('#/+#', '/', $base);
 

+ 3 - 1
src/Http/composer.json

@@ -29,13 +29,15 @@
         "cakephp/utility": "^5.0",
         "composer/ca-bundle": "^1.2",
         "psr/http-client": "^1.0",
+        "psr/http-factory": "^1.0",
         "psr/http-server-handler": "^1.0",
         "psr/http-server-middleware": "^1.0",
         "laminas/laminas-diactoros": "^2.1",
         "laminas/laminas-httphandlerrunner": "^1.0"
     },
     "provide": {
-        "psr/http-client-implementation": "^1.0"
+        "psr/http-client-implementation": "^1.0",
+        "psr/http-factory-implementation": "^1.0"
     },
     "suggest": {
         "cakephp/cache": "To use cache session storage",

+ 5 - 3
tests/TestCase/Http/ServerRequestFactoryTest.php

@@ -17,6 +17,7 @@ declare(strict_types=1);
 namespace Cake\Test\TestCase\Http;
 
 use Cake\Core\Configure;
+use Cake\Http\ServerRequest;
 use Cake\Http\ServerRequestFactory;
 use Cake\Http\Session;
 use Cake\TestSuite\TestCase;
@@ -1389,11 +1390,12 @@ class ServerRequestFactoryTest extends TestCase
     public function testCreateServerRequest(): void
     {
         $factory = new ServerRequestFactory();
-        $request = $factory->createServerRequest('GET', '/posts', ['foo' => 'bar']);
+        $request = $factory->createServerRequest('GET', 'https://cakephp.org/team', ['foo' => 'bar']);
 
+        $this->assertInstanceOf(ServerRequest::class, $request);
         $this->assertSame('GET', $request->getMethod());
-        $this->assertSame('/posts', $request->getRequestTarget());
-        $expected = ['foo' => 'bar', 'REQUEST_URI' => '/posts', 'REQUEST_METHOD' => 'GET'];
+        $this->assertSame('/team', $request->getRequestTarget());
+        $expected = ['foo' => 'bar', 'REQUEST_METHOD' => 'GET'];
         $this->assertEquals($expected, $request->getServerParams());
     }
 }