class HTTP::CookieJar::YAMLSaver

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).

Public Class Methods

new(**options) click to toggle source

There is no option keyword supported at the moment.

# File lib/http/cookie_jar/yaml_saver.rb, line 10
  

Public Instance Methods

load(io, jar) click to toggle source
# File lib/http/cookie_jar/yaml_saver.rb, line 22
def load(io, jar)
  begin
    data = load_yaml(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 = load_yaml(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) click to toggle source
# 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

Private Instance Methods

default_options() click to toggle source
# File lib/http/cookie_jar/yaml_saver.rb, line 73
def default_options
  {}
end
load_yaml(yaml) click to toggle source
# File lib/http/cookie_jar/yaml_saver.rb, line 78
def load_yaml(yaml)
  YAML.safe_load(yaml, :permitted_classes => %w[Time HTTP::Cookie Mechanize::Cookie DomainName], :aliases => true)
end