diff --git a/spec/Cache/Generator/HeaderCacheKeyGeneratorSpec.php b/spec/Cache/Generator/HeaderCacheKeyGeneratorSpec.php new file mode 100644 index 0000000..de20cad --- /dev/null +++ b/spec/Cache/Generator/HeaderCacheKeyGeneratorSpec.php @@ -0,0 +1,37 @@ +beConstructedWith(['Authorization', 'Content-Type']); + } + + public function it_is_initializable() + { + $this->shouldHaveType('Http\Client\Common\Plugin\Cache\Generator\HeaderCacheKeyGenerator'); + } + + public function it_is_a_key_generator() + { + $this->shouldImplement('Http\Client\Common\Plugin\Cache\Generator\CacheKeyGenerator'); + } + + public function it_generates_cache_from_request(RequestInterface $request, StreamInterface $body) + { + $request->getMethod()->shouldBeCalled()->willReturn('GET'); + $request->getUri()->shouldBeCalled()->willReturn('http://example.com/foo'); + $request->getHeaderLine('Authorization')->shouldBeCalled()->willReturn('bar'); + $request->getHeaderLine('Content-Type')->shouldBeCalled()->willReturn('application/baz'); + $request->getBody()->shouldBeCalled()->willReturn($body); + $body->__toString()->shouldBeCalled()->willReturn(''); + + $this->generate($request)->shouldReturn('GET http://example.com/foo Authorization:"bar" Content-Type:"application/baz" '); + } +} diff --git a/src/Cache/Generator/HeaderCacheKeyGenerator.php b/src/Cache/Generator/HeaderCacheKeyGenerator.php new file mode 100644 index 0000000..562ed48 --- /dev/null +++ b/src/Cache/Generator/HeaderCacheKeyGenerator.php @@ -0,0 +1,38 @@ + + */ +class HeaderCacheKeyGenerator implements CacheKeyGenerator +{ + /** + * The header names we should take into account when creating the cache key. + * + * @var array + */ + private $headerNames; + + /** + * @param $headerNames + */ + public function __construct(array $headerNames) + { + $this->headerNames = $headerNames; + } + + public function generate(RequestInterface $request) + { + $concatenatedHeaders = []; + foreach ($this->headerNames as $headerName) { + $concatenatedHeaders[] = sprintf(' %s:"%s"', $headerName, $request->getHeaderLine($headerName)); + } + + return $request->getMethod().' '.$request->getUri().implode('', $concatenatedHeaders).' '.$request->getBody(); + } +}