Class: HTTP::CookieJar::YAMLSaver

Inherits:
AbstractSaver show all
Defined in:
lib/http/cookie_jar/yaml_saver.rb

Overview

YAMLSaver saves and loads cookies in the YAML format. It can load a YAML file saved by Mechanize, but the saving format is not compatible with older versions of Mechanize (< 2.7).

Instance Method Summary collapse

Methods inherited from AbstractSaver

class_to_symbol, implementation, inherited, #initialize

Constructor Details

This class inherits a constructor from HTTP::CookieJar::AbstractSaver

Instance Method Details

#load(io, jar) ⇒ Object


22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/http/cookie_jar/yaml_saver.rb', line 22

def load(io, jar)
  begin
    data = YAML.load(io)
  rescue ArgumentError => e
    case e.message
    when %r{\Aundefined class/module Mechanize::}
      # backward compatibility with Mechanize::Cookie
      begin
        io.rewind # hopefully
        yaml = io.read
        # a gross hack
        yaml.gsub!(%r{^(    [^ ].*:) !ruby/object:Mechanize::Cookie$}, "\\1")
        data = YAML.load(yaml)
      rescue Errno::ESPIPE
        @logger.warn "could not rewind the stream for conversion" if @logger
      rescue ArgumentError
      end
    end
  end

  case data
  when Array
    data.each { |cookie|
      jar.add(cookie)
    }
  when Hash
    # backward compatibility with Mechanize::Cookie
    data.each { |domain, paths|
      paths.each { |path, names|
        names.each { |cookie_name, cookie_hash|
          if cookie_hash.respond_to?(:ivars)
            # YAML::Object of Syck
            cookie_hash = cookie_hash.ivars
          end
          cookie = HTTP::Cookie.new({}.tap { |hash|
              cookie_hash.each_pair { |key, value|
                hash[key.to_sym] = value
              }
            })
          jar.add(cookie)
        }
      }
    }
  else
    @logger.warn "incompatible YAML cookie data discarded" if @logger
    return
  end
end

#save(io, jar) ⇒ Object


18
19
20
# File 'lib/http/cookie_jar/yaml_saver.rb', line 18

def save(io, jar)
  YAML.dump(@session ? jar.to_a : jar.reject(&:session?), io)
end