http-cookie 1.0.0.pre6 → 1.0.0.pre7
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/lib/http/cookie.rb +19 -15
 - data/lib/http/cookie/version.rb +1 -1
 - data/lib/http/cookie_jar/abstract_store.rb +18 -2
 - data/lib/http/cookie_jar/hash_store.rb +55 -39
 - data/lib/http/cookie_jar/mozilla_store.rb +72 -26
 - data/test/test_http_cookie.rb +39 -0
 - data/test/test_http_cookie_jar.rb +73 -49
 - metadata +2 -2
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA1:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 36d302ade786727a1d6a34617d6f5fd5a0849ad5
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 9f0f607f3f78427ec0f1737ce770e58aeb831110
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 2288ba0ccc9dda414610bb4b87765492c480c1aa886c2b7b716c3d57a4373baa2de020cffb4cb93cfbb00f5dd7283a814c98573a3bbcc752f6f213a0dd8f290c
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: b08eb434043d9601cf743ba30a4c279356da12b4da8c243d37f9f8974ebbfe8d8b55fbeb28d2020e9f346aebcd545f5abedd8b8bb9ecb0eb76dc890576491688
         
     | 
    
        data/lib/http/cookie.rb
    CHANGED
    
    | 
         @@ -170,7 +170,7 @@ class HTTP::Cookie 
     | 
|
| 
       170 
170 
     | 
    
         
             
                  raise ArgumentError, "wrong number of arguments (#{args.size} for 1-3)"
         
     | 
| 
       171 
171 
     | 
    
         
             
                end
         
     | 
| 
       172 
172 
     | 
    
         
             
                for_domain = false
         
     | 
| 
       173 
     | 
    
         
            -
                max_age = origin = nil
         
     | 
| 
      
 173 
     | 
    
         
            +
                domain = max_age = origin = nil
         
     | 
| 
       174 
