http-cookie 1.0.0.pre7 → 1.0.0.pre8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +2 -2
- data/lib/http/cookie.rb +13 -13
- data/lib/http/cookie/scanner.rb +1 -1
- data/lib/http/cookie/version.rb +1 -1
- data/lib/http/cookie_jar.rb +23 -0
- data/test/test_http_cookie.rb +58 -53
- data/test/test_http_cookie_jar.rb +489 -491
- metadata +2 -2
| @@ -1,633 +1,631 @@ | |
| 1 1 | 
             
            require File.expand_path('helper', File.dirname(__FILE__))
         | 
| 2 2 | 
             
            require 'tmpdir'
         | 
| 3 3 |  | 
| 4 | 
            -
            module TestHTTPCookieJar | 
| 5 | 
            -
             | 
| 6 | 
            -
             | 
| 7 | 
            -
             | 
| 8 | 
            -
             | 
| 9 | 
            -
             | 
| 10 | 
            -
                   | 
| 11 | 
            -
             | 
| 12 | 
            -
             | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 15 | 
            -
             | 
| 16 | 
            -
             | 
| 17 | 
            -
                 | 
| 18 | 
            -
              end
         | 
| 4 | 
            +
            module TestHTTPCookieJar
         | 
| 5 | 
            +
              module Tests
         | 
| 6 | 
            +
                def setup(options = nil, options2 = nil)
         | 
| 7 | 
            +
                  default_options = {
         | 
| 8 | 
            +
                    :store => :hash,
         | 
| 9 | 
            +
                    :gc_threshold => 150,
         | 
| 10 | 
            +
                  }
         | 
| 11 | 
            +
                  new_options  = default_options.merge(options || {})
         | 
| 12 | 
            +
                  new_options2 = new_options.merge(options2 || {})
         | 
| 13 | 
            +
                  @store_type = new_options[:store]
         | 
| 14 | 
            +
                  @gc_threshold = new_options[:gc_threshold]
         | 
| 15 | 
            +
                  @jar  = HTTP::CookieJar.new(new_options)
         | 
| 16 | 
            +
                  @jar2 = HTTP::CookieJar.new(new_options)
         | 
| 17 | 
            +
                end
         | 
| 19 18 |  | 
| 20 | 
            -
             | 
| 21 | 
            -
             | 
| 22 | 
            -
             | 
| 19 | 
            +
                def hash_store?
         | 
| 20 | 
            +
                  @store_type == :hash
         | 
| 21 | 
            +
                end
         | 
| 23 22 |  | 
| 24 | 
            -
             | 
| 25 | 
            -
             | 
| 26 | 
            -
             | 
| 23 | 
            +
                def mozilla_store?
         | 
| 24 | 
            +
                  @store_type == :mozilla
         | 
| 25 | 
            +
                end
         | 
| 27 26 |  | 
| 28 | 
            -
             | 
| 29 | 
            -
             | 
| 30 | 
            -
             | 
| 31 | 
            -
             | 
| 32 | 
            -
             | 
| 33 | 
            -
             | 
| 34 | 
            -
             | 
| 35 | 
            -
             | 
| 36 | 
            -
             | 
| 37 | 
            -
             | 
| 38 | 
            -
             | 
| 27 | 
            +
                def cookie_values(options = {})
         | 
| 28 | 
            +
                  {
         | 
| 29 | 
            +
                    :name     => 'Foo',
         | 
| 30 | 
            +
                    :value    => 'Bar',
         | 
| 31 | 
            +
                    :path     => '/',
         | 
| 32 | 
            +
                    :expires  => Time.at(Time.now.to_i + 10 * 86400), # to_i is important here
         | 
| 33 | 
            +
                    :for_domain => true,
         | 
| 34 | 
            +
                    :domain   => 'rubyforge.org',
         | 
| 35 | 
            +
                    :origin   => 'http://rubyforge.org/'
         | 
| 36 | 
            +
                  }.merge(options)
         | 
| 37 | 
            +
                end
         | 
| 39 38 |  | 
| 40 | 
            -
             | 
| 41 | 
            -
             | 
| 42 | 
            -
             | 
| 43 | 
            -
             | 
| 44 | 
            -
             | 
| 45 | 
            -
             | 
| 46 | 
            -
             | 
| 47 | 
            -
             | 
| 39 | 
            +
                def test_empty?
         | 
| 40 | 
            +
                  assert_equal true, @jar.empty?
         | 
| 41 | 
            +
                  cookie = HTTP::Cookie.new(cookie_values)
         | 
| 42 | 
            +
                  @jar.add(cookie)
         | 
| 43 | 
            +
                  assert_equal false, @jar.empty?
         | 
| 44 | 
            +
                  assert_equal false, @jar.empty?('http://rubyforge.org/')
         | 
| 45 | 
            +
                  assert_equal true, @jar.empty?('http://example.local/')
         | 
| 46 | 
            +
                end
         | 
| 48 47 |  | 
| 49 | 
            -
             | 
| 50 | 
            -
             | 
| 48 | 
            +
                def test_two_cookies_same_domain_and_name_different_paths
         | 
| 49 | 
            +
                  url = URI 'http://rubyforge.org/'
         | 
| 51 50 |  | 
| 52 | 
            -
             | 
| 53 | 
            -
             | 
| 54 | 
            -
             | 
| 51 | 
            +
                  cookie = HTTP::Cookie.new(cookie_values)
         | 
| 52 | 
            +
                  @jar.add(cookie)
         | 
| 53 | 
            +
                  @jar.add(HTTP::Cookie.new(cookie_values(:path => '/onetwo')))
         | 
| 55 54 |  | 
| 56 | 
            -
             | 
| 57 | 
            -
             | 
| 58 | 
            -
             | 
| 55 | 
            +
                  assert_equal(1, @jar.cookies(url).length)
         | 
| 56 | 
            +
                  assert_equal 2, @jar.cookies(URI('http://rubyforge.org/onetwo')).length
         | 
| 57 | 
            +
                end
         | 
| 59 58 |  | 
| 60 | 
            -
             | 
| 61 | 
            -
             | 
| 59 | 
            +
                def test_domain_case
         | 
| 60 | 
            +
                  url = URI 'http://rubyforge.org/'
         | 
| 62 61 |  | 
| 63 | 
            -
             | 
| 64 | 
            -
             | 
| 65 | 
            -
             | 
| 66 | 
            -
             | 
| 62 | 
            +
                  # Add one cookie with an expiration date in the future
         | 
| 63 | 
            +
                  cookie = HTTP::Cookie.new(cookie_values)
         | 
| 64 | 
            +
                  @jar.add(cookie)
         | 
| 65 | 
            +
                  assert_equal(1, @jar.cookies(url).length)
         | 
| 67 66 |  | 
| 68 | 
            -
             | 
| 67 | 
            +
                  @jar.add(HTTP::Cookie.new(cookie_values(:domain => 'RuByForge.Org', :name => 'aaron')))
         | 
| 69 68 |  | 
| 70 | 
            -
             | 
| 69 | 
            +
                  assert_equal(2, @jar.cookies(url).length)
         | 
| 71 70 |  | 
| 72 | 
            -
             | 
| 73 | 
            -
             | 
| 74 | 
            -
             | 
| 71 | 
            +
                  url2 = URI 'http://RuByFoRgE.oRg/'
         | 
| 72 | 
            +
                  assert_equal(2, @jar.cookies(url2).length)
         | 
| 73 | 
            +
                end
         | 
| 75 74 |  | 
| 76 | 
            -
             | 
| 77 | 
            -
             | 
| 75 | 
            +
                def test_host_only
         | 
| 76 | 
            +
                  url = URI.parse('http://rubyforge.org/')
         | 
| 78 77 |  | 
| 79 | 
            -
             | 
| 80 | 
            -
             | 
| 78 | 
            +
                  @jar.add(HTTP::Cookie.new(
         | 
| 79 | 
            +
                      cookie_values(:domain => 'rubyforge.org', :for_domain => false)))
         | 
| 81 80 |  | 
| 82 | 
            -
             | 
| 81 | 
            +
                  assert_equal(1, @jar.cookies(url).length)
         | 
| 83 82 |  | 
| 84 | 
            -
             | 
| 83 | 
            +
                  assert_equal(1, @jar.cookies(URI('http://RubyForge.org/')).length)
         | 
| 85 84 |  | 
| 86 | 
            -
             | 
| 85 | 
            +
                  assert_equal(1, @jar.cookies(URI('https://RubyForge.org/')).length)
         | 
