Skip to content

Commit bfa9d46

Browse files
authored
Add HttpAuthenticationMiddleware::setIsSingleUse() (#5)
1 parent ecfec86 commit bfa9d46

File tree

2 files changed

+91
-22
lines changed

2 files changed

+91
-22
lines changed

src/HttpAuthenticationMiddleware.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,24 @@ class HttpAuthenticationMiddleware
1111
*/
1212
private $httpAuthenticationCredentials;
1313

14+
/**
15+
* @var bool
16+
*/
17+
private $isSingleUse = false;
18+
1419
public function __construct()
1520
{
1621
$this->httpAuthenticationCredentials = new HttpAuthenticationCredentials();
1722
}
1823

24+
/**
25+
* @param $isSingleUse
26+
*/
27+
public function setIsSingleUse($isSingleUse)
28+
{
29+
$this->isSingleUse = $isSingleUse;
30+
}
31+
1932
/**
2033
* @param HttpAuthenticationCredentials $httpAuthenticationCredentials
2134
*/
@@ -34,6 +47,11 @@ public function __invoke(callable $handler)
3447
return function (RequestInterface $request, array $options) use (&$handler) {
3548
$httpAuthenticationHeader = new HttpAuthenticationHeader($this->httpAuthenticationCredentials);
3649

50+
if ($this->isSingleUse) {
51+
$this->httpAuthenticationCredentials = new HttpAuthenticationCredentials();
52+
$this->isSingleUse = false;
53+
}
54+
3755
if (!$httpAuthenticationHeader->isValidForRequest($request)) {
3856
return $handler($request, $options);
3957
}

tests/HttpAuthenticationMiddlewareTest.php

Lines changed: 73 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace webignition\Guzzle\Middleware\HttpAuthentication\Tests;
44

5+
use Mockery\MockInterface;
56
use Psr\Http\Message\RequestInterface;
67
use webignition\Guzzle\Middleware\HttpAuthentication\HttpAuthenticationCredentials;
78
use webignition\Guzzle\Middleware\HttpAuthentication\HttpAuthenticationHeader;
@@ -41,12 +42,7 @@ function ($returnedRequest, $returnedOptions) use ($request, $options) {
4142

4243
public function testInvokeCredentialsInvalidForRequest()
4344
{
44-
$request = \Mockery::mock(RequestInterface::class);
45-
46-
$request
47-
->shouldReceive('getHeaderLine')
48-
->with('host')
49-
->andReturn('example.com');
45+
$request = $this->createOriginalRequest();
5046
$options = [];
5147

5248
$credentials = new HttpAuthenticationCredentials('username', 'password', 'example.org');
@@ -62,34 +58,89 @@ function ($returnedRequest, $returnedOptions) use ($request, $options) {
6258
$returnedFunction($request, $options);
6359
}
6460

65-
public function testInvokeCredentialsValidForRequest()
61+
public function testInvokeValidCredentialsAppliedToAllRequests()
6662
{
67-
$modifiedRequest = \Mockery::mock(RequestInterface::class);
68-
69-
$request = \Mockery::mock(RequestInterface::class);
63+
$credentials = new HttpAuthenticationCredentials('username', 'password', 'example.com');
64+
$this->httpAuthenticationMiddleware->setHttpAuthenticationCredentials($credentials);
7065

71-
$request
72-
->shouldReceive('getHeaderLine')
73-
->with('host')
74-
->andReturn('example.com');
66+
$requestCount = 3;
7567

76-
$request
68+
$modifiedRequest = \Mockery::mock(RequestInterface::class);
69+
$originalRequest = $this->createOriginalRequest();
70+
$originalRequest
7771
->shouldReceive('withHeader')
7872
->with(HttpAuthenticationHeader::NAME, 'Basic dXNlcm5hbWU6cGFzc3dvcmQ=')
7973
->andReturn($modifiedRequest);
8074

81-
$options = [];
75+
for ($requestIndex = 0; $requestIndex < $requestCount; $requestIndex++) {
76+
$options = [];
77+
78+
$returnedFunction = $this->httpAuthenticationMiddleware->__invoke(
79+
function ($returnedRequest, $returnedOptions) use ($modifiedRequest, $options) {
80+
$this->assertEquals($modifiedRequest, $returnedRequest);
81+
$this->assertEquals($options, $returnedOptions);
82+
}
83+
);
8284

85+
$returnedFunction($originalRequest, $options);
86+
}
87+
}
88+
89+
public function testInvokeValidCredentialsAppliedToFirstRequestOnly()
90+
{
8391
$credentials = new HttpAuthenticationCredentials('username', 'password', 'example.com');
8492
$this->httpAuthenticationMiddleware->setHttpAuthenticationCredentials($credentials);
93+
$this->httpAuthenticationMiddleware->setIsSingleUse(true);
8594

86-
$returnedFunction = $this->httpAuthenticationMiddleware->__invoke(
87-
function ($returnedRequest, $returnedOptions) use ($modifiedRequest, $options) {
88-
$this->assertEquals($modifiedRequest, $returnedRequest);
89-
$this->assertEquals($options, $returnedOptions);
95+
$requestCount = 3;
96+
$modifiedRequest = \Mockery::mock(RequestInterface::class);
97+
$originalRequest = $this->createOriginalRequest();
98+
99+
for ($requestIndex = 0; $requestIndex < $requestCount; $requestIndex++) {
100+
if ($requestIndex === 0) {
101+
$originalRequest
102+
->shouldReceive('withHeader')
103+
->with(HttpAuthenticationHeader::NAME, 'Basic dXNlcm5hbWU6cGFzc3dvcmQ=')
104+
->andReturn($modifiedRequest);
90105
}
91-
);
92106

93-
$returnedFunction($request, $options);
107+
$options = [];
108+
109+
$returnedFunction = $this->httpAuthenticationMiddleware->__invoke(
110+
function (
111+
$returnedRequest,
112+
$returnedOptions
113+
) use (
114+
$originalRequest,
115+
$modifiedRequest,
116+
$options,
117+
$requestIndex
118+
) {
119+
if ($requestIndex === 0) {
120+
$this->assertEquals($modifiedRequest, $returnedRequest);
121+
} else {
122+
$this->assertEquals($originalRequest, $returnedRequest);
123+
}
124+
125+
$this->assertEquals($options, $returnedOptions);
126+
}
127+
);
128+
129+
$returnedFunction($originalRequest, $options);
130+
}
131+
}
132+
133+
/**
134+
* @return MockInterface|RequestInterface
135+
*/
136+
private function createOriginalRequest()
137+
{
138+
$request = \Mockery::mock(RequestInterface::class);
139+
$request
140+
->shouldReceive('getHeaderLine')
141+
->with('host')
142+
->andReturn('example.com');
143+
144+
return $request;
94145
}
95146
}

0 commit comments

Comments
 (0)