diff --git a/inc/http-client/class-cache-strategy.php b/inc/http-client/class-cache-strategy.php index 7b7fb394..5639755f 100644 --- a/inc/http-client/class-cache-strategy.php +++ b/inc/http-client/class-cache-strategy.php @@ -2,18 +2,56 @@ namespace RemoteDataBlocks\HttpClient; -use Kevinrob\GuzzleCache\KeyValueHttpHeader; -use Kevinrob\GuzzleCache\Storage\CacheStorageInterface; use Kevinrob\GuzzleCache\Strategy\GreedyCacheStrategy; +use Psr\Http\Message\RequestInterface; use RemoteDataBlocks\Logging\LoggerManager; class CacheStrategy extends GreedyCacheStrategy { - const HEADER_TTL = 'X-RemoteDataBlocks-TTL'; + const HEADER_TTL = 'X-RemoteDataBlocks-TTL'; + const HEADER_BYPASS_CACHE = 'X-RemoteDataBlocks-Bypass-Cache'; - protected $logger; + private static function getRequestString( RequestInterface $request ) { + $uri = $request->getUri(); + $uri_string = $uri->getScheme() . '://' . $uri->getHost() . $uri->getPath(); + $method = $request->getMethod(); + $body = $request->getBody()->getContents(); + return $method . ' ' . $uri_string . ' ' . $body; + } + + protected function should_bypass_cache( RequestInterface $request ) { + $bypass = $request->getHeader( self::HEADER_BYPASS_CACHE ); + if ( ! empty( $bypass ) ) { + return true; + } + + return false; + } + + public function fetch( RequestInterface $request ) { + $logger = LoggerManager::instance(); + + if ( $this->should_bypass_cache( $request ) ) { + $logger->debug( 'Bypassing cache: ' . self::getRequestString( $request ) ); + return null; + } + + $result = parent::fetch( $request ); + + if ( null === $result ) { + $logger->debug( 'Cache Miss: ' . self::getRequestString( $request ) ); + return null; + } + $logger->debug( 'Cache Hit: ' . self::getRequestString( $request ) ); + return $result; + } - public function __construct( CacheStorageInterface $cache = null, $default_ttl, KeyValueHttpHeader $vary_headers = null ) { - $this->logger = LoggerManager::instance(); - parent::__construct( $cache, $default_ttl, $vary_headers ); + public function cache( RequestInterface $request, $response ) { + $result = parent::cache( $request, $response ); + $logger = LoggerManager::instance(); + if ( false === $result ) { + $logger->debug( 'Did not cache: ' . self::getRequestString( $request ) ); + return false; + } + $logger->debug( 'Cached: ' . self::getRequestString( $request ) ); } }