| 87 86 |  | 
| 88 | 
            -
             | 
| 89 | 
            -
             | 
| 87 | 
            +
                  assert_equal(0, @jar.cookies(URI('http://www.rubyforge.org/')).length)
         | 
| 88 | 
            +
                end
         | 
| 90 89 |  | 
| 91 | 
            -
             | 
| 92 | 
            -
             | 
| 93 | 
            -
             | 
| 90 | 
            +
                def test_empty_value
         | 
| 91 | 
            +
                  url = URI 'http://rubyforge.org/'
         | 
| 92 | 
            +
                  values = cookie_values(:value => "")
         | 
| 94 93 |  | 
| 95 | 
            -
             | 
| 96 | 
            -
             | 
| 97 | 
            -
             | 
| 98 | 
            -
             | 
| 94 | 
            +
                  # Add one cookie with an expiration date in the future
         | 
| 95 | 
            +
                  cookie = HTTP::Cookie.new(values)
         | 
| 96 | 
            +
                  @jar.add(cookie)
         | 
| 97 | 
            +
                  assert_equal(1, @jar.cookies(url).length)
         | 
| 99 98 |  | 
| 100 | 
            -
             | 
| 101 | 
            -
             | 
| 99 | 
            +
                  @jar.add HTTP::Cookie.new(values.merge(:domain => 'RuByForge.Org',
         | 
| 100 | 
            +
                      :name   => 'aaron'))
         | 
| 102 101 |  | 
| 103 | 
            -
             | 
| 102 | 
            +
                  assert_equal(2, @jar.cookies(url).length)
         | 
| 104 103 |  | 
| 105 | 
            -
             | 
| 106 | 
            -
             | 
| 107 | 
            -
             | 
| 104 | 
            +
                  url2 = URI 'http://RuByFoRgE.oRg/'
         | 
| 105 | 
            +
                  assert_equal(2, @jar.cookies(url2).length)
         | 
| 106 | 
            +
                end
         | 
| 108 107 |  | 
| 109 | 
            -
             | 
| 110 | 
            -
             | 
| 108 | 
            +
                def test_add_future_cookies
         | 
| 109 | 
            +
                  url = URI 'http://rubyforge.org/'
         | 
| 111 110 |  | 
| 112 | 
            -
             | 
| 113 | 
            -
             | 
| 114 | 
            -
             | 
| 115 | 
            -
             | 
| 111 | 
            +
                  # Add one cookie with an expiration date in the future
         | 
| 112 | 
            +
                  cookie = HTTP::Cookie.new(cookie_values)
         | 
| 113 | 
            +
                  @jar.add(cookie)
         | 
| 114 | 
            +
                  assert_equal(1, @jar.cookies(url).length)
         | 
| 116 115 |  | 
| 117 | 
            -
             | 
| 118 | 
            -
             | 
| 119 | 
            -
             | 
| 116 | 
            +
                  # Add the same cookie, and we should still only have one
         | 
| 117 | 
            +
                  @jar.add(HTTP::Cookie.new(cookie_values))
         | 
| 118 | 
            +
                  assert_equal(1, @jar.cookies(url).length)
         | 
| 120 119 |  | 
| 121 | 
            -
             | 
| 122 | 
            -
             | 
| 120 | 
            +
                  # Make sure we can get the cookie from different paths
         | 
| 121 | 
            +
                  assert_equal(1, @jar.cookies(URI('http://rubyforge.org/login')).length)
         | 
| 123 122 |  | 
| 124 | 
            -
             | 
| 125 | 
            -
             | 
| 126 | 
            -
             | 
| 123 | 
            +
                  # Make sure we can't get the cookie from different domains
         | 
| 124 | 
            +
                  assert_equal(0, @jar.cookies(URI('http://google.com/')).length)
         | 
| 125 | 
            +
                end
         | 
| 127 126 |  | 
| 128 | 
            -
             | 
| 129 | 
            -
             | 
| 127 | 
            +
                def test_add_multiple_cookies
         | 
| 128 | 
            +
                  url = URI 'http://rubyforge.org/'
         | 
| 130 129 |  | 
| 131 | 
            -
             | 
| 132 | 
            -
             | 
| 133 | 
            -
             | 
| 134 | 
            -
             | 
| 130 | 
            +
                  # Add one cookie with an expiration date in the future
         | 
| 131 | 
            +
                  cookie = HTTP::Cookie.new(cookie_values)
         | 
| 132 | 
            +
                  @jar.add(cookie)
         | 
| 133 | 
            +
                  assert_equal(1, @jar.cookies(url).length)
         | 
| 135 134 |  | 
| 136 | 
            -
             | 
| 137 | 
            -
             | 
| 138 | 
            -
             | 
| 135 | 
            +
                  # Add the same cookie, and we should still only have one
         | 
| 136 | 
            +
                  @jar.add(HTTP::Cookie.new(cookie_values(:name => 'Baz')))
         | 
| 137 | 
            +
                  assert_equal(2, @jar.cookies(url).length)
         | 
| 139 138 |  | 
| 140 | 
            -
             | 
| 141 | 
            -
             | 
| 139 | 
            +
                  # Make sure we can get the cookie from different paths
         | 
| 140 | 
            +
                  assert_equal(2, @jar.cookies(URI('http://rubyforge.org/login')).length)
         | 
| 142 141 |  | 
| 143 | 
            -
             | 
| 144 | 
            -
             | 
| 145 | 
            -
             | 
| 142 | 
            +
                  # Make sure we can't get the cookie from different domains
         | 
| 143 | 
            +
                  assert_equal(0, @jar.cookies(URI('http://google.com/')).length)
         | 
| 144 | 
            +
                end
         | 
| 146 145 |  | 
| 147 | 
            -
             | 
| 148 | 
            -
             | 
| 146 | 
            +
                def test_add_multiple_cookies_with_the_same_name
         | 
| 147 | 
            +
                  now = Time.now
         | 
| 149 148 |  | 
| 150 | 
            -
             | 
| 151 | 
            -
             | 
| 152 | 
            -
             | 
| 153 | 
            -
             | 
| 154 | 
            -
             | 
| 155 | 
            -
             | 
| 156 | 
            -
             | 
| 157 | 
            -
             | 
| 149 | 
            +
                  cookies = [
         | 
| 150 | 
            +
                    { :value => 'a', :path => '/', },
         | 
| 151 | 
            +
                    { :value => 'b', :path => '/abc/def/', :created_at => now - 1 },
         | 
| 152 | 
            +
                    { :value => 'c', :path => '/abc/def/', :domain => 'www.rubyforge.org', :origin => 'http://www.rubyforge.org/abc/def/', :created_at => now },
         | 
| 153 | 
            +
                    { :value => 'd', :path => '/abc/' },
         | 
| 154 | 
            +
                  ].map { |attrs|
         | 
| 155 | 
            +
                    HTTP::Cookie.new(cookie_values(attrs))
         | 
| 156 | 
            +
                  }
         | 
| 158 157 |  | 
| 159 | 
            -
             | 
| 158 | 
            +
                  url = URI 'http://www.rubyforge.org/abc/def/ghi'
         | 
| 160 159 |  | 
| 161 | 
            -
             | 
| 162 | 
            -
             | 
| 163 | 
            -
             | 
| 164 | 
            -
             | 
| 165 | 
            -
             | 
| 166 | 
            -
             | 
| 160 | 
            +
                  cookies.permutation(cookies.size) { |shuffled|
         | 
| 161 | 
            +
                    @jar.clear
         | 
| 162 | 
            +
                    shuffled.each { |cookie| @jar.add(cookie) }
         | 
| 163 | 
            +
                    assert_equal %w[b c d a], @jar.cookies(url).map { |cookie| cookie.value }
         | 
| 164 | 
            +
                  }
         | 
| 165 | 
            +
                end
         | 
| 167 166 |  | 
| 168 | 
            -
             | 
| 169 | 
            -
             | 
| 167 | 
            +
                def test_fall_back_rules_for_local_domains
         | 
| 168 | 
            +
                  url = URI 'http://www.example.local'
         | 
| 170 169 |  | 
| 171 | 
            -
             | 
| 172 | 
            -
             | 
| 170 | 
            +
                  sld_cookie = HTTP::Cookie.new(cookie_values(:domain => '.example.local', :origin => url))
         | 
| 171 | 
            +
                  @jar.add(sld_cookie)
         | 
