From 0123fa5420d3005b710c1a820de6f38f9eeebeed Mon Sep 17 00:00:00 2001 From: Michael Dowling Date: Sat, 28 Mar 2015 13:52:39 -0700 Subject: [PATCH] Adding some simple middleware helpers --- src/Middleware.php | 35 ++++++++++++++++++++++++++++++++++- tests/MiddlewareTest.php | 31 +++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 1 deletion(-) diff --git a/src/Middleware.php b/src/Middleware.php index b263c53b..2423f2d8 100644 --- a/src/Middleware.php +++ b/src/Middleware.php @@ -4,7 +4,6 @@ namespace GuzzleHttp; use GuzzleHttp\Cookie\CookieJarInterface; use GuzzleHttp\Exception\ClientException; use GuzzleHttp\Exception\ServerException; -use GuzzleHttp\Promise\RejectedPromise; use GuzzleHttp\Psr7; use Psr\Http\Message\RequestInterface; use Psr\Http\Message\ResponseInterface; @@ -228,4 +227,38 @@ final class Middleware }; }; } + + /** + * Middleware that applies a map function to the request before passing to + * the next handler. + * + * @param callable $fn Function that accepts a RequestInterface and returns + * a RequestInterface. + * @return callable + */ + public static function mapRequest(callable $fn) + { + return function (callable $handler) use ($fn) { + return function ($request, array $options) use ($handler, $fn) { + return $handler($fn($request), $options); + }; + }; + } + + /** + * Middleware that applies a map function to the resolved promise's + * response. + * + * @param callable $fn Function that accepts a ResponseInterface and + * returns a ResponseInterface. + * @return callable + */ + public static function mapResponse(callable $fn) + { + return function (callable $handler) use ($fn) { + return function ($request, array $options) use ($handler, $fn) { + return $handler($request, $options)->then($fn); + }; + }; + } } diff --git a/tests/MiddlewareTest.php b/tests/MiddlewareTest.php index 74d8e2b8..251cbd7e 100644 --- a/tests/MiddlewareTest.php +++ b/tests/MiddlewareTest.php @@ -14,6 +14,7 @@ use GuzzleHttp\Psr7\FnStream; use GuzzleHttp\Psr7\Request; use GuzzleHttp\Psr7\Response; use Psr\Http\Message\RequestInterface; +use Psr\Http\Message\ResponseInterface; class MiddlewareTest extends \PHPUnit_Framework_TestCase { @@ -252,4 +253,34 @@ class MiddlewareTest extends \PHPUnit_Framework_TestCase $response = $p->wait(); $this->assertEquals(200, $response->getStatusCode()); } + + public function testMapsRequest() + { + $h = new MockHandler([ + function (RequestInterface $request, array $options) { + $this->assertEquals('foo', $request->getHeader('Bar')); + return new Response(200); + } + ]); + $stack = new HandlerStack($h); + $stack->push(Middleware::mapRequest(function (RequestInterface $request) { + return $request->withHeader('Bar', 'foo'); + })); + $comp = $stack->resolve(); + $p = $comp(new Request('PUT', 'http://www.google.com'), []); + $this->assertInstanceOf('GuzzleHttp\Promise\FulfilledPromise', $p); + } + + public function testMapsResponse() + { + $h = new MockHandler([new Response(200)]); + $stack = new HandlerStack($h); + $stack->push(Middleware::mapResponse(function (ResponseInterface $response) { + return $response->withHeader('Bar', 'foo'); + })); + $comp = $stack->resolve(); + $p = $comp(new Request('PUT', 'http://www.google.com'), []); + $this->assertInstanceOf('GuzzleHttp\Promise\FulfilledPromise', $p); + $this->assertEquals('foo', $p->wait()->getHeader('Bar')); + } }