174 
     | 
    
         
             
                attr_hash.each_pair { |key, val|
         
     | 
| 
       175 
175 
     | 
    
         
             
                  skey = key.to_s.downcase
         
     | 
| 
       176 
176 
     | 
    
         
             
                  if skey.sub!(/\?\z/, '')
         
     | 
| 
         @@ -179,6 +179,8 @@ class HTTP::Cookie 
     | 
|
| 
       179 
179 
     | 
    
         
             
                  case skey
         
     | 
| 
       180 
180 
     | 
    
         
             
                  when 'for_domain'
         
     | 
| 
       181 
181 
     | 
    
         
             
                    for_domain = !!val
         
     | 
| 
      
 182 
     | 
    
         
            +
                  when 'domain'
         
     | 
| 
      
 183 
     | 
    
         
            +
                    domain = val
         
     | 
| 
       182 
184 
     | 
    
         
             
                  when 'origin'
         
     | 
| 
       183 
185 
     | 
    
         
             
                    origin = val
         
     | 
| 
       184 
186 
     | 
    
         
             
                  when 'max_age'
         
     | 
| 
         @@ -193,6 +195,7 @@ class HTTP::Cookie 
     | 
|
| 
       193 
195 
     | 
    
         
             
                  raise ArgumentError, "at least name and value must be specified"
         
     | 
| 
       194 
196 
     | 
    
         
             
                end
         
     | 
| 
       195 
197 
     | 
    
         
             
                @for_domain = for_domain
         
     | 
| 
      
 198 
     | 
    
         
            +
                self.domain = domain if domain
         
     | 
| 
       196 
199 
     | 
    
         
             
                self.origin = origin if origin
         
     | 
| 
       197 
200 
     | 
    
         
             
                self.max_age = max_age if max_age
         
     | 
| 
       198 
201 
     | 
    
         
             
              end
         
     | 
| 
         @@ -283,8 +286,8 @@ class HTTP::Cookie 
     | 
|
| 
       283 
286 
     | 
    
         
             
                        begin
         
     | 
| 
       284 
287 
     | 
    
         
             
                          case aname
         
     | 
| 
       285 
288 
     | 
    
         
             
                          when 'domain'
         
     | 
| 
       286 
     | 
    
         
            -
                            cookie.domain = avalue
         
     | 
| 
       287 
289 
     | 
    
         
             
                            cookie.for_domain = true
         
     | 
| 
      
 290 
     | 
    
         
            +
                            cookie.domain = avalue # This may negate @for_domain
         
     | 
| 
       288 
291 
     | 
    
         
             
                          when 'path'
         
     | 
| 
       289 
292 
     | 
    
         
             
                            cookie.path = avalue
         
     | 
| 
       290 
293 
     | 
    
         
             
                          when 'expires'
         
     | 
| 
         @@ -376,6 +379,10 @@ class HTTP::Cookie 
     | 
|
| 
       376 
379 
     | 
    
         
             
                  end
         
     | 
| 
       377 
380 
     | 
    
         
             
                  @domain_name = DomainName.new(domain)
         
     | 
| 
       378 
381 
     | 
    
         
             
                end
         
     | 
| 
      
 382 
     | 
    
         
            +
                # RFC 6265 5.3 5.
         
     | 
| 
      
 383 
     | 
    
         
            +
                if @domain_name.domain.nil? # a public suffix or IP address
         
     | 
| 
      
 384 
     | 
    
         
            +
                  @for_domain = false
         
     | 
| 
      
 385 
     | 
    
         
            +
                end
         
     | 
| 
       379 
386 
     | 
    
         
             
                @domain = @domain_name.hostname
         
     | 
| 
       380 
387 
     | 
    
         
             
              end
         
     | 
| 
       381 
388 
     | 
    
         | 
| 
         @@ -388,7 +395,7 @@ class HTTP::Cookie 
     | 
|
| 
       388 
395 
     | 
    
         
             
              # Returns the domain attribute value as a DomainName object.
         
     | 
| 
       389 
396 
     | 
    
         
             
              attr_reader :domain_name
         
     | 
| 
       390 
397 
     | 
    
         | 
| 
       391 
     | 
    
         
            -
              # The domain flag.
         
     | 
| 
      
 398 
     | 
    
         
            +
              # The domain flag. (the opposite of host-only-flag)
         
     | 
| 
       392 
399 
     | 
    
         
             
              #
         
     | 
| 
       393 
400 
     | 
    
         
             
              # If this flag is true, this cookie will be sent to any host in the
         
     | 
| 
       394 
401 
     | 
    
         
             
              # \#domain, including the host domain itself.  If it is false, this
         
     | 
| 
         @@ -419,20 +426,20 @@ class HTTP::Cookie 
     | 
|
| 
       419 
426 
     | 
    
         
             
                @origin = origin
         
     | 
| 
       420 
427 
     | 
    
         
             
              end
         
     | 
| 
       421 
428 
     | 
    
         | 
| 
       422 
     | 
    
         
            -
              # The secure flag.
         
     | 
| 
      
 429 
     | 
    
         
            +
              # The secure flag. (secure-only-flag)
         
     | 
| 
       423 
430 
     | 
    
         
             
              #
         
     | 
| 
       424 
431 
     | 
    
         
             
              # A cookie with this flag on should only be sent via a secure
         
     | 
| 
       425 
432 
     | 
    
         
             
              # protocol like HTTPS.
         
     | 
| 
       426 
433 
     | 
    
         
             
              attr_accessor :secure
         
     | 
| 
       427 
434 
     | 
    
         
             
              alias secure? secure
         
     | 
| 
       428 
435 
     | 
    
         | 
| 
       429 
     | 
    
         
            -
              # The HttpOnly flag.
         
     | 
| 
      
 436 
     | 
    
         
            +
              # The HttpOnly flag. (http-only-flag)
         
     | 
| 
       430 
437 
     | 
    
         
             
              #
         
     | 
| 
       431 
438 
     | 
    
         
             
              # A cookie with this flag on should be hidden from a client script.
         
     | 
| 
       432 
439 
     | 
    
         
             
              attr_accessor :httponly
         
     | 
| 
       433 
440 
     | 
    
         
             
              alias httponly? httponly
         
     | 
| 
       434 
441 
     | 
    
         | 
| 
       435 
     | 
    
         
            -
              # The session flag.
         
     | 
| 
      
 442 
     | 
    
         
            +
              # The session flag. (the opposite of persistent-flag)
         
     | 
| 
       436 
443 
     | 
    
         
             
              #
         
     | 
| 
       437 
444 
     | 
    
         
             
              # A cookie with this flag on should be hidden from a client script.
         
     | 
| 
       438 
445 
     | 
    
         
             
              attr_reader :session
         
     | 
| 
         @@ -514,16 +521,12 @@ class HTTP::Cookie 
     | 
|
| 
       514 
521 
     | 
    
         
             
                host = DomainName.new(uri.host)
         
     | 
| 
       515 
522 
     | 
    
         | 
| 
       516 
523 
     | 
    
         
             
                # RFC 6265 5.3
         
     | 
| 
       517 
     | 
    
         
            -
                 
     | 
| 
       518 
     | 
    
         
            -
                return @domain.nil? || host.hostname == @domain unless @for_domain
         
     | 
| 
      
 524 
     | 
    
         
            +
                return true if host.hostname == @domain
         
     | 
| 
       519 
525 
     | 
    
         | 
| 
       520 
     | 
    
         
            -
                if host 
     | 
| 
       521 
     | 
    
         
            -
                   
     | 
| 
       522 
     | 
    
         
            -
                elsif host.hostname == @domain
         
     | 
| 
       523 
     | 
    
         
            -
                  @for_domain = false
         
     | 
| 
       524 
     | 
    
         
            -
                  true
         
     | 
| 
      
 526 
     | 
    
         
            +
                if @for_domain  # !host-only-flag
         
     | 
| 
      
 527 
     | 
    
         
            +
                  host.cookie_domain?(@domain_name)
         
     | 
| 
       525 
528 
     | 
    
         
             
                else
         
     | 
| 
       526 
     | 
    
         
            -
                   
     | 
| 
      
 529 
     | 
    
         
            +
                  @domain.nil?
         
     | 
| 
       527 
530 
     | 
    
         
             
                end
         
     | 
| 
       528 
531 
     | 
    
         
             
              end
         
     | 
| 
       529 
532 
     | 
    
         | 
| 
         @@ -534,6 +537,7 @@ class HTTP::Cookie 
     | 
|
| 
       534 
537 
     | 
    
         
             
                  raise "cannot tell if this cookie is valid because the domain is unknown"
         
     | 
| 
       535 
538 
     | 
    
         
             
                end
         
     | 
| 
       536 
539 
     | 
    
         
             
                uri = URI(uri)
         
     | 
| 
      
 540 
     | 
    
         
            +
                # RFC 6265 5.4
         
     | 
| 
       537 
541 
     | 
    
         
             
                return false if secure? && !(URI::HTTPS === uri)
         
     | 
| 
       538 
542 
     | 
    
         
             
                acceptable_from_uri?(uri) && HTTP::Cookie.path_match?(@path, uri.path)
         
     | 
| 
       539 
543 
     | 
    
         
             
              end
         
     | 
| 
         @@ -556,7 +560,7 @@ class HTTP::Cookie 
     | 
|
| 
       556 
560 
     | 
    
         
             
                  raise "origin must be specified to produce a value for Set-Cookie"
         
     | 
| 
       557 
561 
     | 
    
         | 
| 
       558 
562 
     | 
    
         
             
                string = "#{@name}=#{Scanner.quote(@value)}"
         
     | 
| 
       559 
     | 
    
         
            -
                if @for_domain 
     | 
| 
      
 563 
     | 
    
         
            +
                if @for_domain
         
     | 
| 
       560 
564 
     | 
    
         
             
                  string << "; Domain=#{@domain}"
         
     | 
| 
       561 
565 
     | 
    
         
             
                end
         
     | 
| 
       562 
566 
     | 
    
         
             
                if (origin + './').path != @path
         
     | 
    
        data/lib/http/cookie/version.rb
    CHANGED
    
    
| 
         @@ -1,4 +1,8 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'monitor'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
       1 
3 
     | 
    
         
             
            class HTTP::CookieJar::AbstractStore
         
     | 
| 
      
 4 
     | 
    
         
            +
              include MonitorMixin
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
       2 
6 
     | 
    
         
             
              class << self
         
     | 
| 
       3 
7 
     | 
    
         
             
                @@class_map = {}
         
     | 
| 
       4 
8 
     | 
    
         | 
| 
         @@ -31,6 +35,7 @@ class HTTP::CookieJar::AbstractStore 
     | 
|
| 
       31 
35 
     | 
    
         
             
              private :default_options
         
     | 
| 
       32 
36 
     | 
    
         | 
| 
       33 
37 
     | 
    
         
             
              def initialize(options = nil)
         
     | 
| 
      
 38 
     | 
    
         
            +
                super() # MonitorMixin
         
     | 
| 
       34 
39 
     | 
    
         
             
                options ||= {}
         
     | 
| 
       35 
40 
     | 
    
         
             
                @logger = options[:logger]
         
     | 
| 
       36 
41 
     | 
    
         
             
                # Initializes each instance variable of the same name as option
         
     | 
| 
         @@ -50,6 +55,11 @@ class HTTP::CookieJar::AbstractStore 
     | 
|
| 
       50 
55 
     | 
    
         
             
                self
         
     | 
| 
       51 
56 
     | 
    
         
             
              end
         
     | 
| 
       52 
57 
     | 
    
         | 
| 
      
 58 
     | 
    
         
            +
              def delete(cookie)
         
     | 
| 
      
 59 
     | 
    
         
            +
                raise
         
     | 
| 
      
 60 
     | 
    
         
            +
                self
         
     | 
| 
      
 61 
     | 
    
         
            +
              end
         
     | 
| 
      
 62 
     | 
    
         
            +
             
     | 
| 
       53 
63 
     | 
    
         
             
              # Iterates over all cookies that are not expired.
         
     | 
| 
       54 
64 
     | 
    
         
             
              #
         
     | 
| 
       55 
65 
     | 
    
         
             
              # An optional argument +uri+ specifies a URI object indicating the
         
     | 
| 
         @@ -60,7 +70,13 @@ class HTTP::CookieJar::AbstractStore 
     | 
|
| 
       60 
70 
     | 
    
         
             
              # If (and only if) the +uri+ option is given, last access time of
         
     | 
| 
       61 
71 
     | 
    
         
             
              # each cookie is updated to the current time.
         
     | 
| 
       62 
72 
     | 
    
         
             
              def each(uri = nil, &block)
         
     | 
| 
       63 
     | 
    
         
            -
                 
     | 
| 
      
 73 
     | 
    
         
            +
                if uri
         
     | 
| 
      
 74 
     | 
    
         
            +
                  raise
         
     | 
| 
      
 75 
     | 
    
         
            +
                else
         
     | 
| 
      
 76 
     | 
    
         
            +
                  synchronize {
         
     | 
| 
      
 77 
     | 
    
         
            +
                    raise
         
     | 
| 
      
 78 
     | 
    
         
            +
                  }
         
     | 
| 
      
 79 
     | 
    
         
            +
                end
         
     | 
| 
       64 
80 
     | 
    
         
             
                self
         
     | 
| 
       65 
81 
     | 
    
         
             
              end
         
     | 
| 
       66 
82 
     | 
    
         
             
              include Enumerable
         
     | 
| 
         @@ -80,7 +96,7 @@ class HTTP::CookieJar::AbstractStore 
     | 
|
| 
       80 
96 
     | 
    
         
             
                else
         
     | 
| 
       81 
97 
     | 
    
         
             
                  select(&:expired?)
         
     | 
| 
       82 
98 
     | 
    
         
             
                end.each { |cookie|
         
     | 
| 
       83 
     | 
    
         
            -
                   
     | 
| 
      
 99 
     | 
    
         
            +
                  delete(cookie)
         
     | 
| 
       84 
100 
     | 
    
         
             
                }
         
     | 
| 
       85 
101 
     | 
    
         
             
                # subclasses can optionally remove over-the-limit cookies.
         
     | 
| 
       86 
102 
     | 
    
         
             
                self
         
     | 
| 
         @@ -10,6 +10,15 @@ end 
     | 
|
| 
       10 
10 
     | 
    
         | 
| 
       11 
11 
     | 
    
         
             
            class HTTP::CookieJar
         
     | 
| 
       12 
12 
     | 
    
         
             
              # A store class that uses a hash-based cookie store.
         
     | 
| 
      
 13 
     | 
    
         
            +
              #
         
     | 
| 
      
 14 
     | 
    
         
            +
              # In this store, cookies that share the same name, domain and path
         
     | 
| 
      
 15 
     | 
    
         
            +
              # will overwrite each other regardless of the `for_domain` flag
         
     | 
| 
      
 16 
     | 
    
         
            +
              # value.  This store is built after the storage model described in
         
     | 
| 
      
 17 
     | 
    
         
            +
              # RFC 6265 5.3 where there is no mention of how the host-only-flag
         
     | 
| 
      
 18 
     | 
    
         
            +
              # affects in storing cookies.  On the other hand, in MozillaStore
         
     | 
| 
      
 19 
     | 
    
         
            +
              # two cookies with the same name, domain and path coexist as long as
         
     | 
| 
      
 20 
     | 
    
         
            +
              # they differ in the `for_domain` flag value, which means they need
         
     | 
| 
      
 21 
     | 
    
         
            +
              # to be expired individually.
         
     | 
| 
       13 
22 
     | 
    
         
             
              class HashStore < AbstractStore
         
     | 
| 
       14 
23 
     | 
    
         
             
                def default_options
         
     | 
| 
       15 
24 
     | 
    
         
             
                  {
         
     | 
| 
         @@ -57,7 +66,6 @@ class HTTP::CookieJar 
     | 
|
| 
       57 
66 
     | 
    
         
             
                  path_cookies.delete(cookie.name)
         
     | 
| 
       58 
67 
     | 
    
         
             
                  self
         
     | 
| 
       59 
68 
     | 
    
         
             
                end
         
     | 
| 
       60 
     | 
    
         
            -
                private :delete
         
     | 
| 
       61 
69 
     | 
    
         | 
| 
       62 
70 
     | 
    
         
             
                def each(uri = nil)
         
     | 
| 
       63 
71 
     | 
    
         
             
                  now = Time.now
         
     | 
| 
         @@ -82,15 +90,17 @@ class HTTP::CookieJar 
     | 
|
| 
       82 
90 
     | 
    
         
             
                      }
         
     | 
| 
       83 
91 
     | 
    
         
             
                    }
         
     | 