| 173 172 |  | 
| 174 | 
            -
             | 
| 175 | 
            -
             | 
| 173 | 
            +
                  assert_equal(1, @jar.cookies(url).length)
         | 
| 174 | 
            +
                end
         | 
| 176 175 |  | 
| 177 | 
            -
             | 
| 178 | 
            -
             | 
| 176 | 
            +
                def test_add_makes_exception_for_localhost
         | 
| 177 | 
            +
                  url = URI 'http://localhost'
         | 
| 179 178 |  | 
| 180 | 
            -
             | 
| 181 | 
            -
             | 
| 179 | 
            +
                  tld_cookie = HTTP::Cookie.new(cookie_values(:domain => 'localhost', :origin => url))
         | 
| 180 | 
            +
                  @jar.add(tld_cookie)
         | 
| 182 181 |  | 
| 183 | 
            -
             | 
| 184 | 
            -
             | 
| 182 | 
            +
                  assert_equal(1, @jar.cookies(url).length)
         | 
| 183 | 
            +
                end
         | 
| 185 184 |  | 
| 186 | 
            -
             | 
| 187 | 
            -
             | 
| 185 | 
            +
                def test_add_cookie_for_the_parent_domain
         | 
| 186 | 
            +
                  url = URI 'http://x.foo.com'
         | 
| 188 187 |  | 
| 189 | 
            -
             | 
| 190 | 
            -
             | 
| 188 | 
            +
                  cookie = HTTP::Cookie.new(cookie_values(:domain => '.foo.com', :origin => url))
         | 
| 189 | 
            +
                  @jar.add(cookie)
         | 
| 191 190 |  | 
| 192 | 
            -
             | 
| 193 | 
            -
             | 
| 191 | 
            +
                  assert_equal(1, @jar.cookies(url).length)
         | 
| 192 | 
            +
                end
         | 
| 194 193 |  | 
| 195 | 
            -
             | 
| 196 | 
            -
             | 
| 197 | 
            -
             | 
| 198 | 
            -
             | 
| 199 | 
            -
             | 
| 194 | 
            +
                def test_add_rejects_cookies_with_unknown_domain_or_path
         | 
| 195 | 
            +
                  cookie = HTTP::Cookie.new(cookie_values.reject { |k,v| [:origin, :domain].include?(k) })
         | 
| 196 | 
            +
                  assert_raises(ArgumentError) {
         | 
| 197 | 
            +
                    @jar.add(cookie)
         | 
| 198 | 
            +
                  }
         | 
| 200 199 |  | 
| 201 | 
            -
             | 
| 202 | 
            -
             | 
| 203 | 
            -
             | 
| 204 | 
            -
             | 
| 205 | 
            -
             | 
| 200 | 
            +
                  cookie = HTTP::Cookie.new(cookie_values.reject { |k,v| [:origin, :path].include?(k) })
         | 
| 201 | 
            +
                  assert_raises(ArgumentError) {
         | 
| 202 | 
            +
                    @jar.add(cookie)
         | 
| 203 | 
            +
                  }
         | 
| 204 | 
            +
                end
         | 
| 206 205 |  | 
| 207 | 
            -
             | 
| 208 | 
            -
             | 
| 206 | 
            +
                def test_add_does_not_reject_cookies_from_a_nested_subdomain
         | 
| 207 | 
            +
                  url = URI 'http://y.x.foo.com'
         | 
| 209 208 |  | 
| 210 | 
            -
             | 
| 211 | 
            -
             | 
| 209 | 
            +
                  cookie = HTTP::Cookie.new(cookie_values(:domain => '.foo.com', :origin => url))
         | 
| 210 | 
            +
                  @jar.add(cookie)
         | 
| 212 211 |  | 
| 213 | 
            -
             | 
| 214 | 
            -
             | 
| 212 | 
            +
                  assert_equal(1, @jar.cookies(url).length)
         | 
| 213 | 
            +
                end
         | 
| 215 214 |  | 
| 216 | 
            -
             | 
| 217 | 
            -
             | 
| 215 | 
            +
                def test_cookie_without_leading_dot_does_not_cause_substring_match
         | 
| 216 | 
            +
                  url = URI 'http://arubyforge.org/'
         | 
| 218 217 |  | 
| 219 | 
            -
             | 
| 220 | 
            -
             | 
| 218 | 
            +
                  cookie = HTTP::Cookie.new(cookie_values(:domain => 'rubyforge.org'))
         | 
| 219 | 
            +
                  @jar.add(cookie)
         | 
| 221 220 |  | 
| 222 | 
            -
             | 
| 223 | 
            -
             | 
| 221 | 
            +
                  assert_equal(0, @jar.cookies(url).length)
         | 
| 222 | 
            +
                end
         | 
| 224 223 |  | 
| 225 | 
            -
             | 
| 226 | 
            -
             | 
| 224 | 
            +
                def test_cookie_without_leading_dot_matches_subdomains
         | 
| 225 | 
            +
                  url = URI 'http://admin.rubyforge.org/'
         | 
| 227 226 |  | 
| 228 | 
            -
             | 
| 229 | 
            -
             | 
| 227 | 
            +
                  cookie = HTTP::Cookie.new(cookie_values(:domain => 'rubyforge.org', :origin => url))
         | 
| 228 | 
            +
                  @jar.add(cookie)
         | 
| 230 229 |  | 
| 231 | 
            -
             | 
| 232 | 
            -
             | 
| 230 | 
            +
                  assert_equal(1, @jar.cookies(url).length)
         | 
| 231 | 
            +
                end
         | 
| 233 232 |  | 
| 234 | 
            -
             | 
| 235 | 
            -
             | 
| 233 | 
            +
                def test_cookies_with_leading_dot_match_subdomains
         | 
| 234 | 
            +
                  url = URI 'http://admin.rubyforge.org/'
         | 
| 236 235 |  | 
| 237 | 
            -
             | 
| 236 | 
            +
                  @jar.add(HTTP::Cookie.new(cookie_values(:domain => '.rubyforge.org', :origin => url)))
         | 
| 238 237 |  | 
| 239 | 
            -
             | 
| 240 | 
            -
             | 
| 238 | 
            +
                  assert_equal(1, @jar.cookies(url).length)
         | 
| 239 | 
            +
                end
         | 
| 241 240 |  | 
| 242 | 
            -
             | 
| 243 | 
            -
             | 
| 241 | 
            +
                def test_cookies_with_leading_dot_match_parent_domains
         | 
| 242 | 
            +
                  url = URI 'http://rubyforge.org/'
         | 
| 244 243 |  | 
| 245 | 
            -
             | 
| 244 | 
            +
                  @jar.add(HTTP::Cookie.new(cookie_values(:domain => '.rubyforge.org', :origin => url)))
         | 
| 246 245 |  | 
| 247 | 
            -
             | 
| 248 | 
            -
             | 
| 246 | 
            +
                  assert_equal(1, @jar.cookies(url).length)
         | 
| 247 | 
            +
                end
         | 
| 249 248 |  | 
| 250 | 
            -
             | 
| 251 | 
            -
             | 
| 249 | 
            +
                def test_cookies_with_leading_dot_match_parent_domains_exactly
         | 
| 250 | 
            +
                  url = URI 'http://arubyforge.org/'
         | 
| 252 251 |  | 
| 253 | 
            -
             | 
| 252 | 
            +
                  @jar.add(HTTP::Cookie.new(cookie_values(:domain => '.rubyforge.org')))
         | 
| 254 253 |  | 
| 255 | 
            -
             | 
| 256 | 
            -
             | 
| 254 | 
            +
                  assert_equal(0, @jar.cookies(url).length)
         | 
| 255 | 
            +
                end
         | 
| 257 256 |  | 
| 258 | 
            -
             | 
| 259 | 
            -
             | 
| 257 | 
            +
                def test_cookie_for_ipv4_address_matches_the_exact_ipaddress
         | 
| 258 | 
            +
                  url = URI 'http://192.168.0.1/'
         | 
| 260 259 |  | 
| 261 | 
            -
             | 
| 262 | 
            -
             | 
| 260 | 
            +
                  cookie = HTTP::Cookie.new(cookie_values(:domain => '192.168.0.1', :origin => url))
         | 
| 261 | 
            +
                  @jar.add(cookie)
         | 
| 263 262 |  | 
| 264 | 
            -
             | 
| 265 | 
            -
             | 
| 263 | 
            +
                  assert_equal(1, @jar.cookies(url).length)
         | 
