diff --git a/src/HttpAuthenticationMiddleware.php b/src/HttpAuthenticationMiddleware.php index 96a4fec..c385fb8 100644 --- a/src/HttpAuthenticationMiddleware.php +++ b/src/HttpAuthenticationMiddleware.php @@ -11,11 +11,24 @@ class HttpAuthenticationMiddleware */ private $httpAuthenticationCredentials; + /** + * @var bool + */ + private $isSingleUse = false; + public function __construct() { $this->httpAuthenticationCredentials = new HttpAuthenticationCredentials(); } + /** + * @param $isSingleUse + */ + public function setIsSingleUse($isSingleUse) + { + $this->isSingleUse = $isSingleUse; + } + /** * @param HttpAuthenticationCredentials $httpAuthenticationCredentials */ @@ -34,6 +47,11 @@ public function __invoke(callable $handler) return function (RequestInterface $request, array $options) use (&$handler) { $httpAuthenticationHeader = new HttpAuthenticationHeader($this->httpAuthenticationCredentials); + if ($this->isSingleUse) { + $this->httpAuthenticationCredentials = new HttpAuthenticationCredentials(); + $this->isSingleUse = false; + } + if (!$httpAuthenticationHeader->isValidForRequest($request)) { return $handler($request, $options); } diff --git a/tests/HttpAuthenticationMiddlewareTest.php b/tests/HttpAuthenticationMiddlewareTest.php index 7a2efe9..2edc324 100644 --- a/tests/HttpAuthenticationMiddlewareTest.php +++ b/tests/HttpAuthenticationMiddlewareTest.php @@ -2,6 +2,7 @@ namespace webignition\Guzzle\Middleware\HttpAuthentication\Tests; +use Mockery\MockInterface; use Psr\Http\Message\RequestInterface; use webignition\Guzzle\Middleware\HttpAuthentication\HttpAuthenticationCredentials; use webignition\Guzzle\Middleware\HttpAuthentication\HttpAuthenticationHeader; @@ -41,12 +42,7 @@ function ($returnedRequest, $returnedOptions) use ($request, $options) { public function testInvokeCredentialsInvalidForRequest() { - $request = \Mockery::mock(RequestInterface::class); - - $request - ->shouldReceive('getHeaderLine') - ->with('host') - ->andReturn('example.com'); + $request = $this->createOriginalRequest(); $options = []; $credentials = new HttpAuthenticationCredentials('username', 'password', 'example.org'); @@ -62,34 +58,89 @@ function ($returnedRequest, $returnedOptions) use ($request, $options) { $returnedFunction($request, $options); } - public function testInvokeCredentialsValidForRequest() + public function testInvokeValidCredentialsAppliedToAllRequests() { - $modifiedRequest = \Mockery::mock(RequestInterface::class); - - $request = \Mockery::mock(RequestInterface::class); + $credentials = new HttpAuthenticationCredentials('username', 'password', 'example.com'); + $this->httpAuthenticationMiddleware->setHttpAuthenticationCredentials($credentials); - $request - ->shouldReceive('getHeaderLine') - ->with('host') - ->andReturn('example.com'); + $requestCount = 3; - $request + $modifiedRequest = \Mockery::mock(RequestInterface::class); + $originalRequest = $this->createOriginalRequest(); + $originalRequest ->shouldReceive('withHeader') ->with(HttpAuthenticationHeader::NAME, 'Basic dXNlcm5hbWU6cGFzc3dvcmQ=') ->andReturn($modifiedRequest); - $options = []; + for ($requestIndex = 0; $requestIndex < $requestCount; $requestIndex++) { + $options = []; + + $returnedFunction = $this->httpAuthenticationMiddleware->__invoke( + function ($returnedRequest, $returnedOptions) use ($modifiedRequest, $options) { + $this->assertEquals($modifiedRequest, $returnedRequest); + $this->assertEquals($options, $returnedOptions); + } + ); + $returnedFunction($originalRequest, $options); + } + } + + public function testInvokeValidCredentialsAppliedToFirstRequestOnly() + { $credentials = new HttpAuthenticationCredentials('username', 'password', 'example.com'); $this->httpAuthenticationMiddleware->setHttpAuthenticationCredentials($credentials); + $this->httpAuthenticationMiddleware->setIsSingleUse(true); - $returnedFunction = $this->httpAuthenticationMiddleware->__invoke( - function ($returnedRequest, $returnedOptions) use ($modifiedRequest, $options) { - $this->assertEquals($modifiedRequest, $returnedRequest); - $this->assertEquals($options, $returnedOptions); + $requestCount = 3; + $modifiedRequest = \Mockery::mock(RequestInterface::class); + $originalRequest = $this->createOriginalRequest(); + + for ($requestIndex = 0; $requestIndex < $requestCount; $requestIndex++) { + if ($requestIndex === 0) { + $originalRequest + ->shouldReceive('withHeader') + ->with(HttpAuthenticationHeader::NAME, 'Basic dXNlcm5hbWU6cGFzc3dvcmQ=') + ->andReturn($modifiedRequest); } - ); - $returnedFunction($request, $options); + $options = []; + + $returnedFunction = $this->httpAuthenticationMiddleware->__invoke( + function ( + $returnedRequest, + $returnedOptions + ) use ( + $originalRequest, + $modifiedRequest, + $options, + $requestIndex + ) { + if ($requestIndex === 0) { + $this->assertEquals($modifiedRequest, $returnedRequest); + } else { + $this->assertEquals($originalRequest, $returnedRequest); + } + + $this->assertEquals($options, $returnedOptions); + } + ); + + $returnedFunction($originalRequest, $options); + } + } + + /** + * @return MockInterface|RequestInterface + */ + private function createOriginalRequest() + { + $request = \Mockery::mock(RequestInterface::class); + $request + ->shouldReceive('getHeaderLine') + ->with('host') + ->andReturn('example.com'); + + return $request; } }