-
-
Notifications
You must be signed in to change notification settings - Fork 58
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Leverage
Request::getPayload()
to populate the parsed body of PSR-7…
… requests
- Loading branch information
1 parent
28a732c
commit 3a8caad
Showing
2 changed files
with
68 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -18,6 +18,7 @@ | |
use Psr\Http\Message\UploadedFileInterface; | ||
use Symfony\Bridge\PsrHttpMessage\HttpMessageFactoryInterface; | ||
use Symfony\Component\HttpFoundation\BinaryFileResponse; | ||
use Symfony\Component\HttpFoundation\Exception\JsonException; | ||
use Symfony\Component\HttpFoundation\File\UploadedFile; | ||
use Symfony\Component\HttpFoundation\Request; | ||
use Symfony\Component\HttpFoundation\Response; | ||
|
@@ -27,6 +28,7 @@ | |
* Builds Psr\HttpMessage instances using a PSR-17 implementation. | ||
* | ||
* @author Antonio J. García Lagar <[email protected]> | ||
* @author Aurélien Pillevesse <[email protected]> | ||
*/ | ||
class PsrHttpFactory implements HttpMessageFactoryInterface | ||
{ | ||
|
@@ -67,12 +69,28 @@ public function createRequest(Request $symfonyRequest) | |
|
||
$body = $this->streamFactory->createStreamFromResource($symfonyRequest->getContent(true)); | ||
|
||
if (method_exists(Request::class, 'getContentTypeFormat')) { | ||
$format = $symfonyRequest->getContentTypeFormat(); | ||
} else { | ||
$format = $symfonyRequest->getContentType(); | ||
} | ||
|
||
if (method_exists(Request::class, 'getPayload') && 'json' === $format) { | ||
try { | ||
$parsedBody = $symfonyRequest->getPayload()->all(); | ||
} catch (JsonException $e) { | ||
$parsedBody = []; | ||
} | ||
} else { | ||
$parsedBody = $symfonyRequest->request->all(); | ||
} | ||
|
||
$request = $request | ||
->withBody($body) | ||
->withUploadedFiles($this->getFiles($symfonyRequest->files->all())) | ||
->withCookieParams($symfonyRequest->cookies->all()) | ||
->withQueryParams($symfonyRequest->query->all()) | ||
->withParsedBody($symfonyRequest->request->all()) | ||
->withParsedBody($parsedBody) | ||
; | ||
|
||
foreach ($symfonyRequest->attributes->all() as $key => $value) { | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -25,6 +25,7 @@ | |
/** | ||
* @author Kévin Dunglas <[email protected]> | ||
* @author Antonio J. García Lagar <[email protected]> | ||
* @author Aurélien Pillevesse <[email protected]> | ||
*/ | ||
class PsrHttpFactoryTest extends TestCase | ||
{ | ||
|
@@ -243,4 +244,52 @@ public function testUploadErrNoFile() | |
$this->assertSame(\UPLOAD_ERR_NO_FILE, $uploadedFiles['f1']->getError()); | ||
$this->assertSame(\UPLOAD_ERR_NO_FILE, $uploadedFiles['f2']->getError()); | ||
} | ||
|
||
public function testJsonContent() | ||
{ | ||
if (!method_exists(Request::class, 'getPayload')) { | ||
$this->markTestSkipped(); | ||
} | ||
|
||
$headers = [ | ||
'HTTP_HOST' => 'http_host.fr', | ||
'CONTENT_TYPE' => 'application/json', | ||
]; | ||
$request = new Request([], [], [], [], [], $headers, '{"city":"Paris","country":"France"}'); | ||
$psrRequest = $this->factory->createRequest($request); | ||
|
||
$this->assertSame(['city' => 'Paris', 'country' => 'France'], $psrRequest->getParsedBody()); | ||
} | ||
|
||
public function testEmptyJsonContent() | ||
{ | ||
if (!method_exists(Request::class, 'getPayload')) { | ||
$this->markTestSkipped(); | ||
} | ||
|
||
$headers = [ | ||
'HTTP_HOST' => 'http_host.fr', | ||
'CONTENT_TYPE' => 'application/json', | ||
]; | ||
$request = new Request([], [], [], [], [], $headers, '{}'); | ||
$psrRequest = $this->factory->createRequest($request); | ||
|
||
$this->assertSame([], $psrRequest->getParsedBody()); | ||
} | ||
|
||
public function testWrongJsonContent() | ||
{ | ||
if (!method_exists(Request::class, 'getPayload')) { | ||
$this->markTestSkipped(); | ||
} | ||
|
||
$headers = [ | ||
'HTTP_HOST' => 'http_host.fr', | ||
'CONTENT_TYPE' => 'application/json', | ||
]; | ||
$request = new Request([], [], [], [], [], $headers, '{"city":"Paris"'); | ||
$psrRequest = $this->factory->createRequest($request); | ||
|
||
$this->assertSame([], $psrRequest->getParsedBody()); | ||
} | ||
} |