| 264 | 
            +
                end
         | 
| 266 265 |  | 
| 267 | 
            -
             | 
| 268 | 
            -
             | 
| 266 | 
            +
                def test_cookie_for_ipv6_address_matches_the_exact_ipaddress
         | 
| 267 | 
            +
                  url = URI 'http://[fe80::0123:4567:89ab:cdef]/'
         | 
| 269 268 |  | 
| 270 | 
            -
             | 
| 271 | 
            -
             | 
| 269 | 
            +
                  cookie = HTTP::Cookie.new(cookie_values(:domain => '[fe80::0123:4567:89ab:cdef]', :origin => url))
         | 
| 270 | 
            +
                  @jar.add(cookie)
         | 
| 272 271 |  | 
| 273 | 
            -
             | 
| 274 | 
            -
             | 
| 272 | 
            +
                  assert_equal(1, @jar.cookies(url).length)
         | 
| 273 | 
            +
                end
         | 
| 275 274 |  | 
| 276 | 
            -
             | 
| 277 | 
            -
             | 
| 275 | 
            +
                def test_cookies_dot
         | 
| 276 | 
            +
                  url = URI 'http://www.host.example/'
         | 
| 278 277 |  | 
| 279 | 
            -
             | 
| 278 | 
            +
                  @jar.add(HTTP::Cookie.new(cookie_values(:domain => 'www.host.example', :origin => url)))
         | 
| 280 279 |  | 
| 281 | 
            -
             | 
| 282 | 
            -
             | 
| 283 | 
            -
             | 
| 280 | 
            +
                  url = URI 'http://wwwxhost.example/'
         | 
| 281 | 
            +
                  assert_equal(0, @jar.cookies(url).length)
         | 
| 282 | 
            +
                end
         | 
| 284 283 |  | 
| 285 | 
            -
             | 
| 286 | 
            -
             | 
| 284 | 
            +
                def test_cookies_no_host
         | 
| 285 | 
            +
                  url = URI 'file:///path/'
         | 
| 287 286 |  | 
| 288 | 
            -
             | 
| 289 | 
            -
             | 
| 290 | 
            -
             | 
| 287 | 
            +
                  assert_raises(ArgumentError) {
         | 
| 288 | 
            +
                    @jar.add(HTTP::Cookie.new(cookie_values(:origin => url)))
         | 
| 289 | 
            +
                  }
         | 
| 291 290 |  | 
| 292 | 
            -
             | 
| 293 | 
            -
             | 
| 291 | 
            +
                  assert_equal(0, @jar.cookies(url).length)
         | 
| 292 | 
            +
                end
         | 
| 294 293 |  | 
| 295 | 
            -
             | 
| 296 | 
            -
             | 
| 294 | 
            +
                def test_clear
         | 
| 295 | 
            +
                  url = URI 'http://rubyforge.org/'
         | 
| 297 296 |  | 
| 298 | 
            -
             | 
| 299 | 
            -
             | 
| 300 | 
            -
             | 
| 301 | 
            -
             | 
| 302 | 
            -
             | 
| 297 | 
            +
                  # Add one cookie with an expiration date in the future
         | 
| 298 | 
            +
                  cookie = HTTP::Cookie.new(cookie_values(:origin => url))
         | 
| 299 | 
            +
                  @jar.add(cookie)
         | 
| 300 | 
            +
                  @jar.add(HTTP::Cookie.new(cookie_values(:name => 'Baz', :origin => url)))
         | 
| 301 | 
            +
                  assert_equal(2, @jar.cookies(url).length)
         | 
| 303 302 |  | 
| 304 | 
            -
             | 
| 303 | 
            +
                  @jar.clear
         | 
| 305 304 |  | 
| 306 | 
            -
             | 
| 307 | 
            -
             | 
| 305 | 
            +
                  assert_equal(0, @jar.cookies(url).length)
         | 
| 306 | 
            +
                end
         | 
| 308 307 |  | 
| 309 | 
            -
             | 
| 310 | 
            -
             | 
| 308 | 
            +
                def test_save_cookies_yaml
         | 
| 309 | 
            +
                  url = URI 'http://rubyforge.org/'
         | 
| 311 310 |  | 
| 312 | 
            -
             | 
| 313 | 
            -
             | 
| 314 | 
            -
             | 
| 315 | 
            -
             | 
| 316 | 
            -
             | 
| 317 | 
            -
             | 
| 311 | 
            +
                  # Add one cookie with an expiration date in the future
         | 
| 312 | 
            +
                  cookie = HTTP::Cookie.new(cookie_values(:origin => url))
         | 
| 313 | 
            +
                  s_cookie = HTTP::Cookie.new(cookie_values(:name => 'Bar',
         | 
| 314 | 
            +
                      :expires => nil,
         | 
| 315 | 
            +
                      :session => true,
         | 
| 316 | 
            +
                      :origin => url))
         | 
| 318 317 |  | 
| 319 | 
            -
             | 
| 320 | 
            -
             | 
| 321 | 
            -
             | 
| 318 | 
            +
                  @jar.add(cookie)
         | 
| 319 | 
            +
                  @jar.add(s_cookie)
         | 
| 320 | 
            +
                  @jar.add(HTTP::Cookie.new(cookie_values(:name => 'Baz', :for_domain => false, :origin => url)))
         | 
| 321 | 
            +
             | 
| 322 | 
            +
                  assert_equal(3, @jar.cookies(url).length)
         | 
| 322 323 |  | 
| 323 | 
            -
             | 
| 324 | 
            +
                  Dir.mktmpdir do |dir|
         | 
| 325 | 
            +
                    value = @jar.save(File.join(dir, "cookies.yml"))
         | 
| 326 | 
            +
                    assert_same @jar, value
         | 
| 324 327 |  | 
| 325 | 
            -
             | 
| 326 | 
            -
             | 
| 327 | 
            -
             | 
| 328 | 
            +
                    @jar2.load(File.join(dir, "cookies.yml"))
         | 
| 329 | 
            +
                    cookies = @jar2.cookies(url).sort_by { |cookie| cookie.name }
         | 
| 330 | 
            +
                    assert_equal(2, cookies.length)
         | 
| 331 | 
            +
                    assert_equal('Baz', cookies[0].name)
         | 
| 332 | 
            +
                    assert_equal(false, cookies[0].for_domain)
         | 
| 333 | 
            +
                    assert_equal('Foo', cookies[1].name)
         | 
| 334 | 
            +
                    assert_equal(true,  cookies[1].for_domain)
         | 
| 335 | 
            +
                  end
         | 
| 328 336 |  | 
| 329 | 
            -
                   | 
| 330 | 
            -
                  cookies = @jar2.cookies(url).sort_by { |cookie| cookie.name }
         | 
| 331 | 
            -
                  assert_equal(2, cookies.length)
         | 
| 332 | 
            -
                  assert_equal('Baz', cookies[0].name)
         | 
| 333 | 
            -
                  assert_equal(false, cookies[0].for_domain)
         | 
| 334 | 
            -
                  assert_equal('Foo', cookies[1].name)
         | 
| 335 | 
            -
                  assert_equal(true,  cookies[1].for_domain)
         | 
| 337 | 
            +
                  assert_equal(3, @jar.cookies(url).length)
         | 
| 336 338 | 
             
                end
         | 
| 337 339 |  | 
| 338 | 
            -
                 | 
| 339 | 
            -
             | 
| 340 | 
            +
                def test_save_session_cookies_yaml
         | 
| 341 | 
            +
                  url = URI 'http://rubyforge.org/'
         | 
| 340 342 |  | 
| 341 | 
            -
             | 
| 342 | 
            -
             | 
| 343 | 
            +
                  # Add one cookie with an expiration date in the future
         | 
| 344 | 
            +
                  cookie = HTTP::Cookie.new(cookie_values)
         | 
| 345 | 
            +
                  s_cookie = HTTP::Cookie.new(cookie_values(:name => 'Bar',
         | 
| 346 | 
            +
                      :expires => nil,
         | 
| 347 | 
            +
                      :session => true))
         | 
| 343 348 |  | 
| 344 | 
            -
             | 
| 345 | 
            -
             | 
| 346 | 
            -
             | 
| 347 | 
            -
                                                          :expires => nil,
         | 
| 348 | 
            -
                                                          :session => true))
         | 
| 349 | 
            +
                  @jar.add(cookie)
         | 
| 350 | 
            +
                  @jar.add(s_cookie)
         | 
