From 2ac1692e41dd6edc70a5c373157942d1c736b3fd Mon Sep 17 00:00:00 2001 From: Luke Hill <20105237+luke-hill@users.noreply.github.com> Date: Fri, 11 Jul 2025 17:09:35 +0100 Subject: [PATCH] Add `#to_h` to cookie.rb --- lib/http/cookie.rb | 5 +++++ test/test_http_cookie.rb | 26 ++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/lib/http/cookie.rb b/lib/http/cookie.rb index 6282e3c..b567a59 100644 --- a/lib/http/cookie.rb +++ b/lib/http/cookie.rb @@ -655,6 +655,11 @@ class HTTP::Cookie end include Comparable + # Hash serialization helper for use back into other libraries (Like Selenium) + def to_h + PERSISTENT_PROPERTIES.each_with_object({}) { |property, hash| [property.to_sym] => instance_variable_get("@#{property}") } + end + # YAML serialization helper for Syck. def to_yaml_properties PERSISTENT_PROPERTIES.map { |name| "@#{name}" } diff --git a/test/test_http_cookie.rb b/test/test_http_cookie.rb index a01b46a..ba2bd0d 100644 --- a/test/test_http_cookie.rb +++ b/test/test_http_cookie.rb @@ -1168,4 +1168,30 @@ class TestHTTPCookie < Test::Unit::TestCase assert_equal true, HTTP::Cookie.path_match?('/admin', '/admin/') assert_equal true, HTTP::Cookie.path_match?('/admin', '/admin/index') end + + def test_to_h_coercion + now = Time.now + cookie = HTTP::Cookie.new(cookie_values.merge({ expires: now, max_age: 3600, created_at: now, accessed_at: now })) + + cookie.keys.each { |key| assert_equal key.class, Symbol } + assert_equal cookie.keys.map(&:to_s), PERSISTENT_PROPERTIES + + expected_hash = + { + name: 'Foo', + value: 'Bar', + path: '/', + expires: now, + for_domain: true, + domain: 'rubyforge.org', + origin: 'http://rubyforge.org/', + secure: true, + httponly: true, + max_age: 3600, + created_at: now, + accessed_at: now + } + + assert_equal cookie.to_h, expected_hash + end end