Skip to content

Commit a35492f

Browse files
committed
Init
1 parent 12d7403 commit a35492f

9 files changed

+252
-0
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
/vendor/
2+
composer.lock

.travis.yml

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
language: php
2+
3+
matrix:
4+
fast_finish: true
5+
include:
6+
- php: 5.5
7+
- php: 5.6
8+
- php: 7
9+
- php: hhvm
10+
allow_failures:
11+
- php: 7
12+
- php: hhvm
13+
14+
install:
15+
- travis_retry composer install --no-interaction --ignore-platform-reqs --prefer-source
16+
- composer info -i
17+
18+
script:
19+
- ./vendor/bin/phpunit

composer.json

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
{
2+
"name": "php-middleware/log-http-messages",
3+
"description": "Request and response middleware logger with PSR-7 and PSR-3",
4+
"type": "library",
5+
"keywords": [
6+
"debug",
7+
"middleware",
8+
"psr",
9+
"psr-7",
10+
"log",
11+
"logger",
12+
"psr-3"
13+
],
14+
"require": {
15+
"php": ">=5.5",
16+
"psr/log": "^1.0.0",
17+
"psr/http-message": "^1.0",
18+
"zendframework/zend-diactoros": "^1.1.3"
19+
},
20+
"require-dev": {
21+
"phpunit/phpunit": "^4.8.6"
22+
},
23+
"autoload": {
24+
"psr-4": {
25+
"PhpMiddleware\\LogHttpMessages\\": "src/"
26+
}
27+
},
28+
"autoload-dev": {
29+
"psr-4": {
30+
"PhpMiddlewareTest\\LogHttpMessages\\": "test/"
31+
}
32+
}
33+
}

phpunit.xml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
3+
<phpunit bootstrap="./vendor/autoload.php" colors="true">
4+
<testsuites>
5+
<testsuite name="PhpMiddleware\\LogHttpMessages Tests">
6+
<directory>./test</directory>
7+
</testsuite>
8+
</testsuites>
9+
10+
<filter>
11+
<whitelist processUncoveredFilesFromWhitelist="true">
12+
<directory suffix=".php">./src</directory>
13+
</whitelist>
14+
</filter>
15+
</phpunit>

src/AbstractLogMiddleware.php

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
<?php
2+
3+
namespace PhpMiddleware\LogHttpMessages;
4+
5+
use Psr\Http\Message\ResponseInterface;
6+
use Psr\Http\Message\ServerRequestInterface;
7+
use Psr\Log\LoggerInterface;
8+
use Psr\Log\LogLevel;
9+
10+
abstract class AbstractLogMiddleware
11+
{
12+
/**
13+
* @var LoggerInterface
14+
*/
15+
protected $logger;
16+
17+
/**
18+
* @var int
19+
*/
20+
protected $level;
21+
22+
/**
23+
* @param LoggerInterface $logger
24+
* @param int $level
25+
*/
26+
public function __construct(LoggerInterface $logger, $level = LogLevel::INFO)
27+
{
28+
$this->logger = $logger;
29+
$this->level = $level;
30+
}
31+
32+
/**
33+
* @param ServerRequestInterface $request
34+
* @param ResponseInterface $response
35+
* @param callable $out
36+
*
37+
* @return ResponseInterface
38+
*/
39+
final public function __invoke(ServerRequestInterface $request, ResponseInterface $response, callable $out = null)
40+
{
41+
$outResponse = $out($request, $response);
42+
43+
$contentToLog = $this->getContentToLog($request, $outResponse);
44+
45+
$this->logger->log($this->level, $contentToLog);
46+
47+
return $outResponse;
48+
}
49+
50+
/**
51+
* @param ServerRequestInterface $request
52+
* @param ResponseInterface $response
53+
*
54+
* @return mixed
55+
*/
56+
abstract protected function getContentToLog(ServerRequestInterface $request, ResponseInterface $response);
57+
}

src/LogRequestMiddleware.php

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
3+
namespace PhpMiddleware\LogHttpMessages;
4+
5+
use Psr\Http\Message\ResponseInterface;
6+
use Psr\Http\Message\ServerRequestInterface;
7+
use Zend\Diactoros\Request\Serializer;
8+
9+
class LogRequestMiddleware extends AbstractLogMiddleware
10+
{
11+
/**
12+
* @param ServerRequestInterface $request
13+
* @param ResponseInterface $response
14+
*
15+
* @return mixed
16+
*/
17+
protected function getContentToLog(ServerRequestInterface $request, ResponseInterface $response)
18+
{
19+
return Serializer::toString($request);
20+
}
21+
}