| 
       84 
92 
     | 
    
         
             
                  else
         
     | 
| 
       85 
     | 
    
         
            -
                     
     | 
| 
       86 
     | 
    
         
            -
                       
     | 
| 
       87 
     | 
    
         
            -
                         
     | 
| 
       88 
     | 
    
         
            -
                           
     | 
| 
       89 
     | 
    
         
            -
                             
     | 
| 
       90 
     | 
    
         
            -
             
     | 
| 
       91 
     | 
    
         
            -
                             
     | 
| 
       92 
     | 
    
         
            -
             
     | 
| 
       93 
     | 
    
         
            -
             
     | 
| 
      
 93 
     | 
    
         
            +
                    synchronize {
         
     | 
| 
      
 94 
     | 
    
         
            +
                      @jar.each { |domain, paths|
         
     | 
| 
      
 95 
     | 
    
         
            +
                        paths.each { |path, hash|
         
     | 
| 
      
 96 
     | 
    
         
            +
                          hash.delete_if { |name, cookie|
         
     | 
| 
      
 97 
     | 
    
         
            +
                            if cookie.expired?(now)
         
     | 
| 
      
 98 
     | 
    
         
            +
                              true
         
     | 
| 
      
 99 
     | 
    
         
            +
                            else
         
     | 
| 
      
 100 
     | 
    
         
            +
                              yield cookie
         
     | 
| 
      
 101 
     | 
    
         
            +
                              false
         
     | 
| 
      
 102 
     | 
    
         
            +
                            end
         
     | 
| 
      
 103 
     | 
    
         
            +
                          }
         
     | 
| 
       94 
104 
     | 
    
         
             
                        }
         
     | 
| 
       95 
105 
     | 
    
         
             
                      }
         
     | 
| 
       96 
106 
     | 
    
         
             
                    }
         
     | 
| 
         @@ -110,45 +120,51 @@ class HTTP::CookieJar 
     | 
|
| 
       110 
120 
     | 
    
         
             
                def cleanup(session = false)
         
     | 
| 
       111 
121 
     | 
    
         
             
                  now = Time.now
         
     | 
| 
       112 
122 
     | 
    
         
             
                  all_cookies = []
         
     | 
| 
       113 
     | 
    
         
            -
             
     | 
| 
       114 
     | 
    
         
            -
             
     | 
| 
       115 
     | 
    
         
            -
             
     | 
| 
       116 
     | 
    
         
            -
             
     | 
| 
       117 
     | 
    
         
            -
             
     | 
| 
       118 
     | 
    
         
            -
             
     | 
| 
       119 
     | 
    
         
            -
             
     | 
| 
       120 
     | 
    
         
            -
             
     | 
| 
       121 
     | 
    
         
            -
             
     | 
| 
       122 
     | 
    
         
            -
                           
     | 
| 
       123 
     | 
    
         
            -
             
     | 
| 
      
 123 
     | 
    
         
            +
             
     | 
