Serializing and deserializing a Cookie Jar
I was recently working on a way to serialize and deserialize a
Faraday connection that uses
HTTP::CookieJar to manage persistent cookies across requests.
I needed to do this because I wanted a way to “freeze” an HTTP connection instance, and later “thaw” it to resume the operation — without consuming a ton of space in memory.
However, when I tried serializing it using good ole’
Marshal.dump(cookie_jar), it failed:
Traceback (most recent call last): 2: from (irb):62 1: from (irb):62:in `dump' TypeError (no _dump_data is defined for class Thread::Mutex)
Solution: Accessing instance variables directly
The solution was pretty simple, albeit rather hacky. You can access the store directly by using:
cookie_hash = cookie_jar.store.instance_variable_get(:@jar) serialized_cookie_jar_str = Marshal.dump(cookie_hash)
To restore it, you can do a
set like so:
cookie_jar = Marshal.load(serialized_cookie_jar_str) cookie_jar.store.instance_variable_set(:@jar, cookie_jar)
Hope this helps someone!