Skip to content

Commit b67dd1b

Browse files
committed
CachedClient: isolate responses from cache
Clone cached response to shield the instance in cache.
1 parent 4e61e27 commit b67dd1b

2 files changed

Lines changed: 33 additions & 0 deletions

File tree

src/Github/Http/CachedClient.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ public function request(Request $request)
7474
}
7575

7676
if (isset($cached) && $response->getCode() === Response::S304_NOT_MODIFIED) {
77+
$cached = clone $cached;
78+
7779
/** @todo Should be responses somehow combined into one? */
7880
$response = $cached->setPrevious($response);
7981
}

tests/Github/Http/CachedClient.phpt

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,37 @@ class CachingTestCase extends Tester\TestCase
159159
Assert::same(304, $response->getPrevious()->getCode());
160160
}
161161

162+
163+
public function testRepeatedRequest()
164+
{
165+
$this->innerClient->onRequest = function (Milo\Github\Http\Request $request) {
166+
if ($request->hasHeader('If-None-Match')) {
167+
return new Milo\Github\Http\Response(304, [], 'inner-304');
168+
}
169+
170+
return new Milo\Github\Http\Response(200, ['ETag' => '"test"'], 'inner-200');
171+
};
172+
173+
$request = new Milo\Github\Http\Request('', '');
174+
175+
# Empty cache
176+
$response = $this->client->request($request);
177+
Assert::same('inner-200', $response->getContent());
178+
Assert::null($response->getPrevious());
179+
180+
# From cache
181+
$response = $this->client->request($request);
182+
Assert::same('inner-200', $response->getContent());
183+
Assert::type('Milo\Github\Http\Response', $response->getPrevious());
184+
Assert::same('inner-304', $response->getPrevious()->getContent());
185+
186+
# Again
187+
$response = $this->client->request($request);
188+
Assert::same('inner-200', $response->getContent());
189+
Assert::type('Milo\Github\Http\Response', $response->getPrevious());
190+
Assert::same('inner-304', $response->getPrevious()->getContent());
191+
}
192+
162193
}
163194

164195
(new CachingTestCase)->run();

0 commit comments

Comments
 (0)