| 
      
 124 
     | 
    
         
            +
                  synchronize {
         
     | 
| 
      
 125 
     | 
    
         
            +
                    break if @gc_index == 0
         
     | 
| 
      
 126 
     | 
    
         
            +
             
     | 
| 
      
 127 
     | 
    
         
            +
                    @jar.each { |domain, paths|
         
     | 
| 
      
 128 
     | 
    
         
            +
                      domain_cookies = []
         
     | 
| 
      
 129 
     | 
    
         
            +
             
     | 
| 
      
 130 
     | 
    
         
            +
                      paths.each { |path, hash|
         
     | 
| 
      
 131 
     | 
    
         
            +
                        hash.delete_if { |name, cookie|
         
     | 
| 
      
 132 
     | 
    
         
            +
                          if cookie.expired?(now) || (session && cookie.session?)
         
     | 
| 
      
 133 
     | 
    
         
            +
                            true
         
     | 
| 
      
 134 
     | 
    
         
            +
                          else
         
     | 
| 
      
 135 
     | 
    
         
            +
                            domain_cookies << cookie
         
     | 
| 
      
 136 
     | 
    
         
            +
                            false
         
     | 
| 
      
 137 
     | 
    
         
            +
                          end
         
     | 
| 
      
 138 
     | 
    
         
            +
                        }
         
     | 
| 
       124 
139 
     | 
    
         
             
                      }
         
     | 
| 
      
 140 
     | 
    
         
            +
             
     | 
| 
      
 141 
     | 
    
         
            +
                      if (debt = domain_cookies.size - HTTP::Cookie::MAX_COOKIES_PER_DOMAIN) > 0
         
     | 
| 
      
 142 
     | 
    
         
            +
                        domain_cookies.sort_by!(&:created_at)
         
     | 
| 
      
 143 
     | 
    
         
            +
                        domain_cookies.slice!(0, debt).each { |cookie|
         
     | 
| 
      
 144 
     | 
    
         
            +
                          delete(cookie)
         
     | 
| 
      
 145 
     | 
    
         
            +
                        }
         
     | 
| 
      
 146 
     | 
    
         
            +
                      end
         
     | 
| 
      
 147 
     | 
    
         
            +
             
     | 
| 
      
 148 
     | 
    
         
            +
                      all_cookies.concat(domain_cookies)
         
     | 
| 
       125 
149 
     | 
    
         
             
                    }
         
     | 
| 
       126 
150 
     | 
    
         | 
| 
       127 
     | 
    
         
            -
                    if (debt =  
     | 
| 
       128 
     | 
    
         
            -
                       
     | 
| 
       129 
     | 
    
         
            -
                       
     | 
| 
      
 151 
     | 
    
         
            +
                    if (debt = all_cookies.size - HTTP::Cookie::MAX_COOKIES_TOTAL) > 0
         
     | 
| 
      
 152 
     | 
    
         
            +
                      all_cookies.sort_by!(&:created_at)
         
     | 
| 
      
 153 
     | 
    
         
            +
                      all_cookies.slice!(0, debt).each { |cookie|
         
     | 
| 
       130 
154 
     | 
    
         
             
                        delete(cookie)
         
     | 
| 
       131 
155 
     | 
    
         
             
                      }
         
     | 
| 
       132 
156 
     | 
    
         
             
                    end
         
     | 
| 
       133 
157 
     | 
    
         | 
| 
       134 
     | 
    
         
            -
                     
     | 
| 
       135 
     | 
    
         
            -
             
     | 
| 
       136 
     | 
    
         
            -
             
     | 
| 
       137 
     | 
    
         
            -
             
     | 
| 
       138 
     | 
    
         
            -
             
     | 
| 
       139 
     | 
    
         
            -
                    all_cookies.slice!(0, debt).each { |cookie|
         
     | 
| 
       140 
     | 
    
         
            -
                      delete(cookie)
         
     | 
| 
      
 158 
     | 
    
         
            +
                    @jar.delete_if { |domain, paths|
         
     | 
| 
      
 159 
     | 
    
         
            +
                      paths.delete_if { |path, hash|
         
     | 
| 
      
 160 
     | 
    
         
            +
                        hash.empty?
         
     | 
| 
      
 161 
     | 
    
         
            +
                      }
         
     | 
| 
      
 162 
     | 
    
         
            +
                      paths.empty?
         
     | 
| 
       141 
163 
     | 
    
         
             
                    }
         
     | 
| 
       142 
     | 
    
         
            -
                  end
         
     | 
| 
       143 
164 
     | 
    
         | 
| 
       144 
     | 
    
         
            -
             
     | 
| 
       145 
     | 
    
         
            -
                    paths.delete_if { |path, hash|
         
     | 
| 
       146 
     | 
    
         
            -
                      hash.empty?
         
     | 
| 
       147 
     | 
    
         
            -
                    }
         
     | 
| 
       148 
     | 
    
         
            -
                    paths.empty?
         
     | 
| 
      
 165 
     | 
    
         
            +
                    @gc_index = 0
         
     | 
| 
       149 
166 
     | 
    
         
             
                  }
         
     | 
| 
       150 
     | 
    
         
            -
             
     | 
| 
       151 
     | 
    
         
            -
                  @gc_index = 0
         
     | 
| 
      
 167 
     | 
    
         
            +
                  self
         
     | 
| 
       152 
168 
     | 
    
         
             
                end
         
     | 
| 
       153 
169 
     | 
    
         
             
              end
         
     | 
| 
       154 
170 
     | 
    
         
             
            end
         
     | 
| 
         @@ -5,6 +5,9 @@ require 'sqlite3' 
     | 
|
| 
       5 
5 
     | 
    
         
             
            class HTTP::CookieJar
         
     | 
| 
       6 
6 
     | 
    
         
             
              # A store class that uses Mozilla compatible SQLite3 database as
         
     | 
| 
       7 
7 
     | 
    
         
             
              # backing store.
         
     | 
| 
      
 8 
     | 
    
         
            +
              #
         
     | 
| 
      
 9 
     | 
    
         
            +
              # Session cookies are stored separately on memory and will not be
         
     | 
| 
      
 10 
     | 
    
         
            +
              # stored persistently in the SQLite3 database.
         
     | 
| 
       8 
11 
     | 
    
         
             
              class MozillaStore < AbstractStore
         
     | 
| 
       9 
12 
     | 
    
         
             
                SCHEMA_VERSION = 5
         
     | 
| 
       10 
13 
     | 
    
         | 
| 
         @@ -55,6 +58,7 @@ class HTTP::CookieJar 
     | 
|
| 
       55 
58 
     | 
    
         | 
| 
       56 
59 
     | 
    
         
             
                  @filename = options[:filename] or raise ArgumentError, ':filename option is missing'
         
     | 
| 
       57 
60 
     | 
    
         | 
| 
      
 61 
     | 
    
         
            +
                  @sjar = HashStore.new
         
     | 
| 
       58 
62 
     | 
    
         
             
                  @db = SQLite3::Database.new(@filename)
         
     | 
| 
       59 
63 
     | 
    
         
             
                  @db.results_as_hash = true
         
     | 
| 
       60 
64 
     | 
    
         | 
| 
         @@ -137,7 +141,8 @@ class HTTP::CookieJar 
     | 
|
| 
       137 
141 
     | 
    
         
             
                      st_update = @db.prepare("UPDATE moz_cookies SET baseDomain = :baseDomain WHERE id = :id")
         
     | 
| 
       138 
142 
     | 
    
         | 
| 
       139 
143 
     | 
    
         
             
                      @db.execute("SELECT id, host FROM moz_cookies") { |row|
         
     | 
| 
       140 
     | 
    
         
            -
                         
     | 
| 
      
 144 
     | 
    
         
            +
                        domain_name = DomainName.new(row[:host])
         
     | 
| 
      
 145 
     | 
    
         
            +
                        domain = domain_name.domain || domain_name.hostname
         
     | 
| 
       141 
146 
     | 
    
         
             
                        st_update.execute(:baseDomain => domain, :id => row[:id])
         
     | 
| 
       142 
147 
     | 
    
         
             
                      }
         
     | 
| 
       143 
148 
     | 
    
         | 
| 
         @@ -187,9 +192,7 @@ class HTTP::CookieJar 
     | 
|
| 
       187 
192 
     | 
    
         
             
                  end
         
     | 
| 
       188 
193 
     | 
    
         
             
                end
         
     | 
| 
       189 
194 
     | 
    
         | 
| 
       190 
     | 
    
         
            -
                 
     | 
| 
       191 
     | 
    
         
            -
             
     | 
| 
       192 
     | 
    
         
            -
                def add(cookie)
         
     | 
| 
      
 195 
     | 
    
         
            +
                def db_add(cookie)
         
     | 
| 
       193 
196 
     | 
    
         
             
                  @st_add ||=
         
     | 
| 
       194 
197 
     | 
    
         
             
                    @db.prepare('INSERT OR REPLACE INTO moz_cookies (%s) VALUES (%s)' % [
         
     | 
| 
       195 
198 
     | 
    
         
             
                      ALL_COLUMNS.join(', '),
         
     | 
| 
         @@ -197,7 +200,7 @@ class HTTP::CookieJar 
     | 
|
| 
       197 
200 
     | 
    
         
             
                    ])
         
     | 
| 
       198 
201 
     | 
    
         | 
| 
       199 
202 
     | 
    
         
             
                  @st_add.execute({
         
     | 
| 
       200 
     | 
    
         
            -
                      :baseDomain => cookie.domain_name.domain,
         
     | 
| 
      
 203 
     | 
    
         
            +
                      :baseDomain => cookie.domain_name.domain || cookie.domain,
         
     | 
| 
       201 
204 
     | 
    
         
             
                      :appId => @app_id,
         
     | 
| 
       202 
205 
     | 
    
         
             
                      :inBrowserElement => @in_browser_element ? 1 : 0,
         
     | 
| 
       203 
206 
     | 
    
         
             
                      :name => cookie.name, :value => cookie.value,
         
     | 
| 
         @@ -214,6 +217,44 @@ class HTTP::CookieJar 
     | 
|
| 
       214 
217 
     | 
    
         
             
                  self
         
     | 
| 
       215 
218 
     | 
    
         
             
                end
         
     | 
| 
       216 
219 
     | 
    
         | 
| 
      
 220 
     | 
    
         
            +
                def db_delete(cookie)
         
     | 
| 
      
 221 
     | 
    
         
            +
                  @st_delete ||=
         
     | 
| 
      
 222 
     | 
    
         
            +
                    @db.prepare(<<-'SQL')
         
     | 
| 
      
 223 
     | 
    
         
            +
                                 DELETE FROM moz_cookies
         
     | 
| 
      
 224 
     | 
    
         
            +
                                   WHERE appId = :appId AND
         
     | 
| 
      
 225 
     | 
    
         
            +
                                         inBrowserElement = :inBrowserElement AND
         
     | 
| 
      
 226 
     | 
    
         
            +
                                         name = :name AND
         
     | 
| 
      
 227 
     | 
    
         
            +
                                         host = :host AND
         
     | 
| 
      
 228 
     | 
    
         
            +
                                         path = :path
         
     | 
| 
      
 229 
     | 
    
         
            +
                                SQL
         
     | 
| 
      
 230 
     | 
    
         
            +
             
     | 
| 
      
 231 
     | 
    
         
            +
                  @st_delete.execute({
         
     | 
| 
      
 232 
     | 
    
         
            +
                      :appId => @app_id,
         
     | 
| 
      
 233 
     | 
    
         
            +
                      :inBrowserElement => @in_browser_element ? 1 : 0,
         
     | 
| 
      
 234 
     | 
    
         
            +
                      :name => cookie.name,
         
     | 
| 
      
 235 
     | 
    
         
            +
                      :host => cookie.dot_domain,
         
     | 
| 
      
 236 
     | 
    
         
            +
                      :path => cookie.path,
         
     | 
| 
      
 237 
     | 
    
         
            +
                    })
         
     | 
| 
      
 238 
     | 
    
         
            +
                  self
         
     | 
| 
      
 239 
     | 
    
         
            +
                end
         
     | 
| 
      
 240 
     | 
    
         
            +
             
     | 
| 
      
 241 
     | 
    
         
            +
                public
         
     | 
| 
      
 242 
     | 
    
         
            +
             
     | 
| 
      
 243 
     | 
    
         
            +
                def add(cookie)
         
     | 
| 
      
 244 
     | 
    
         
            +
                  if cookie.session?
         
     | 
| 
      
 245 
     | 
    
         
            +
                    @sjar.add(cookie)
         
     | 
| 
      
 246 
     | 
    
         
            +
                    db_delete(cookie)
         
     | 
| 
      
 247 
     | 
    
         
            +
                  else
         
     | 
| 
      
 248 
     | 
    
         
            +
                    @sjar.delete(cookie)
         
     | 
| 
      
 249 
     | 
    
         
            +
                    db_add(cookie)
         
     | 
| 
      
 250 
     | 
    
         
            +
                  end
         
     | 
| 
      
 251 
     | 
    
         
            +
                end
         
     | 
| 
      
 252 
     | 
    
         
            +
             
     | 
| 
      
 253 
     | 
    
         
            +
                def delete(cookie)
         
     | 
| 
      
 254 
     | 
    
         
            +
                  @sjar.delete(cookie)
         
     | 
| 
      
 255 
     | 
    
         
            +
                  db_delete(cookie)
         
     | 
| 
      
 256 
     | 
    
         
            +
                end
         
     | 
| 
      
 257 
     | 
    
         
            +
             
     | 
| 
       217 
258 
     | 
    
         
             
                def each(uri = nil)
         
     | 
| 
       218 
259 
     | 
    
         
             
                  now = Time.now
         
     | 
| 
       219 
260 
     | 
    
         
             
                  if uri
         
     | 
| 
         @@ -230,10 +271,10 @@ class HTTP::CookieJar 
     | 
|
| 
       230 
271 
     | 
    
         
             
                        @db.prepare("UPDATE moz_cookies SET lastAccessed = :lastAccessed where id = :id")
         
     | 
| 
       231 
272 
     | 
    
         | 
| 
       232 
273 
     | 
    
         
             
                    thost = DomainName.new(uri.host)
         
     | 
| 
       233 
     | 
    
         
            -
                    tpath =  
     | 
| 
      
 274 
     | 
    
         
            +
                    tpath = uri.path
         
     | 
| 
       234 
275 
     | 
    
         | 
| 
       235 
276 
     | 
    
         
             
                    @st_cookies_for_domain.execute({
         
     | 
| 
       236 
     | 
    
         
            -
                        :baseDomain => thost. 
     | 
| 
      
 277 
     | 
    
         
            +
                        :baseDomain => thost.domain || thost.hostname,
         
     | 
| 
       237 
278 
     | 
    
         
             
                        :appId => @app_id,
         
     | 
| 
       238 
279 
     | 
    
         
             
                        :inBrowserElement => @in_browser_element ? 1 : 0,
         
     | 
| 
       239 
280 
     | 
    
         
             
                        :expiry => now.to_i,
         
     | 
| 
         @@ -263,6 +304,7 @@ class HTTP::CookieJar 
     | 
|
| 
       263 
304 
     | 
    
         
             
                        yield cookie
         
     | 
| 
       264 
305 
     | 
    
         
             
                      end
         
     | 
| 
       265 
306 
     | 
    
         
             
                    }
         
     | 
| 
      
 307 
     | 
    
         
            +
                    @sjar.each(uri, &proc)
         
     | 
| 
       266 
308 
     | 
    
         
             
                  else
         
     | 
| 
       267 
309 
     | 
    
         
             
                    @st_all_cookies ||=
         
     | 
| 
       268 
310 
     | 
    
         
             
                      @db.prepare(<<-'SQL')
         
     | 
| 
         @@ -291,12 +333,14 @@ class HTTP::CookieJar 
     | 
|
| 
       291 
333 
     | 
    
         | 
| 
       292 
334 
     | 
    
         
             
                      yield cookie
         
     | 
| 
       293 
335 
     | 
    
         
             
                    }
         
     | 
| 
      
 336 
     | 
    
         
            +
                    @sjar.each(&proc)
         
     | 
| 
       294 
337 
     | 
    
         
             
                  end
         
     | 
| 
       295 
338 
     | 
    
         
             
                  self
         
     | 
| 
       296 
339 
     | 
    
         
             
                end
         
     | 
| 
       297 
340 
     | 
    
         | 
| 
       298 
341 
     | 
    
         
             
                def clear
         
     | 
| 
       299 
342 
     | 
    
         
             
                  @db.execute("DELETE FROM moz_cookies")
         
     | 
| 
      
 343 
     | 
    
         
            +
                  @sjar.clear
         
     | 
| 
       300 
344 
     | 
    
         
             
                  self
         
     | 
| 
       301 
345 
     | 
    
         
             
                end
         
     | 
| 
       302 
346 
     | 
    
         | 
| 
         @@ -309,13 +353,10 @@ class HTTP::CookieJar 
     | 
|
| 
       309 
353 
     | 
    
         
             
                protected :count
         
     | 
| 
       310 
354 
     | 
    
         | 
| 
       311 
355 
     | 
    
         
             
                def empty?
         
     | 
| 
       312 
     | 
    
         
            -
                  count == 0
         
     | 
| 
      
 356 
     | 
    
         
            +
                  @sjar.empty? && count == 0
         
     | 
| 
       313 
357 
     | 
    
         
             
                end
         
     | 
| 
       314 
358 
     | 
    
         | 
| 
       315 
359 
     | 
    
         
             
                def cleanup(session = false)
         
     | 
| 
       316 
     | 
    
         
            -
                  now = Time.now
         
     | 
| 
       317 
     | 
    
         
            -
                  all_cookies = []
         
     | 
| 
       318 
     | 
    
         
            -
             
     | 
| 
       319 
360 
     | 
    
         
             
                  @st_delete_expired ||=
         
     | 
| 
       320 
361 
     | 
    
         
             
                    @db.prepare("DELETE FROM moz_cookies WHERE expiry < :expiry")
         
     | 
| 
       321 
362 
     | 
    
         | 
| 
         @@ -342,26 +383,31 @@ class HTTP::CookieJar 
     | 
|
| 
       342 
383 
     | 
    
         
             
                                 )
         
     | 
| 
       343 
384 
     | 
    
         
             
                    SQL
         
     | 
| 
       344 
385 
     | 
    
         | 
| 
       345 
     | 
    
         
            -
                   
     | 
| 
      
 386 
     | 
    
         
            +
                  synchronize {
         
     | 
| 
      
 387 
     | 
    
         
            +
                    break if @gc_index == 0
         
     | 
| 
       346 
388 
     | 
    
         | 
| 
       347 
     | 
    
         
            -
             
     | 
| 
       348 
     | 
    
         
            -
                      'count' => HTTP::Cookie::MAX_COOKIES_PER_DOMAIN
         
     | 
| 
       349 
     | 
    
         
            -
                    }).each { |row|
         
     | 
| 
       350 
     | 
    
         
            -
                    domain, count = row['domain'], row['count']
         
     | 
| 
      
 389 
     | 
    
         
            +
                    @st_delete_expired.execute({ 'expiry' => Time.now.to_i })
         
     | 
| 
       351 
390 
     | 
    
         | 
| 
       352 
     | 
    
         
            -
                    @ 
     | 
| 
       353 
     | 
    
         
            -
                        ' 
     | 
| 
       354 
     | 
    
         
            -
             
     | 
| 
       355 
     | 
    
         
            -
                       
     | 
| 
       356 
     | 
    
         
            -
                  }
         
     | 
| 
      
 391 
     | 
    
         
            +
                    @st_overusing_domains.execute({
         
     | 
| 
      
 392 
     | 
    
         
            +
                        'count' => HTTP::Cookie::MAX_COOKIES_PER_DOMAIN
         
     | 
| 
      
 393 
     | 
    
         
            +
                      }).each { |row|
         
     | 
| 
      
 394 
     | 
    
         
            +
                      domain, count = row['domain'], row['count']
         
     | 
| 
       357 
395 
     | 
    
         | 
| 
       358 
     | 
    
         
            -
             
     | 
| 
      
 396 
     | 
    
         
            +
                      @st_delete_per_domain_overuse.execute({
         
     | 
| 
      
 397 
     | 
    
         
            +
                          'domain' => domain,
         
     | 
| 
      
 398 
     | 
    
         
            +
                          'limit' => count - HTTP::Cookie::MAX_COOKIES_PER_DOMAIN,
         
     | 
| 
      
 399 
     | 
    
         
            +
                        })
         
     | 
| 
      
 400 
     | 
    
         
            +
                    }
         
     | 
| 
       359 
401 
     | 
    
         | 
| 
       360 
     | 
    
         
            -
             
     | 
| 
       361 
     | 
    
         
            -
                    @st_delete_total_overuse.execute({ 'limit' => overrun })
         
     | 
| 
       362 
     | 
    
         
            -
                  end
         
     | 
| 
      
 402 
     | 
    
         
            +
                    overrun = count - HTTP::Cookie::MAX_COOKIES_TOTAL
         
     | 
| 
       363 
403 
     | 
    
         | 
| 
       364 
     | 
    
         
            -
             
     | 
| 
      
 404 
     | 
    
         
            +
                    if overrun > 0
         
     | 
| 
      
 405 
     | 
    
         
            +
                      @st_delete_total_overuse.execute({ 'limit' => overrun })
         
     | 
| 
      
 406 
     | 
    
         
            +
                    end
         
     | 
| 
      
 407 
     | 
    
         
            +
             
     | 
| 
      
 408 
     | 
    
         
            +
                    @gc_index = 0
         
     | 
| 
      
 409 
     | 
    
         
            +
                  }
         
     | 
| 
      
 410 
     | 
    
         
            +
                  self
         
     | 
| 
       365 
411 
     | 
    
         
             
                end
         
     | 
| 
       366 
412 
     | 
    
         
             
              end
         
     | 
| 
       367 
413 
     | 
    
         
             
            end
         
     | 
    
        data/test/test_http_cookie.rb
    CHANGED
    
    | 
         @@ -177,6 +177,22 @@ class TestHTTPCookie < Test::Unit::TestCase 
     | 
|
| 
       177 
177 
     | 
    
         
             
                assert_equal '.example.com', cookie.dot_domain
         
     | 
| 
       178 
178 
     | 
    
         
             
              end
         
     | 
| 
       179 
179 
     | 
    
         | 
| 
      
 180 
     | 
    
         
            +
              def test_parse_public_suffix
         
     | 
| 
      
 181 
     | 
    
         
            +
                cookie_str = 'a=b; domain=com'
         
     | 
| 
      
 182 
     | 
    
         
            +
             
     | 
| 
      
 183 
     | 
    
         
            +
                cookie = HTTP::Cookie.parse(cookie_str).first
         
     | 
| 
      
 184 
     | 
    
         
            +
                assert_equal('com', cookie.domain)
         
     | 
| 
      
 185 
     | 
    
         
            +
                assert_equal(false, cookie.for_domain?)
         
     | 
| 
      
 186 
     | 
    
         
            +
             
     | 
| 
      
 187 
     | 
    
         
            +
                cookie.origin = 'http://com/'
         
     | 
| 
      
 188 
     | 
    
         
            +
                assert_equal('com', cookie.domain)
         
     | 
| 
      
 189 
     | 
    
         
            +
                assert_equal(false, cookie.for_domain?)
         
     | 
| 
      
 190 
     | 
    
         
            +
             
     | 
| 
      
 191 
     | 
    
         
            +
                assert_raises(ArgumentError) {
         
     | 
| 
      
 192 
     | 
    
         
            +
                  cookie.origin = 'http://example.com/'
         
     | 
| 
      
 193 
     | 
    
         
            +
                }
         
     | 
| 
      
 194 
     | 
    
         
            +
              end
         
     | 
| 
      
 195 
     | 
    
         
            +
             
     | 
| 
       180 
196 
     | 
    
         
             
              def test_parse_domain_none
         
     | 
| 
       181 
197 
     | 
    
         
             
                url = URI.parse('http://example.com/')
         
     | 
| 
       182 
198 
     | 
    
         | 
| 
         @@ -439,6 +455,19 @@ class TestHTTPCookie < Test::Unit::TestCase 
     | 
|
| 
       439 
455 
     | 
    
         
             
                assert_equal 'key', cookie.name
         
     | 
| 
       440 
456 
     | 
    
         
             
                assert_equal 'value', cookie.value
         
     | 
| 
       441 
457 
     | 
    
         
             
                assert_equal expires, cookie.expires
         
     | 
| 
      
 458 
     | 
    
         
            +
                assert_equal false, cookie.for_domain?
         
     | 
| 
      
 459 
     | 
    
         
            +
             
     | 
| 
      
 460 
     | 
    
         
            +
                cookie = HTTP::Cookie.new(:value => 'value', :name => 'key', :expires => expires.dup, :domain => '.example.com')
         
     | 
| 
      
 461 
     | 
    
         
            +
                assert_equal 'key', cookie.name
         
     | 
| 
      
 462 
     | 
    
         
            +
                assert_equal 'value', cookie.value
         
     | 
| 
      
 463 
     | 
    
         
            +
                assert_equal expires, cookie.expires
         
     | 
| 
      
 464 
     | 
    
         
            +
                assert_equal true, cookie.for_domain?
         
     | 
| 
      
 465 
     | 
    
         
            +
             
     | 
| 
      
 466 
     | 
    
         
            +
                cookie = HTTP::Cookie.new(:value => 'value', :name => 'key', :expires => expires.dup, :domain => 'example.com', :for_domain => false)
         
     | 
| 
      
 467 
     | 
    
         
            +
                assert_equal 'key', cookie.name
         
     | 
| 
      
 468 
     | 
    
         
            +
                assert_equal 'value', cookie.value
         
     | 
| 
      
 469 
     | 
    
         
            +
                assert_equal expires, cookie.expires
         
     | 
| 
      
 470 
     | 
    
         
            +
                assert_equal false, cookie.for_domain?
         
     | 
| 
       442 
471 
     | 
    
         | 
| 
       443 
472 
     | 
    
         
             
                cookie = HTTP::Cookie.new(:value => 'value', :name => 'key', :expires => expires.dup, :domain => 'example.org', :for_domain? => true)
         
     | 
| 
       444 
473 
     | 
    
         
             
                assert_equal 'key', cookie.name
         
     | 
| 
         @@ -664,6 +693,16 @@ class TestHTTPCookie < Test::Unit::TestCase 
     | 
|
| 
       664 
693 
     | 
    
         
             
                }
         
     | 
