Browse Source

Allow request bodies to be transformed.

This is useful for API based applications.
Mark Story 9 years ago
parent
commit
93a8836cf1
2 changed files with 25 additions and 0 deletions
  1. 7 0
      src/Http/RequestTransformer.php
  2. 18 0
      tests/TestCase/Http/RequestTransformerTest.php

+ 7 - 0
src/Http/RequestTransformer.php

@@ -48,6 +48,12 @@ class RequestTransformer
             $post = Hash::merge($post, $files);
         }
 
+        $input = null;
+        $stream = $request->getBody();
+        if ($stream->getSize()) {
+            $input = $stream->getContents();
+        }
+
         return new CakeRequest([
             'query' => $request->getQueryParams(),
             'post' => $post,
@@ -58,6 +64,7 @@ class RequestTransformer
             'base' => $request->getAttribute('base', ''),
             'webroot' => $request->getAttribute('webroot', '/'),
             'session' => $request->getAttribute('session', null),
+            'input' => $input,
         ]);
     }
 

+ 18 - 0
tests/TestCase/Http/RequestTransformerTest.php

@@ -20,6 +20,7 @@ use Cake\Http\ServerRequestFactory;
 use Cake\Network\Request;
 use Cake\Network\Session;
 use Cake\TestSuite\TestCase;
+use Zend\Diactoros\Stream;
 
 /**
  * Test for RequestTransformer
@@ -276,4 +277,21 @@ class RequestTransformerTest extends TestCase
 
         $this->assertSame($session, $cake->session());
     }
+
+    /**
+     * Test transforming request bodies
+     *
+     * @return void
+     */
+    public function testToCakeRequestBody()
+    {
+        $psr = ServerRequestFactory::fromGlobals();
+        $stream = new Stream('php://memory', 'rw');
+        $stream->write('{"hello":"world"}');
+        $stream->rewind();
+        $psr = $psr->withBody($stream);
+
+        $cake = RequestTransformer::toCake($psr);
+        $this->assertSame(['hello' => 'world'], $cake->input('json_decode', true));
+    }
 }