use GuzzleHttp\Cookie\FileCookieJar as BaseFileCookieJar;
use GuzzleHttp\Cookie\SetCookie;
use GuzzleHttp\Utils;
+use Psr\Log\LoggerInterface;
/**
* Overidden Cookie behavior to:
- * - fix multiple concurrent writes (see https://github.com/guzzle/guzzle/pull/1884)
* - ignore error when the cookie file is malformatted (resulting in clearing it).
*/
class FileCookieJar extends BaseFileCookieJar
{
+ private $logger;
+
/**
- * Saves the cookies to a file.
- *
- * @param string $filename File to save
- *
- * @throws \RuntimeException if the file cannot be found or created
+ * @param LoggerInterface $logger Only used to log info when something goes wrong
+ * @param string $cookieFile File to store the cookie data
*/
- public function save($filename)
+ public function __construct(LoggerInterface $logger, $cookieFile)
{
- $json = [];
- foreach ($this as $cookie) {
- if ($cookie->getExpires() && !$cookie->getDiscard()) {
- $json[] = $cookie->toArray();
- }
- }
+ parent::__construct($cookieFile);
- if (false === file_put_contents($filename, json_encode($json), LOCK_EX)) {
- // @codeCoverageIgnoreStart
- throw new \RuntimeException("Unable to save file {$filename}");
- // @codeCoverageIgnoreEnd
- }
+ $this->logger = $logger;
}
/**
try {
$data = Utils::jsonDecode($json, true);
} catch (\InvalidArgumentException $e) {
+ $this->logger->error('JSON inside the cookie is broken', [
+ 'json' => $json,
+ 'error_msg' => $e->getMessage(),
+ ]);
+
// cookie file is invalid, just ignore the exception and it'll reset the whole cookie file
$data = '';
}