Skip to content

Commit a06e180

Browse files
committed
Fix logger middleware that did not log errors
1 parent a1e3976 commit a06e180

File tree

3 files changed

+88
-2
lines changed

3 files changed

+88
-2
lines changed

src/Middleware/Log.php

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
use Psr\Log\LogLevel;
3333
use React\Promise\FulfilledPromise;
3434
use React\Promise\PromiseInterface;
35+
use function React\Promise\reject;
3536
use React\Socket\ConnectionInterface;
3637

3738
/**
@@ -42,11 +43,19 @@ class Log
4243

4344
private $logger;
4445
private $level;
46+
private $errorLevel;
4547

46-
public function __construct(LoggerInterface $logger, $level = LogLevel::DEBUG)
48+
/**
49+
* Log constructor.
50+
* @param LoggerInterface $logger
51+
* @param string $level Standard request / response log level
52+
* @param string $errorLevel Errors log level
53+
*/
54+
public function __construct(LoggerInterface $logger, $level = LogLevel::DEBUG, $errorLevel = LogLevel::WARNING)
4755
{
4856
$this->logger = $logger;
4957
$this->level = $level;
58+
$this->errorLevel = $errorLevel;
5059
}
5160

5261
/**
@@ -67,6 +76,13 @@ public function __invoke(Request $request, ConnectionInterface $connection, call
6776
return $response->then(function (Response $resolvedResponse) use ($request) {
6877
$this->logger->log($this->level, "Response:\r\n$resolvedResponse");
6978
return $resolvedResponse;
79+
}, function($reason) {
80+
if ($reason instanceof \Exception) {
81+
$this->logger->log("Internal server error", ['exception' => $reason]);
82+
} else {
83+
$this->logger->log("Unexpected internal server error", ['data' => $reason]);
84+
}
85+
return reject($reason);
7086
});
7187
}
7288
}

tests/Middleware/LogTest.php

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,14 @@
3333
use PhpBg\Rtsp\Tests\ConnectionStub;
3434
use PhpBg\Rtsp\Tests\Mock\EmptyResponseMiddleware;
3535
use PhpBg\Rtsp\Tests\Mock\ParametrizedResponseMiddleware;
36+
use PhpBg\Rtsp\Tests\Mock\RejectMiddleware;
3637
use Psr\Log\LoggerInterface;
3738
use React\Promise\PromiseInterface;
39+
use React\Promise\RejectedPromise;
3840

3941
class LogTest extends MockeryTestCase
4042
{
41-
public function testAddHeader() {
43+
public function testResolved() {
4244
$logger = \Mockery::spy(LoggerInterface::class);
4345
$middleware = new Log($logger);
4446

@@ -55,4 +57,26 @@ public function testAddHeader() {
5557
$this->assertTrue($extractedResponse instanceof Response);
5658
$logger->shouldHaveReceived('log')->twice();
5759
}
60+
61+
public function testRejectedString() {
62+
$logger = \Mockery::spy(LoggerInterface::class);
63+
$middleware = new Log($logger);
64+
$request = new Request();
65+
66+
$response = $middleware($request, new ConnectionStub(), new RejectMiddleware('foo'));
67+
68+
$this->assertTrue($response instanceof RejectedPromise);
69+
$logger->shouldHaveReceived('log')->twice();
70+
}
71+
72+
public function testRejectedException() {
73+
$logger = \Mockery::spy(LoggerInterface::class);
74+
$middleware = new Log($logger);
75+
$request = new Request();
76+
77+
$response = $middleware($request, new ConnectionStub(), new RejectMiddleware(new \Exception('foo')));
78+
79+
$this->assertTrue($response instanceof RejectedPromise);
80+
$logger->shouldHaveReceived('log')->twice();
81+
}
5882
}

tests/Mock/RejectMiddleware.php

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
<?php
2+
3+
/**
4+
* MIT License
5+
*
6+
* Copyright (c) 2018 Samuel CHEMLA
7+
*
8+
* Permission is hereby granted, free of charge, to any person obtaining a copy
9+
* of this software and associated documentation files (the "Software"), to deal
10+
* in the Software without restriction, including without limitation the rights
11+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12+
* copies of the Software, and to permit persons to whom the Software is
13+
* furnished to do so, subject to the following conditions:
14+
*
15+
* The above copyright notice and this permission notice shall be included in all
16+
* copies or substantial portions of the Software.
17+
*
18+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24+
* SOFTWARE.
25+
*/
26+
27+
namespace PhpBg\Rtsp\Tests\Mock;
28+
29+
use PhpBg\Rtsp\Message\Request;
30+
use React\Promise\RejectedPromise;
31+
use React\Socket\ConnectionInterface;
32+
33+
class RejectMiddleware
34+
{
35+
private $rejectValue;
36+
37+
public function __construct($rejectValue)
38+
{
39+
$this->rejectValue = $rejectValue;
40+
}
41+
42+
public function __invoke(Request $request, ConnectionInterface $connection)
43+
{
44+
return new RejectedPromise($this->rejectValue);
45+
}
46+
}

0 commit comments

Comments
 (0)