1 <?php 2 3 namespace GuzzleHttp\Cookie; 4 5 use GuzzleHttp\Utils; 6 7 /** 8 * Persists non-session cookies using a JSON formatted file 9 */ 10 class FileCookieJar extends CookieJar 11 { 12 /** 13 * @var string filename 14 */ 15 private $filename; 16 17 /** 18 * @var bool Control whether to persist session cookies or not. 19 */ 20 private $storeSessionCookies; 21 22 /** 23 * Create a new FileCookieJar object 24 * 25 * @param string $cookieFile File to store the cookie data 26 * @param bool $storeSessionCookies Set to true to store session cookies 27 * in the cookie jar. 28 * 29 * @throws \RuntimeException if the file cannot be found or created 30 */ 31 public function __construct(string $cookieFile, bool $storeSessionCookies = false) 32 { 33 parent::__construct(); 34 $this->filename = $cookieFile; 35 $this->storeSessionCookies = $storeSessionCookies; 36 37 if (\file_exists($cookieFile)) { 38 $this->load($cookieFile); 39 } 40 } 41 42 /** 43 * Saves the file when shutting down 44 */ 45 public function __destruct() 46 { 47 $this->save($this->filename); 48 } 49 50 /** 51 * Saves the cookies to a file. 52 * 53 * @param string $filename File to save 54 * 55 * @throws \RuntimeException if the file cannot be found or created 56 */ 57 public function save(string $filename): void 58 { 59 $json = []; 60 /** @var SetCookie $cookie */ 61 foreach ($this as $cookie) { 62 if (CookieJar::shouldPersist($cookie, $this->storeSessionCookies)) { 63 $json[] = $cookie->toArray(); 64 } 65 } 66 67 $jsonStr = Utils::jsonEncode($json); 68 if (false === \file_put_contents($filename, $jsonStr, \LOCK_EX)) { 69 throw new \RuntimeException("Unable to save file {$filename}"); 70 } 71 } 72 73 /** 74 * Load cookies from a JSON formatted file. 75 * 76 * Old cookies are kept unless overwritten by newly loaded ones. 77 * 78 * @param string $filename Cookie file to load. 79 * 80 * @throws \RuntimeException if the file cannot be loaded. 81 */ 82 public function load(string $filename): void 83 { 84 $json = \file_get_contents($filename); 85 if (false === $json) { 86 throw new \RuntimeException("Unable to load file {$filename}"); 87 } 88 if ($json === '') { 89 return; 90 } 91 92 $data = Utils::jsonDecode($json, true); 93 if (\is_array($data)) { 94 foreach ($data as $cookie) { 95 $this->setCookie(new SetCookie($cookie)); 96 } 97 } elseif (\is_scalar($data) && !empty($data)) { 98 throw new \RuntimeException("Invalid cookie file: {$filename}"); 99 } 100 } 101 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body