| 351 | 
            +
                  @jar.add(HTTP::Cookie.new(cookie_values(:name => 'Baz')))
         | 
| 349 352 |  | 
| 350 | 
            -
             | 
| 351 | 
            -
                @jar.add(s_cookie)
         | 
| 352 | 
            -
                @jar.add(HTTP::Cookie.new(cookie_values(:name => 'Baz')))
         | 
| 353 | 
            +
                  assert_equal(3, @jar.cookies(url).length)
         | 
| 353 354 |  | 
| 354 | 
            -
             | 
| 355 | 
            +
                  Dir.mktmpdir do |dir|
         | 
| 356 | 
            +
                    @jar.save(File.join(dir, "cookies.yml"), :format => :yaml, :session => true)
         | 
| 355 357 |  | 
| 356 | 
            -
             | 
| 357 | 
            -
             | 
| 358 | 
            +
                    @jar2.load(File.join(dir, "cookies.yml"))
         | 
| 359 | 
            +
                    assert_equal(3, @jar2.cookies(url).length)
         | 
| 360 | 
            +
                  end
         | 
| 358 361 |  | 
| 359 | 
            -
                   | 
| 360 | 
            -
                  assert_equal(3, @jar2.cookies(url).length)
         | 
| 362 | 
            +
                  assert_equal(3, @jar.cookies(url).length)
         | 
| 361 363 | 
             
                end
         | 
| 362 364 |  | 
| 363 | 
            -
                assert_equal(3, @jar.cookies(url).length)
         | 
| 364 | 
            -
              end
         | 
| 365 365 |  | 
| 366 | 
            +
                def test_save_and_read_cookiestxt
         | 
| 367 | 
            +
                  url = URI 'http://rubyforge.org/foo/'
         | 
| 368 | 
            +
             | 
| 369 | 
            +
                  # Add one cookie with an expiration date in the future
         | 
| 370 | 
            +
                  cookie = HTTP::Cookie.new(cookie_values)
         | 
| 371 | 
            +
                  expires = cookie.expires
         | 
| 372 | 
            +
                  s_cookie = HTTP::Cookie.new(cookie_values(:name => 'Bar',
         | 
| 373 | 
            +
                      :expires => nil,
         | 
| 374 | 
            +
                      :session => true))
         | 
| 375 | 
            +
                  cookie2 = HTTP::Cookie.new(cookie_values(:name => 'Baz',
         | 
| 376 | 
            +
                      :value => 'Foo#Baz',
         | 
| 377 | 
            +
                      :path => '/foo/',
         | 
| 378 | 
            +
                      :for_domain => false))
         | 
| 379 | 
            +
                  h_cookie = HTTP::Cookie.new(cookie_values(:name => 'Quux',
         | 
| 380 | 
            +
                      :value => 'Foo#Quux',
         | 
| 381 | 
            +
                      :httponly => true))
         | 
| 382 | 
            +
                  ma_cookie = HTTP::Cookie.new(cookie_values(:name => 'Maxage',
         | 
| 383 | 
            +
                      :value => 'Foo#Maxage',
         | 
| 384 | 
            +
                      :max_age => 15000))
         | 
| 385 | 
            +
                  @jar.add(cookie)
         | 
| 386 | 
            +
                  @jar.add(s_cookie)
         | 
| 387 | 
            +
                  @jar.add(cookie2)
         | 
| 388 | 
            +
                  @jar.add(h_cookie)
         | 
| 389 | 
            +
                  @jar.add(ma_cookie)
         | 
| 390 | 
            +
             | 
| 391 | 
            +
                  assert_equal(5, @jar.cookies(url).length)
         | 
| 392 | 
            +
             | 
| 393 | 
            +
                  Dir.mktmpdir do |dir|
         | 
| 394 | 
            +
                    filename = File.join(dir, "cookies.txt")
         | 
| 395 | 
            +
                    @jar.save(filename, :cookiestxt)
         | 
| 396 | 
            +
             | 
| 397 | 
            +
                    content = File.read(filename)
         | 
| 398 | 
            +
             | 
| 399 | 
            +
                    assert_match(/^\.rubyforge\.org\t.*\tFoo\t/, content)
         | 
| 400 | 
            +
                    assert_match(/^rubyforge\.org\t.*\tBaz\t/, content)
         | 
