From e72b0fdbc5827e6b6cf1e7a2aee8fe9d191e53d5 Mon Sep 17 00:00:00 2001 From: Akinori MUSHA Date: Thu, 28 Mar 2013 00:13:32 +0900 Subject: [PATCH] YAMLServer#load: Add backward compatibility for reading YAML in the old format. --- lib/http/cookie_jar/yaml_saver.rb | 39 ++++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 8 deletions(-) diff --git a/lib/http/cookie_jar/yaml_saver.rb b/lib/http/cookie_jar/yaml_saver.rb index 11d4c0e..40f74e6 100644 --- a/lib/http/cookie_jar/yaml_saver.rb +++ b/lib/http/cookie_jar/yaml_saver.rb @@ -11,19 +11,42 @@ class HTTP::CookieJar::YAMLSaver < HTTP::CookieJar::AbstractSaver def load(io, jar) begin data = YAML.load(io) - rescue ArgumentError - @logger.warn "unloadable YAML cookie data discarded" if @logger - return + 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 - unless data.instance_of?(Array) + 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| + cookie = HTTP::Cookie.new(cookie_hash) + jar.add(cookie) + } + } + } + else @logger.warn "incompatible YAML cookie data discarded" if @logger return end - - data.each { |cookie| - jar.add(cookie) - } end private