src/LogResponseMiddleware.php

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
3+
namespace PhpMiddleware\LogHttpMessages;
4+
5+
use Psr\Http\Message\ResponseInterface;
6+
use Psr\Http\Message\ServerRequestInterface;
7+
use Zend\Diactoros\Response\Serializer;
8+
9+
class LogResponseMiddleware extends AbstractLogMiddleware
10+
{
11+
/**
12+
* @param ServerRequestInterface $request
13+
* @param ResponseInterface $response
14+
*
15+
* @return mixed
16+
*/
17+
protected function getContentToLog(ServerRequestInterface $request, ResponseInterface $response)
18+
{
19+
return Serializer::toString($response);
20+
}
21+
}

test/LogRequestMiddlewareTest.php

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?php
2+
3+
namespace PhpMiddlewareTest\LogHttpMessages;
4+
5+
use PhpMiddleware\LogHttpMessages\LogRequestMiddleware;
6+
use Psr\Log\LoggerInterface;
7+
use Psr\Log\LogLevel;
8+
use Zend\Diactoros\Response;
9+
use Zend\Diactoros\ServerRequest;
10+
11+
class LogRequestMiddlewareTest extends \PHPUnit_Framework_TestCase
12+
{
13+
protected $logger;
14+
protected $middleware;
15+
16+
protected function setUp()
17+
{
18+
$this->logger = $this->getMockForAbstractClass(LoggerInterface::class);
19+
$this->middleware = new LogRequestMiddleware($this->logger);
20+
}
21+
22+
public function testLogRequest()
23+
{
24+
$request = new ServerRequest([], [], 'https://github.com/php-middleware/log-http-messages', 'GET', 'php://input', ['Accept' => 'text/html']);
25+
$response = new Response();
26+
$calledOut = false;
27+
$outFunction = function ($request, $response) use (&$calledOut) {
28+
$calledOut = true;
29+
return $response;
30+
};
31+
32+
$this->logger->expects($this->once())->method('log')->willReturnCallback(function ($level, $content) {
33+
$this->assertEquals(LogLevel::INFO, $level);
34+
$this->assertSame("GET /php-middleware/log-http-messages HTTP/1.1\r\nAccept: text/html", $content);
35+
});
36+
37+
$result = call_user_func($this->middleware, $request, $response, $outFunction);
38+
39+
$this->assertTrue($calledOut, 'Out is not called');
40+
$this->assertSame($response, $result);
41+
}
42+
}

test/LogResponseMiddlewareTest.php

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?php
2+
3+
namespace PhpMiddlewareTest\LogHttpMessages;
4+
5+
use PhpMiddleware\LogHttpMessages\LogResponseMiddleware;
6+
use Psr\Log\LoggerInterface;
7+
use Psr\Log\LogLevel;
8+
use Zend\Diactoros\Response;
9+
use Zend\Diactoros\ServerRequest;
10+
11+
class LogResponseMiddlewareTest extends \PHPUnit_Framework_TestCase
12+
{
13+
protected $logger;
14+
protected $middleware;
15+
16+
protected function setUp()
17+
{
18+
$this->logger = $this->getMockForAbstractClass(LoggerInterface::class);
19+
$this->middleware = new LogResponseMiddleware($this->logger);
20+
}
21+
22+
public function testLogResponse()
23+
{
24+
$request = new ServerRequest();
25+
$response = new Response('php://memory', 500, ['Content-Type' => 'text/html']);
26+
$calledOut = false;
27+
$outFunction = function ($request, $response) use (&$calledOut) {
28+
$calledOut = true;
29+
return $response;
30+
};
31+
32+
$this->logger->expects($this->once())->method('log')->willReturnCallback(function ($level, $content) {
33+
$this->assertEquals(LogLevel::INFO, $level);
34+
$this->assertSame("HTTP/1.1 500 Internal Server Error\r\nContent-Type: text/html", $content);
35+
});
36+
37+
$result = call_user_func($this->middleware, $request, $response, $outFunction);
38+
39+
$this->assertTrue($calledOut, 'Out is not called');
40+
$this->assertSame($response, $result);
41+
}
42+
}

0 commit comments

Comments
 (0)