Skip to content

Commit

Permalink
Fix Json renderer that was not checking for errors
Browse files Browse the repository at this point in the history
  • Loading branch information
phpbg committed Mar 17, 2019
1 parent 91d7ad3 commit f6c5796
Show file tree
Hide file tree
Showing 4 changed files with 103 additions and 3 deletions.
1 change: 1 addition & 0 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
"require": {
"php": ">=7.0",
"ext-zlib": "*",
"ext-json": "*",
"react/http": "0.8.4",
"zendframework/zend-validator": "^2.10",
"zendframework/zend-filter": "^2.8",
Expand Down
5 changes: 3 additions & 2 deletions composer.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 10 additions & 1 deletion src/Renderer/Json.php
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,16 @@ class Json implements RendererInterface
public function render(ServerRequestInterface $request, ResponseInterface $response, array $options, $data): ResponseInterface
{
$response = $response->withHeader('Content-Type', 'application/json');
$response = $response->withBody(stream_for(json_encode($data)));
$dataStr = json_encode($data);
if ($dataStr === false) {
// Check for JSON error
$err = json_last_error();
if ($err !== JSON_ERROR_NONE) {
$response = $response->withStatus(500);
$dataStr = "Error {$err}: " . json_last_error_msg();
}
}
$response = $response->withBody(stream_for($dataStr));
return $response;
}

Expand Down
89 changes: 89 additions & 0 deletions tests/Renderer/JsonTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
<?php

/**
* MIT License
*
* Copyright (c) 2018 Samuel CHEMLA
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/

namespace PhpBg\MiniHttpd\Tests\Renderer;

use GuzzleHttp\Psr7\Response;
use GuzzleHttp\Psr7\ServerRequest;
use PhpBg\MiniHttpd\HttpException\NotFoundException;
use PhpBg\MiniHttpd\Renderer\Json;
use PHPUnit\Framework\TestCase;

class JsonTest extends TestCase
{
public function testRenderOK()
{
$renderer = new Json();
$request = new ServerRequest('GET', '/');
$response = new Response();
$data = ['foo' => 'bar'];

$response = $renderer->render($request, $response, [], $data);

$this->assertSame(200, $response->getStatusCode());
$this->assertSame(json_encode($data), $response->getBody()->getContents());
$this->assertSame('application/json', $response->getHeaderLine('Content-Type'));
}

public function testRenderKO()
{
$renderer = new Json();
$request = new ServerRequest('GET', '/');
$response = new Response();
$data = ['foo' => log(0)];

$response = $renderer->render($request, $response, [], $data);

$this->assertSame(500, $response->getStatusCode());
$msg = $response->getBody()->getContents();
$this->assertNotEmpty($msg);
$this->assertSame(0, strpos($msg, "Error"));
}

public function testRenderHttpException()
{
$renderer = new Json();
$request = new ServerRequest('GET', '/');
$response = new Response();
$exception = new NotFoundException();

$response = $renderer->renderException($request, $response, [], $exception);

$this->assertSame(404, $response->getStatusCode());
}

public function testRenderException()
{
$renderer = new Json();
$request = new ServerRequest('GET', '/');
$response = new Response();
$exception = new \Exception();

$response = $renderer->renderException($request, $response, [], $exception);

$this->assertSame(500, $response->getStatusCode());
}
}

0 comments on commit f6c5796

Please sign in to comment.