| 401 | 
            +
                    assert_match(/^#HttpOnly_\.rubyforge\.org\t/, content)
         | 
| 402 | 
            +
             | 
| 403 | 
            +
                    @jar2.load(filename, :cookiestxt) # HACK test the format
         | 
| 404 | 
            +
                    cookies = @jar2.cookies(url)
         | 
| 405 | 
            +
                    assert_equal(4, cookies.length)
         | 
| 406 | 
            +
                    cookies.each { |cookie|
         | 
| 407 | 
            +
                      case cookie.name
         | 
| 408 | 
            +
                      when 'Foo'
         | 
| 409 | 
            +
                        assert_equal 'Bar', cookie.value
         | 
| 410 | 
            +
                        assert_equal expires, cookie.expires
         | 
| 411 | 
            +
                        assert_equal 'rubyforge.org', cookie.domain
         | 
| 412 | 
            +
                        assert_equal true, cookie.for_domain
         | 
| 413 | 
            +
                        assert_equal '/', cookie.path
         | 
| 414 | 
            +
                        assert_equal false, cookie.httponly?
         | 
| 415 | 
            +
                      when 'Baz'
         | 
| 416 | 
            +
                        assert_equal 'Foo#Baz', cookie.value
         | 
| 417 | 
            +
                        assert_equal 'rubyforge.org', cookie.domain
         | 
| 418 | 
            +
                        assert_equal false, cookie.for_domain
         | 
| 419 | 
            +
                        assert_equal '/foo/', cookie.path
         | 
| 420 | 
            +
                        assert_equal false, cookie.httponly?
         | 
| 421 | 
            +
                      when 'Quux'
         | 
| 422 | 
            +
                        assert_equal 'Foo#Quux', cookie.value
         | 
| 423 | 
            +
                        assert_equal expires, cookie.expires
         | 
| 424 | 
            +
                        assert_equal 'rubyforge.org', cookie.domain
         | 
| 425 | 
            +
                        assert_equal true, cookie.for_domain
         | 
| 426 | 
            +
                        assert_equal '/', cookie.path
         | 
| 427 | 
            +
                        assert_equal true, cookie.httponly?
         | 
| 428 | 
            +
                      when 'Maxage'
         | 
| 429 | 
            +
                        assert_equal 'Foo#Maxage', cookie.value
         | 
| 430 | 
            +
                        assert_equal nil, cookie.max_age
         | 
| 431 | 
            +
                        assert_in_delta ma_cookie.expires, cookie.expires, 1
         | 
| 432 | 
            +
                      else
         | 
| 433 | 
            +
                        raise
         | 
| 434 | 
            +
                      end
         | 
| 435 | 
            +
                    }
         | 
| 436 | 
            +
                  end
         | 
| 366 437 |  | 
| 367 | 
            -
             | 
| 368 | 
            -
                url = URI 'http://rubyforge.org/foo/'
         | 
| 369 | 
            -
             | 
| 370 | 
            -
                # Add one cookie with an expiration date in the future
         | 
| 371 | 
            -
                cookie = HTTP::Cookie.new(cookie_values)
         | 
| 372 | 
            -
                expires = cookie.expires
         | 
| 373 | 
            -
                s_cookie = HTTP::Cookie.new(cookie_values(:name => 'Bar',
         | 
| 374 | 
            -
                                                          :expires => nil,
         | 
| 375 | 
            -
                                                          :session => true))
         | 
| 376 | 
            -
                cookie2 = HTTP::Cookie.new(cookie_values(:name => 'Baz',
         | 
| 377 | 
            -
                                                         :value => 'Foo#Baz',
         | 
| 378 | 
            -
                                                         :path => '/foo/',
         | 
| 379 | 
            -
                                                         :for_domain => false))
         | 
| 380 | 
            -
                h_cookie = HTTP::Cookie.new(cookie_values(:name => 'Quux',
         | 
| 381 | 
            -
                                                          :value => 'Foo#Quux',
         | 
| 382 | 
            -
                                                          :httponly => true))
         | 
| 383 | 
            -
                ma_cookie = HTTP::Cookie.new(cookie_values(:name => 'Maxage',
         | 
| 384 | 
            -
                                                           :value => 'Foo#Maxage',
         | 
| 385 | 
            -
                                                           :max_age => 15000))
         | 
| 386 | 
            -
                @jar.add(cookie)
         | 
| 387 | 
            -
                @jar.add(s_cookie)
         | 
| 388 | 
            -
                @jar.add(cookie2)
         | 
| 389 | 
            -
                @jar.add(h_cookie)
         | 
| 390 | 
            -
                @jar.add(ma_cookie)
         | 
| 391 | 
            -
             | 
| 392 | 
            -
                assert_equal(5, @jar.cookies(url).length)
         | 
| 393 | 
            -
             | 
| 394 | 
            -
                Dir.mktmpdir do |dir|
         | 
| 395 | 
            -
                  filename = File.join(dir, "cookies.txt")
         | 
| 396 | 
            -
                  @jar.save(filename, :cookiestxt)
         | 
| 397 | 
            -
             | 
| 398 | 
            -
                  content = File.read(filename)
         | 
| 399 | 
            -
             | 
| 400 | 
            -
                  assert_match(/^\.rubyforge\.org\t.*\tFoo\t/, content)
         | 
| 401 | 
            -
                  assert_match(/^rubyforge\.org\t.*\tBaz\t/, content)
         | 
| 402 | 
            -
                  assert_match(/^#HttpOnly_\.rubyforge\.org\t/, content)
         | 
| 403 | 
            -
             | 
| 404 | 
            -
                  @jar2.load(filename, :cookiestxt) # HACK test the format
         | 
| 405 | 
            -
                  cookies = @jar2.cookies(url)
         | 
| 406 | 
            -
                  assert_equal(4, cookies.length)
         | 
| 407 | 
            -
                  cookies.each { |cookie|
         | 
| 408 | 
            -
                    case cookie.name
         | 
| 409 | 
            -
                    when 'Foo'
         | 
| 410 | 
            -
                      assert_equal 'Bar', cookie.value
         | 
| 411 | 
            -
                      assert_equal expires, cookie.expires
         | 
| 412 | 
            -
                      assert_equal 'rubyforge.org', cookie.domain
         | 
| 413 | 
            -
                      assert_equal true, cookie.for_domain
         | 
| 414 | 
            -
                      assert_equal '/', cookie.path
         | 
| 415 | 
            -
                      assert_equal false, cookie.httponly?
         | 
| 416 | 
            -
                    when 'Baz'
         | 
| 417 | 
            -
                      assert_equal 'Foo#Baz', cookie.value
         | 
| 418 | 
            -
                      assert_equal 'rubyforge.org', cookie.domain
         | 
| 419 | 
            -
                      assert_equal false, cookie.for_domain
         | 
| 420 | 
            -
                      assert_equal '/foo/', cookie.path
         | 
| 421 | 
            -
                      assert_equal false, cookie.httponly?
         | 
| 422 | 
            -
                    when 'Quux'
         | 
| 423 | 
            -
                      assert_equal 'Foo#Quux', cookie.value
         | 
| 424 | 
            -
                      assert_equal expires, cookie.expires
         | 
| 425 | 
            -
                      assert_equal 'rubyforge.org', cookie.domain
         | 
| 426 | 
            -
                      assert_equal true, cookie.for_domain
         | 
| 427 | 
            -
                      assert_equal '/', cookie.path
         | 
| 428 | 
            -
                      assert_equal true, cookie.httponly?
         | 
| 429 | 
            -
                    when 'Maxage'
         | 
| 430 | 
            -
                      assert_equal 'Foo#Maxage', cookie.value
         | 
| 431 | 
            -
                      assert_equal nil, cookie.max_age
         | 
| 432 | 
            -
                      assert_in_delta ma_cookie.expires, cookie.expires, 1
         | 
| 433 | 
            -
                    else
         | 
| 434 | 
            -
                      raise
         | 
| 435 | 
            -
                    end
         | 
| 436 | 
            -
                  }
         | 
| 438 | 
            +
                  assert_equal(5, @jar.cookies(url).length)
         | 
| 437 439 | 
             
                end
         | 
| 438 440 |  | 
| 439 | 
            -
                 | 
| 440 | 
            -
             | 
| 441 | 
            +
                def test_expire_cookies
         | 
| 442 | 
            +
                  url = URI 'http://rubyforge.org/'
         | 
| 441 443 |  | 
| 442 | 
            -
             | 
| 443 | 
            -
             | 
| 444 | 
            +
                  # Add one cookie with an expiration date in the future
         | 
| 445 | 
            +
                  cookie = HTTP::Cookie.new(cookie_values)
         | 
| 446 | 
            +
                  @jar.add(cookie)
         | 
| 447 | 
            +
                  assert_equal(1, @jar.cookies(url).length)
         | 
| 444 448 |  | 
| 445 | 
            -
             | 
| 446 | 
            -
             | 
| 447 | 
            -
             | 
| 448 | 
            -
                assert_equal(1, @jar.cookies(url).length)
         | 
| 449 | 
            +
                  # Add a second cookie
         | 
| 450 | 
            +
                  @jar.add(HTTP::Cookie.new(cookie_values(:name => 'Baz')))
         | 
| 451 | 
            +
                  assert_equal(2, @jar.cookies(url).length)
         | 
| 449 452 |  | 
| 450 | 
            -
             | 
| 451 | 
            -
             | 
| 452 | 
            -
                assert_equal(2, @jar.cookies(url).length)
         | 
| 453 | 
            +
                  # Make sure we can get the cookie from different paths
         | 
| 454 | 
            +
                  assert_equal(2, @jar.cookies(URI('http://rubyforge.org/login')).length)
         | 
| 453 455 |  | 
| 454 | 
            -
             | 
| 455 | 
            -
             | 
| 456 | 
            +
                  # Expire the first cookie
         | 
| 457 | 
            +
                  @jar.add(HTTP::Cookie.new(cookie_values(:expires => Time.now - (10 * 86400))))
         | 
| 458 | 
            +
                  assert_equal(1, @jar.cookies(url).length)
         | 
| 456 459 |  | 
| 457 | 
            -
             | 
| 458 | 
            -
             | 
| 459 | 
            -
             | 
| 460 | 
            +
                  # Expire the second cookie
         | 
| 461 | 
            +
                  @jar.add(HTTP::Cookie.new(cookie_values( :name => 'Baz', :expires => Time.now - (10 * 86400))))
         | 
| 462 | 
            +
                  assert_equal(0, @jar.cookies(url).length)
         | 
| 463 | 
            +
                end
         | 
| 460 464 |  | 
| 461 | 
            -
                 | 
| 462 | 
            -
             | 
| 463 | 
            -
             | 
| 464 | 
            -
              end
         | 
| 465 | 
            +
                def test_session_cookies
         | 
| 466 | 
            +
                  values = cookie_values(:expires => nil)
         | 
| 467 | 
            +
                  url = URI 'http://rubyforge.org/'
         | 
| 465 468 |  | 
| 466 | 
            -
             | 
| 467 | 
            -
             | 
| 468 | 
            -
             | 
| 469 | 
            -
             | 
| 470 | 
            -
             | 
| 471 | 
            -
             | 
| 472 | 
            -
             | 
| 473 | 
            -
             | 
| 474 | 
            -
             | 
| 475 | 
            -
             | 
| 476 | 
            -
             | 
| 477 | 
            -
             | 
| 478 | 
            -
             | 
| 479 | 
            -
             | 
| 480 | 
            -
             | 
| 481 | 
            -
             | 
| 482 | 
            -
             | 
| 483 | 
            -
             | 
| 484 | 
            -
             | 
| 485 | 
            -
             | 
| 486 | 
            -
             | 
| 487 | 
            -
             | 
| 488 | 
            -
             | 
| 489 | 
            -
             | 
| 490 | 
            -
             | 
| 491 | 
            -
             | 
| 492 | 
            -
             | 
| 493 | 
            -
             | 
| 494 | 
            -
                 | 
| 495 | 
            -
                # Now add a cookie with the path set to '/':
         | 
| 496 | 
            -
                @jar.add(HTTP::Cookie.new(values.merge(:name => 'has_root_path', :path => '/')))
         | 
| 497 | 
            -
                assert_equal(1, @jar.cookies(url).length)
         | 
| 498 | 
            -
              end
         | 
| 469 | 
            +
                  # Add one cookie with an expiration date in the future
         | 
| 470 | 
            +
                  cookie = HTTP::Cookie.new(values)
         | 
| 471 | 
            +
                  @jar.add(cookie)
         | 
| 472 | 
            +
                  assert_equal(1, @jar.cookies(url).length)
         | 
| 473 | 
            +
             | 
| 474 | 
            +
                  # Add a second cookie
         | 
| 475 | 
            +
                  @jar.add(HTTP::Cookie.new(values.merge(:name => 'Baz')))
         | 
| 476 | 
            +
                  assert_equal(2, @jar.cookies(url).length)
         | 
| 477 | 
            +
             | 
| 478 | 
            +
                  # Make sure we can get the cookie from different paths
         | 
| 479 | 
            +
                  assert_equal(2, @jar.cookies(URI('http://rubyforge.org/login')).length)
         | 
| 480 | 
            +
             | 
| 481 | 
            +
                  # Expire the first cookie
         | 
| 482 | 
            +
                  @jar.add(HTTP::Cookie.new(values.merge(:expires => Time.now - (10 * 86400))))
         | 
| 483 | 
            +
                  assert_equal(1, @jar.cookies(url).length)
         | 
| 484 | 
            +
             | 
| 485 | 
            +
                  # Expire the second cookie
         | 
| 486 | 
            +
                  @jar.add(HTTP::Cookie.new(values.merge(:name => 'Baz', :expires => Time.now - (10 * 86400))))
         | 
| 487 | 
            +
                  assert_equal(0, @jar.cookies(url).length)
         | 
| 488 | 
            +
             | 
| 489 | 
            +
                  # When given a URI with a blank path, CookieJar#cookies should return
         | 
| 490 | 
            +
                  # cookies with the path '/':
         | 
| 491 | 
            +
                  url = URI 'http://rubyforge.org'
         | 
| 492 | 
            +
                  assert_equal '', url.path
         | 
| 493 | 
            +
                  assert_equal(0, @jar.cookies(url).length)
         | 
| 494 | 
            +
                  # Now add a cookie with the path set to '/':
         | 
| 495 | 
            +
                  @jar.add(HTTP::Cookie.new(values.merge(:name => 'has_root_path', :path => '/')))
         | 
| 496 | 
            +
                  assert_equal(1, @jar.cookies(url).length)
         | 
| 497 | 
            +
                end
         | 
| 499 498 |  | 
| 500 | 
            -
             | 
| 501 | 
            -
             | 
| 502 | 
            -
             | 
| 499 | 
            +
                def test_paths
         | 
| 500 | 
            +
                  url = URI 'http://rubyforge.org/login'
         | 
| 501 | 
            +
                  values = cookie_values(:path => "/login", :expires => nil, :origin => url)
         | 
| 503 502 |  | 
| 504 | 
            -
             | 
| 505 | 
            -
             | 
| 506 | 
            -
             | 
| 507 | 
            -
             | 
| 503 | 
            +
                  # Add one cookie with an expiration date in the future
         | 
| 504 | 
            +
                  cookie = HTTP::Cookie.new(values)
         | 
| 505 | 
            +
                  @jar.add(cookie)
         | 
| 506 | 
            +
                  assert_equal(1, @jar.cookies(url).length)
         | 
| 508 507 |  | 
| 509 | 
            -
             | 
| 510 | 
            -
             | 
| 511 | 
            -
             | 
| 508 | 
            +
                  # Add a second cookie
         | 
| 509 | 
            +
                  @jar.add(HTTP::Cookie.new(values.merge( :name => 'Baz' )))
         | 
| 510 | 
            +
                  assert_equal(2, @jar.cookies(url).length)
         | 
| 512 511 |  | 
| 513 | 
            -
             | 
| 514 | 
            -
             | 
| 515 | 
            -
             | 
| 512 | 
            +
                  # Make sure we don't get the cookie in a different path
         | 
| 513 | 
            +
                  assert_equal(0, @jar.cookies(URI('http://rubyforge.org/hello')).length)
         | 
| 514 | 
            +
                  assert_equal(0, @jar.cookies(URI('http://rubyforge.org/')).length)
         | 
| 516 515 |  | 
| 517 | 
            -
             | 
| 518 | 
            -
             | 
| 519 | 
            -
             | 
| 516 | 
            +
                  # Expire the first cookie
         | 
| 517 | 
            +
                  @jar.add(HTTP::Cookie.new(values.merge( :expires => Time.now - (10 * 86400))))
         | 
| 518 | 
            +
                  assert_equal(1, @jar.cookies(url).length)
         | 
| 520 519 |  | 
| 521 | 
            -
             | 
| 522 | 
            -
             | 
| 523 | 
            -
             | 
| 524 | 
            -
             | 
| 525 | 
            -
             | 
| 520 | 
            +
                  # Expire the second cookie
         | 
| 521 | 
            +
                  @jar.add(HTTP::Cookie.new(values.merge( :name => 'Baz',
         | 
| 522 | 
            +
                        :expires => Time.now - (10 * 86400))))
         | 
| 523 | 
            +
                  assert_equal(0, @jar.cookies(url).length)
         | 
| 524 | 
            +
                end
         | 
| 526 525 |  | 
| 527 | 
            -
             | 
| 528 | 
            -
             | 
| 529 | 
            -
             | 
| 530 | 
            -
             | 
| 531 | 
            -
             | 
| 526 | 
            +
                def test_ssl_cookies
         | 
| 527 | 
            +
                  # thanks to michal "ocher" ochman for reporting the bug responsible for this test.
         | 
| 528 | 
            +
                  values = cookie_values(:expires => nil)
         | 
| 529 | 
            +
                  values_ssl = values.merge(:name => 'Baz', :domain => "#{values[:domain]}:443")
         | 
| 530 | 
            +
                  url = URI 'https://rubyforge.org/login'
         | 
| 532 531 |  | 
| 533 | 
            -
             | 
| 534 | 
            -
             | 
| 535 | 
            -
             | 
| 532 | 
            +
                  cookie = HTTP::Cookie.new(values)
         | 
| 533 | 
            +
                  @jar.add(cookie)
         | 
| 534 | 
            +
                  assert_equal(1, @jar.cookies(url).length, "did not handle SSL cookie")
         | 
| 536 535 |  | 
| 537 | 
            -
             | 
| 538 | 
            -
             | 
| 539 | 
            -
             | 
| 540 | 
            -
             | 
| 536 | 
            +
                  cookie = HTTP::Cookie.new(values_ssl)
         | 
| 537 | 
            +
                  @jar.add(cookie)
         | 
| 538 | 
            +
                  assert_equal(2, @jar.cookies(url).length, "did not handle SSL cookie with :443")
         | 
| 539 | 
            +
                end
         | 
| 541 540 |  | 
| 542 | 
            -
             | 
| 543 | 
            -
             | 
| 544 | 
            -
             | 
| 541 | 
            +
                def test_secure_cookie
         | 
| 542 | 
            +
                  nurl = URI 'http://rubyforge.org/login'
         | 
| 543 | 
            +
                  surl = URI 'https://rubyforge.org/login'
         | 
| 545 544 |  | 
| 546 | 
            -
             | 
| 547 | 
            -
             | 
| 548 | 
            -
             | 
| 549 | 
            -
             | 
| 545 | 
            +
                  nncookie = HTTP::Cookie.new(cookie_values(:name => 'Foo1', :origin => nurl))
         | 
| 546 | 
            +
                  sncookie = HTTP::Cookie.new(cookie_values(:name => 'Foo1', :origin => surl))
         | 
| 547 | 
            +
                  nscookie = HTTP::Cookie.new(cookie_values(:name => 'Foo2', :secure => true, :origin => nurl))
         | 
| 548 | 
            +
                  sscookie = HTTP::Cookie.new(cookie_values(:name => 'Foo2', :secure => true, :origin => surl))
         | 
| 550 549 |  | 
| 551 | 
            -
             | 
| 552 | 
            -
             | 
| 553 | 
            -
             | 
| 554 | 
            -
             | 
| 550 | 
            +
                  @jar.add(nncookie)
         | 
| 551 | 
            +
                  @jar.add(sncookie)
         | 
| 552 | 
            +
                  @jar.add(nscookie)
         | 
| 553 | 
            +
                  @jar.add(sscookie)
         | 
| 555 554 |  | 
| 556 | 
            -
             | 
| 557 | 
            -
             | 
| 558 | 
            -
             | 
| 555 | 
            +
                  assert_equal('Foo1',      @jar.cookies(nurl).map { |c| c.name }.sort.join(' ') )
         | 
| 556 | 
            +
                  assert_equal('Foo1 Foo2', @jar.cookies(surl).map { |c| c.name }.sort.join(' ') )
         | 
| 557 | 
            +
                end
         | 
| 559 558 |  | 
| 560 | 
            -
             | 
| 561 | 
            -
             | 
| 562 | 
            -
             | 
| 559 | 
            +
                def _test_delete
         | 
| 560 | 
            +
                  nurl = URI 'http://rubyforge.org/login'
         | 
| 561 | 
            +
                  surl = URI 'https://rubyforge.org/login'
         | 
| 563 562 |  | 
| 564 | 
            -
             | 
| 565 | 
            -
             | 
| 563 | 
            +
                  cookie1 = HTTP::Cookie.new(cookie_values(:name => 'Foo1', :origin => nurl))
         | 
| 564 | 
            +
                  cookie2 = HTTP::Cookie.new(cookie_values(:name => 'Foo1', :origin => surl))
         | 
| 566 565 |  | 
| 567 | 
            -
             | 
| 568 | 
            -
             | 
| 569 | 
            -
             | 
| 570 | 
            -
             | 
| 571 | 
            -
             | 
| 566 | 
            +
                  @jar.add(nncookie)
         | 
| 567 | 
            +
                  @jar.add(sncookie)
         | 
| 568 | 
            +
                  @jar.add(nscookie)
         | 
| 569 | 
            +
                  @jar.add(sscookie)
         | 
| 570 | 
            +
                end
         | 
| 572 571 |  | 
| 573 | 
            -
             | 
| 574 | 
            -
             | 
| 575 | 
            -
             | 
| 576 | 
            -
             | 
| 577 | 
            -
             | 
| 578 | 
            -
             | 
| 579 | 
            -
             | 
| 580 | 
            -
                  @jar << HTTP::Cookie.new(cookie_values(
         | 
| 581 | 
            -
                      :name => 'Foo%d' % i,
         | 
| 582 | 
            -
                      :value => 'Bar%d' % i,
         | 
| 583 | 
            -
                      :domain => uri.host,
         | 
| 584 | 
            -
                      :for_domain => true,
         | 
| 585 | 
            -
                      :path => '/dir%d/' % (i / 2),
         | 
| 586 | 
            -
                      :origin => uri
         | 
| 587 | 
            -
                      )).tap { |cookie|
         | 
| 588 | 
            -
                    cookie.created_at = i == 42 ? date - i : date
         | 
| 589 | 
            -
                  }
         | 
| 590 | 
            -
                }
         | 
| 591 | 
            -
                assert_equal limit_per_domain + 1, @jar.to_a.size
         | 
| 592 | 
            -
                @jar.cleanup
         | 
| 593 | 
            -
                count = @jar.to_a.size
         | 
| 594 | 
            -
                assert_equal limit_per_domain, count
         | 
| 595 | 
            -
                assert_equal [*1..41] + [*43..(limit_per_domain + 1)], @jar.map { |cookie|
         | 
| 596 | 
            -
                  cookie.name[/(\d+)$/].to_i
         | 
| 597 | 
            -
                }.sort
         | 
| 598 | 
            -
             | 
| 599 | 
            -
                hlimit = HTTP::Cookie::MAX_COOKIES_TOTAL
         | 
| 600 | 
            -
             | 
| 601 | 
            -
                n = hlimit / limit_per_domain * 2
         | 
| 602 | 
            -
             | 
| 603 | 
            -
                (1..n).each { |i|
         | 
| 604 | 
            -
                  (1..(limit_per_domain + 1)).each { |j|
         | 
| 605 | 
            -
                    uri = URI('http://www%d.example.jp/' % i)
         | 
| 572 | 
            +
                def test_max_cookies
         | 
| 573 | 
            +
                  slimit = HTTP::Cookie::MAX_COOKIES_TOTAL + @gc_threshold
         | 
| 574 | 
            +
             | 
| 575 | 
            +
                  limit_per_domain = HTTP::Cookie::MAX_COOKIES_PER_DOMAIN
         | 
| 576 | 
            +
                  uri = URI('http://www.example.org/')
         | 
| 577 | 
            +
                  date = Time.at(Time.now.to_i + 86400)
         | 
| 578 | 
            +
                  (1..(limit_per_domain + 1)).each { |i|
         | 
| 606 579 | 
             
                    @jar << HTTP::Cookie.new(cookie_values(
         | 
| 607 | 
            -
                        :name => ' | 
| 608 | 
            -
                        :value => ' | 
| 580 | 
            +
                        :name => 'Foo%d' % i,
         | 
| 581 | 
            +
                        :value => 'Bar%d' % i,
         | 
| 609 582 | 
             
                        :domain => uri.host,
         | 
| 610 583 | 
             
                        :for_domain => true,
         | 
| 611 584 | 
             
                        :path => '/dir%d/' % (i / 2),
         | 
| 612 585 | 
             
                        :origin => uri
         | 
| 613 586 | 
             
                        )).tap { |cookie|
         | 
| 614 | 
            -
                      cookie.created_at = i ==  | 
| 587 | 
            +
                      cookie.created_at = i == 42 ? date - i : date
         | 
| 615 588 | 
             
                    }
         | 
| 616 | 
            -
                    count += 1
         | 
| 617 589 | 
             
                  }
         | 
| 618 | 
            -
             | 
| 619 | 
            -
             | 
| 620 | 
            -
             | 
| 621 | 
            -
             | 
| 622 | 
            -
             | 
| 623 | 
            -
             | 
| 624 | 
            -
             | 
| 625 | 
            -
             | 
| 626 | 
            -
             | 
| 590 | 
            +
                  assert_equal limit_per_domain + 1, @jar.to_a.size
         | 
| 591 | 
            +
                  @jar.cleanup
         | 
| 592 | 
            +
                  count = @jar.to_a.size
         | 
| 593 | 
            +
                  assert_equal limit_per_domain, count
         | 
| 594 | 
            +
                  assert_equal [*1..41] + [*43..(limit_per_domain + 1)], @jar.map { |cookie|
         | 
| 595 | 
            +
                    cookie.name[/(\d+)$/].to_i
         | 
| 596 | 
            +
                  }.sort
         | 
| 597 | 
            +
             | 
| 598 | 
            +
                  hlimit = HTTP::Cookie::MAX_COOKIES_TOTAL
         | 
| 599 | 
            +
             | 
| 600 | 
            +
                  n = hlimit / limit_per_domain * 2
         | 
| 601 | 
            +
             | 
| 602 | 
            +
                  (1..n).each { |i|
         | 
| 603 | 
            +
                    (1..(limit_per_domain + 1)).each { |j|
         | 
| 604 | 
            +
                      uri = URI('http://www%d.example.jp/' % i)
         | 
| 605 | 
            +
                      @jar << HTTP::Cookie.new(cookie_values(
         | 
| 606 | 
            +
                          :name => 'Baz%d' % j,
         | 
| 607 | 
            +
                          :value => 'www%d.example.jp' % j,
         | 
| 608 | 
            +
                          :domain => uri.host,
         | 
| 609 | 
            +
                          :for_domain => true,
         | 
| 610 | 
            +
                          :path => '/dir%d/' % (i / 2),
         | 
| 611 | 
            +
                          :origin => uri
         | 
| 612 | 
            +
                          )).tap { |cookie|
         | 
| 613 | 
            +
                        cookie.created_at = i == j ? date - i : date
         | 
| 614 | 
            +
                      }
         | 
| 615 | 
            +
                      count += 1
         | 
| 616 | 
            +
                    }
         | 
| 617 | 
            +
                  }
         | 
| 618 | 
            +
             | 
| 619 | 
            +
                  assert_equal true, count > slimit
         | 
| 620 | 
            +
                  assert_equal true, @jar.to_a.size <= slimit
         | 
| 621 | 
            +
                  @jar.cleanup
         | 
| 622 | 
            +
                  assert_equal hlimit, @jar.to_a.size
         | 
| 623 | 
            +
                  assert_equal false, @jar.any? { |cookie|
         | 
| 624 | 
            +
                    cookie.domain == cookie.value
         | 
| 625 | 
            +
                  }
         | 
| 626 | 
            +
                end
         | 
| 627 627 | 
             
              end
         | 
| 628 | 
            -
            end
         | 
| 629 628 |  | 
| 630 | 
            -
            module TestHTTPCookieJar
         | 
| 631 629 | 
             
              class WithHashStore < Test::Unit::TestCase
         | 
| 632 630 | 
             
                include Tests
         | 
| 633 631 | 
             
              end
         |