| 
       665 
694 
     | 
    
         
             
              end
         
     | 
| 
       666 
695 
     | 
    
         | 
| 
      
 696 
     | 
    
         
            +
              def test_acceptable_from_uri?
         
     | 
| 
      
 697 
     | 
    
         
            +
                cookie = HTTP::Cookie.new(cookie_values(
         
     | 
| 
      
 698 
     | 
    
         
            +
                    :domain => 'uk',
         
     | 
| 
      
 699 
     | 
    
         
            +
                    :for_domain => true,
         
     | 
| 
      
 700 
     | 
    
         
            +
                    :origin => nil))
         
     | 
| 
      
 701 
     | 
    
         
            +
                assert_equal false, cookie.for_domain?
         
     | 
| 
      
 702 
     | 
    
         
            +
                assert_equal true, cookie.acceptable_from_uri?('http://uk/')
         
     | 
| 
      
 703 
     | 
    
         
            +
                assert_equal false, cookie.acceptable_from_uri?('http://foo.uk/')
         
     | 
| 
      
 704 
     | 
    
         
            +
              end
         
     | 
| 
      
 705 
     | 
    
         
            +
             
     | 
| 
       667 
706 
     | 
    
         
             
              def test_valid_for_uri?
         
     | 
| 
       668 
707 
     | 
    
         
             
                {
         
     | 
| 
       669 
708 
     | 
    
         
             
                  HTTP::Cookie.parse('a1=b',
         
     | 
| 
         @@ -1,9 +1,28 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            require File.expand_path('helper', File.dirname(__FILE__))
         
     | 
| 
       2 
2 
     | 
    
         
             
            require 'tmpdir'
         
     | 
| 
       3 
3 
     | 
    
         | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
     | 
    
         
            -
             
     | 
| 
       6 
     | 
    
         
            -
             
     | 
| 
      
 4 
     | 
    
         
            +
            module TestHTTPCookieJar; end
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            module TestHTTPCookieJar::Tests
         
     | 
| 
      
 7 
     | 
    
         
            +
              def setup(options = nil, options2 = nil)
         
     | 
| 
      
 8 
     | 
    
         
            +
                default_options = {
         
     | 
| 
      
 9 
     | 
    
         
            +
                  :store => :hash,
         
     | 
| 
      
 10 
     | 
    
         
            +
                  :gc_threshold => 150,
         
     | 
| 
      
 11 
     | 
    
         
            +
                }
         
     | 
| 
      
 12 
     | 
    
         
            +
                new_options  = default_options.merge(options || {})
         
     | 
| 
      
 13 
     | 
    
         
            +
                new_options2 = new_options.merge(options2 || {})
         
     | 
| 
      
 14 
     | 
    
         
            +
                @store_type = new_options[:store]
         
     | 
| 
      
 15 
     | 
    
         
            +
                @gc_threshold = new_options[:gc_threshold]
         
     | 
| 
      
 16 
     | 
    
         
            +
                @jar  = HTTP::CookieJar.new(new_options)
         
     | 
| 
      
 17 
     | 
    
         
            +
                @jar2 = HTTP::CookieJar.new(new_options)
         
     | 
| 
      
 18 
     | 
    
         
            +
              end
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
              def hash_store?
         
     | 
| 
      
 21 
     | 
    
         
            +
                @store_type == :hash
         
     | 
| 
      
 22 
     | 
    
         
            +
              end
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
              def mozilla_store?
         
     | 
| 
      
 25 
     | 
    
         
            +
                @store_type == :mozilla
         
     | 
| 
       7 
26 
     | 
    
         
             
              end
         
     | 
| 
       8 
27 
     | 
    
         | 
| 
       9 
28 
     | 
    
         
             
              def cookie_values(options = {})
         
     | 
| 
         @@ -307,9 +326,8 @@ class TestHTTPCookieJar < Test::Unit::TestCase 
     | 
|
| 
       307 
326 
     | 
    
         
             
                  value = @jar.save(File.join(dir, "cookies.yml"))
         
     | 
| 
       308 
327 
     | 
    
         
             
                  assert_same @jar, value
         
     | 
| 
       309 
328 
     | 
    
         | 
| 
       310 
     | 
    
         
            -
                   
     | 
| 
       311 
     | 
    
         
            -
                   
     | 
| 
       312 
     | 
    
         
            -
                  cookies = jar.cookies(url).sort_by { |cookie| cookie.name }
         
     | 
| 
      
 329 
     | 
    
         
            +
                  @jar2.load(File.join(dir, "cookies.yml"))
         
     | 
| 
      
 330 
     | 
    
         
            +
                  cookies = @jar2.cookies(url).sort_by { |cookie| cookie.name }
         
     | 
| 
       313 
331 
     | 
    
         
             
                  assert_equal(2, cookies.length)
         
     | 
| 
       314 
332 
     | 
    
         
             
                  assert_equal('Baz', cookies[0].name)
         
     | 
| 
       315 
333 
     | 
    
         
             
                  assert_equal(false, cookies[0].for_domain)
         
     | 
| 
         @@ -338,9 +356,8 @@ class TestHTTPCookieJar < Test::Unit::TestCase 
     | 
|
| 
       338 
356 
     | 
    
         
             
                Dir.mktmpdir do |dir|
         
     | 
| 
       339 
357 
     | 
    
         
             
                  @jar.save(File.join(dir, "cookies.yml"), :format => :yaml, :session => true)
         
     | 
| 
       340 
358 
     | 
    
         | 
| 
       341 
     | 
    
         
            -
                   
     | 
| 
       342 
     | 
    
         
            -
                   
     | 
| 
       343 
     | 
    
         
            -
                  assert_equal(3, jar.cookies(url).length)
         
     | 
| 
      
 359 
     | 
    
         
            +
                  @jar2.load(File.join(dir, "cookies.yml"))
         
     | 
| 
      
 360 
     | 
    
         
            +
                  assert_equal(3, @jar2.cookies(url).length)
         
     | 
| 
       344 
361 
     | 
    
         
             
                end
         
     | 
| 
       345 
362 
     | 
    
         | 
| 
       346 
363 
     | 
    
         
             
                assert_equal(3, @jar.cookies(url).length)
         
     | 
| 
         @@ -384,9 +401,8 @@ class TestHTTPCookieJar < Test::Unit::TestCase 
     | 
|
| 
       384 
401 
     | 
    
         
             
                  assert_match(/^rubyforge\.org\t.*\tBaz\t/, content)
         
     | 
| 
       385 
402 
     | 
    
         
             
                  assert_match(/^#HttpOnly_\.rubyforge\.org\t/, content)
         
     | 
| 
       386 
403 
     | 
    
         | 
| 
       387 
     | 
    
         
            -
                   
     | 
| 
       388 
     | 
    
         
            -
                   
     | 
| 
       389 
     | 
    
         
            -
                  cookies = jar.cookies(url)
         
     | 
| 
      
 404 
     | 
    
         
            +
                  @jar2.load(filename, :cookiestxt) # HACK test the format
         
     | 
| 
      
 405 
     | 
    
         
            +
                  cookies = @jar2.cookies(url)
         
     | 
| 
       390 
406 
     | 
    
         
             
                  assert_equal(4, cookies.length)
         
     | 
| 
       391 
407 
     | 
    
         
             
                  cookies.each { |cookie|
         
     | 
| 
       392 
408 
     | 
    
         
             
                    case cookie.name
         
     | 
| 
         @@ -541,12 +557,27 @@ class TestHTTPCookieJar < Test::Unit::TestCase 
     | 
|
| 
       541 
557 
     | 
    
         
             
                assert_equal('Foo1 Foo2', @jar.cookies(surl).map { |c| c.name }.sort.join(' ') )
         
     | 
| 
       542 
558 
     | 
    
         
             
              end
         
     | 
| 
       543 
559 
     | 
    
         | 
| 
       544 
     | 
    
         
            -
              def  
     | 
| 
      
 560 
     | 
    
         
            +
              def _test_delete
         
     | 
| 
      
 561 
     | 
    
         
            +
                nurl = URI 'http://rubyforge.org/login'
         
     | 
| 
      
 562 
     | 
    
         
            +
                surl = URI 'https://rubyforge.org/login'
         
     | 
| 
      
 563 
     | 
    
         
            +
             
     | 
| 
      
 564 
     | 
    
         
            +
                cookie1 = HTTP::Cookie.new(cookie_values(:name => 'Foo1', :origin => nurl))
         
     | 
| 
      
 565 
     | 
    
         
            +
                cookie2 = HTTP::Cookie.new(cookie_values(:name => 'Foo1', :origin => surl))
         
     | 
| 
      
 566 
     | 
    
         
            +
             
     | 
| 
      
 567 
     | 
    
         
            +
                @jar.add(nncookie)
         
     | 
| 
      
 568 
     | 
    
         
            +
                @jar.add(sncookie)
         
     | 
| 
      
 569 
     | 
    
         
            +
                @jar.add(nscookie)
         
     | 
| 
      
 570 
     | 
    
         
            +
                @jar.add(sscookie)
         
     | 
| 
      
 571 
     | 
    
         
            +
              end
         
     | 
| 
      
 572 
     | 
    
         
            +
             
     | 
| 
      
 573 
     | 
    
         
            +
              def test_max_cookies
         
     | 
| 
      
 574 
     | 
    
         
            +
                slimit = HTTP::Cookie::MAX_COOKIES_TOTAL + @gc_threshold
         
     | 
| 
      
 575 
     | 
    
         
            +
             
     | 
| 
       545 
576 
     | 
    
         
             
                limit_per_domain = HTTP::Cookie::MAX_COOKIES_PER_DOMAIN
         
     | 
| 
       546 
577 
     | 
    
         
             
                uri = URI('http://www.example.org/')
         
     | 
| 
       547 
578 
     | 
    
         
             
                date = Time.at(Time.now.to_i + 86400)
         
     | 
| 
       548 
579 
     | 
    
         
             
                (1..(limit_per_domain + 1)).each { |i|
         
     | 
| 
       549 
     | 
    
         
            -
                  jar << HTTP::Cookie.new(cookie_values(
         
     | 
| 
      
 580 
     | 
    
         
            +
                  @jar << HTTP::Cookie.new(cookie_values(
         
     | 
| 
       550 
581 
     | 
    
         
             
                      :name => 'Foo%d' % i,
         
     | 
| 
       551 
582 
     | 
    
         
             
                      :value => 'Bar%d' % i,
         
     | 
| 
       552 
583 
     | 
    
         
             
                      :domain => uri.host,
         
     | 
| 
         @@ -557,11 +588,11 @@ class TestHTTPCookieJar < Test::Unit::TestCase 
     | 
|
| 
       557 
588 
     | 
    
         
             
                    cookie.created_at = i == 42 ? date - i : date
         
     | 
| 
       558 
589 
     | 
    
         
             
                  }
         
     | 
| 
       559 
590 
     | 
    
         
             
                }
         
     | 
| 
       560 
     | 
    
         
            -
                assert_equal limit_per_domain + 1, jar.to_a.size
         
     | 
| 
       561 
     | 
    
         
            -
                jar.cleanup
         
     | 
| 
       562 
     | 
    
         
            -
                count = jar.to_a.size
         
     | 
| 
      
 591 
     | 
    
         
            +
                assert_equal limit_per_domain + 1, @jar.to_a.size
         
     | 
| 
      
 592 
     | 
    
         
            +
                @jar.cleanup
         
     | 
| 
      
 593 
     | 
    
         
            +
                count = @jar.to_a.size
         
     | 
| 
       563 
594 
     | 
    
         
             
                assert_equal limit_per_domain, count
         
     | 
| 
       564 
     | 
    
         
            -
                assert_equal [*1..41] + [*43..(limit_per_domain + 1)], jar.map { |cookie|
         
     | 
| 
      
 595 
     | 
    
         
            +
                assert_equal [*1..41] + [*43..(limit_per_domain + 1)], @jar.map { |cookie|
         
     | 
| 
       565 
596 
     | 
    
         
             
                  cookie.name[/(\d+)$/].to_i
         
     | 
| 
       566 
597 
     | 
    
         
             
                }.sort
         
     | 
| 
       567 
598 
     | 
    
         | 
| 
         @@ -572,7 +603,7 @@ class TestHTTPCookieJar < Test::Unit::TestCase 
     | 
|
| 
       572 
603 
     | 
    
         
             
                (1..n).each { |i|
         
     | 
| 
       573 
604 
     | 
    
         
             
                  (1..(limit_per_domain + 1)).each { |j|
         
     | 
| 
       574 
605 
     | 
    
         
             
                    uri = URI('http://www%d.example.jp/' % i)
         
     | 
| 
       575 
     | 
    
         
            -
                    jar << HTTP::Cookie.new(cookie_values(
         
     | 
| 
      
 606 
     | 
    
         
            +
                    @jar << HTTP::Cookie.new(cookie_values(
         
     | 
| 
       576 
607 
     | 
    
         
             
                        :name => 'Baz%d' % j,
         
     | 
| 
       577 
608 
     | 
    
         
             
                        :value => 'www%d.example.jp' % j,
         
     | 
| 
       578 
609 
     | 
    
         
             
                        :domain => uri.host,
         
     | 
| 
         @@ -587,40 +618,33 @@ class TestHTTPCookieJar < Test::Unit::TestCase 
     | 
|
| 
       587 
618 
     | 
    
         
             
                }
         
     | 
| 
       588 
619 
     | 
    
         | 
| 
       589 
620 
     | 
    
         
             
                assert_equal true, count > slimit
         
     | 
| 
       590 
     | 
    
         
            -
                assert_equal true, jar.to_a.size <= slimit
         
     | 
| 
       591 
     | 
    
         
            -
                jar.cleanup
         
     | 
| 
       592 
     | 
    
         
            -
                assert_equal hlimit, jar.to_a.size
         
     | 
| 
       593 
     | 
    
         
            -
                assert_equal false, jar.any? { |cookie|
         
     | 
| 
      
 621 
     | 
    
         
            +
                assert_equal true, @jar.to_a.size <= slimit
         
     | 
| 
      
 622 
     | 
    
         
            +
                @jar.cleanup
         
     | 
| 
      
 623 
     | 
    
         
            +
                assert_equal hlimit, @jar.to_a.size
         
     | 
| 
      
 624 
     | 
    
         
            +
                assert_equal false, @jar.any? { |cookie|
         
     | 
| 
       594 
625 
     | 
    
         
             
                  cookie.domain == cookie.value
         
     | 
| 
       595 
626 
     | 
    
         
             
                }
         
     | 
| 
       596 
627 
     | 
    
         
             
              end
         
     | 
| 
      
 628 
     | 
    
         
            +
            end
         
     | 
| 
      
 629 
     | 
    
         
            +
             
     | 
| 
      
 630 
     | 
    
         
            +
            module TestHTTPCookieJar
         
     | 
| 
      
 631 
     | 
    
         
            +
              class WithHashStore < Test::Unit::TestCase
         
     | 
| 
      
 632 
     | 
    
         
            +
                include Tests
         
     | 
| 
      
 633 
     | 
    
         
            +
              end
         
     | 
| 
       597 
634 
     | 
    
         | 
| 
       598 
     | 
    
         
            -
               
     | 
| 
       599 
     | 
    
         
            -
                 
     | 
| 
       600 
     | 
    
         
            -
             
     | 
| 
       601 
     | 
    
         
            -
             
     | 
| 
       602 
     | 
    
         
            -
             
     | 
| 
       603 
     | 
    
         
            -
                    : 
     | 
| 
       604 
     | 
    
         
            -
             
     | 
| 
       605 
     | 
    
         
            -
             
     | 
| 
       606 
     | 
    
         
            -
             
     | 
| 
       607 
     | 
    
         
            -
             
     | 
| 
       608 
     | 
    
         
            -
                 
     | 
| 
       609 
     | 
    
         
            -
             
     | 
| 
       610 
     | 
    
         
            -
                  HTTP::CookieJar.new(
         
     | 
| 
       611 
     | 
    
         
            -
                    :store => :mozilla,
         
     | 
| 
       612 
     | 
    
         
            -
                    :gc_threshold => gc_threshold,
         
     | 
| 
       613 
     | 
    
         
            -
                    :filename => ":memory:"),
         
     | 
| 
       614 
     | 
    
         
            -
                  HTTP::Cookie::MAX_COOKIES_TOTAL + gc_threshold)
         
     | 
| 
       615 
     | 
    
         
            -
                #Dir.mktmpdir { |dir|
         
     | 
| 
       616 
     | 
    
         
            -
                #  h_test_max_cookies(
         
     | 
| 
       617 
     | 
    
         
            -
                #    HTTP::CookieJar.new(
         
     | 
| 
       618 
     | 
    
         
            -
                #      :store => :mozilla,
         
     | 
| 
       619 
     | 
    
         
            -
                #      :gc_threshold => gc_threshold,
         
     | 
| 
       620 
     | 
    
         
            -
                #      :filename => File.join(dir, "cookies.sqlite")),
         
     | 
| 
       621 
     | 
    
         
            -
                #    HTTP::Cookie::MAX_COOKIES_TOTAL + gc_threshold)
         
     | 
| 
       622 
     | 
    
         
            -
                #}
         
     | 
| 
       623 
     | 
    
         
            -
              rescue IndexError
         
     | 
| 
      
 635 
     | 
    
         
            +
              class WithMozillaStore < Test::Unit::TestCase
         
     | 
| 
      
 636 
     | 
    
         
            +
                include Tests
         
     | 
| 
      
 637 
     | 
    
         
            +
             
     | 
| 
      
 638 
     | 
    
         
            +
                def setup
         
     | 
| 
      
 639 
     | 
    
         
            +
                  super(
         
     | 
| 
      
 640 
     | 
    
         
            +
                    { :store => :mozilla, :filename => ":memory:" },
         
     | 
| 
      
 641 
     | 
    
         
            +
                    { :store => :mozilla, :filename => ":memory:" })
         
     | 
| 
      
 642 
     | 
    
         
            +
                end
         
     | 
| 
      
 643 
     | 
    
         
            +
              end if begin
         
     | 
| 
      
 644 
     | 
    
         
            +
                require 'sqlite3'
         
     | 
| 
      
 645 
     | 
    
         
            +
                true
         
     | 
| 
      
 646 
     | 
    
         
            +
              rescue LoadError
         
     | 
| 
       624 
647 
     | 
    
         
             
                STDERR.puts 'sqlite3 missing?'
         
     | 
| 
      
 648 
     | 
    
         
            +
                false
         
     | 
| 
       625 
649 
     | 
    
         
             
              end
         
     | 
| 
       626 
650 
     | 
    
         
             
            end
         
     | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: http-cookie
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 1.0.0. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 1.0.0.pre7
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Akinori MUSHA
         
     | 
| 
         @@ -11,7 +11,7 @@ authors: 
     | 
|
| 
       11 
11 
     | 
    
         
             
            autorequire: 
         
     | 
| 
       12 
12 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       13 
13 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       14 
     | 
    
         
            -
            date: 2013-03- 
     | 
| 
      
 14 
     | 
    
         
            +
            date: 2013-03-28 00:00:00.000000000 Z
         
     | 
| 
       15 
15 
     | 
    
         
             
            dependencies:
         
     | 
| 
       16 
16 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       17 
17 
     | 
    
         
             
              name: domain_name
         
     |