cookiejar 0.2.9

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,235 @@
1
+ require 'cookiejar'
2
+ require 'rubygems'
3
+
4
+ include CookieJar
5
+ describe CookieValidation do
6
+ describe "#validate_cookie" do
7
+ localaddr = 'http://localhost/foo/bar/'
8
+ it "should fail if version unset" do
9
+ lambda do
10
+ unversioned = Cookie.from_set_cookie localaddr, 'foo=bar'
11
+ unversioned.instance_variable_set :@version, nil
12
+ CookieValidation.validate_cookie localaddr, unversioned
13
+ end.should raise_error InvalidCookieError
14
+ end
15
+ it "should fail if the path is more specific" do
16
+ lambda do
17
+ subdirred = Cookie.from_set_cookie localaddr, 'foo=bar;path=/foo/bar/baz'
18
+ # validate_cookie localaddr, subdirred
19
+ end.should raise_error InvalidCookieError
20
+ end
21
+ it "should fail if the path is different than the request" do
22
+ lambda do
23
+ difdirred = Cookie.from_set_cookie localaddr, 'foo=bar;path=/baz/'
24
+ # validate_cookie localaddr, difdirred
25
+ end.should raise_error InvalidCookieError
26
+ end
27
+ it "should fail if the domain has no dots" do
28
+ lambda do
29
+ nodot = Cookie.from_set_cookie 'http://zero/', 'foo=bar;domain=zero'
30
+ # validate_cookie 'http://zero/', nodot
31
+ end.should raise_error InvalidCookieError
32
+ end
33
+ it "should fail for explicit localhost" do
34
+ lambda do
35
+ localhost = Cookie.from_set_cookie localaddr, 'foo=bar;domain=localhost'
36
+ # validate_cookie localaddr, localhost
37
+ end.should raise_error InvalidCookieError
38
+ end
39
+ it "should fail for mismatched domains" do
40
+ lambda do
41
+ foobar = Cookie.from_set_cookie 'http://www.foo.com/', 'foo=bar;domain=bar.com'
42
+ # validate_cookie 'http://www.foo.com/', foobar
43
+ end.should raise_error InvalidCookieError
44
+ end
45
+ it "should fail for domains more than one level up" do
46
+ lambda do
47
+ xyz = Cookie.from_set_cookie 'http://x.y.z.com/', 'foo=bar;domain=z.com'
48
+ # validate_cookie 'http://x.y.z.com/', xyz
49
+ end.should raise_error InvalidCookieError
50
+ end
51
+ it "should fail for setting subdomain cookies" do
52
+ lambda do
53
+ subdomain = Cookie.from_set_cookie 'http://foo.com/', 'foo=bar;domain=auth.foo.com'
54
+ # validate_cookie 'http://foo.com/', subdomain
55
+ end.should raise_error InvalidCookieError
56
+ end
57
+ it "should handle a normal implicit internet cookie" do
58
+ normal = Cookie.from_set_cookie 'http://foo.com/', 'foo=bar'
59
+ CookieValidation.validate_cookie('http://foo.com/', normal).should be_true
60
+ end
61
+ it "should handle a normal implicit localhost cookie" do
62
+ localhost = Cookie.from_set_cookie 'http://localhost/', 'foo=bar'
63
+ CookieValidation.validate_cookie('http://localhost/', localhost).should be_true
64
+ end
65
+ it "should handle an implicit IP address cookie" do
66
+ ipaddr = Cookie.from_set_cookie 'http://127.0.0.1/', 'foo=bar'
67
+ CookieValidation.validate_cookie('http://127.0.0.1/', ipaddr).should be_true
68
+ end
69
+ it "should handle an explicit domain on an internet site" do
70
+ explicit = Cookie.from_set_cookie 'http://foo.com/', 'foo=bar;domain=.foo.com'
71
+ CookieValidation.validate_cookie('http://foo.com/', explicit).should be_true
72
+ end
73
+ it "should handle setting a cookie explicitly on a superdomain" do
74
+ superdomain = Cookie.from_set_cookie 'http://auth.foo.com/', 'foo=bar;domain=.foo.com'
75
+ CookieValidation.validate_cookie('http://foo.com/', superdomain).should be_true
76
+ end
77
+ it "should handle explicitly setting a cookie" do
78
+ explicit = Cookie.from_set_cookie 'http://foo.com/bar/', 'foo=bar;path=/bar/'
79
+ CookieValidation.validate_cookie('http://foo.com/bar/', explicit)
80
+ end
81
+ it "should handle setting a cookie on a higher path" do
82
+ higher = Cookie.from_set_cookie 'http://foo.com/bar/baz/', 'foo=bar;path=/bar/'
83
+ CookieValidation.validate_cookie('http://foo.com/bar/baz/', higher)
84
+ end
85
+ end
86
+ describe '#cookie_base_path' do
87
+ it "should leave '/' alone" do
88
+ CookieValidation.cookie_base_path('/').should == '/'
89
+ end
90
+ it "should strip off everything after the last '/'" do
91
+ CookieValidation.cookie_base_path('/foo/bar/baz').should == '/foo/bar/'
92
+ end
93
+ it "should handle query parameters and fragments with slashes" do
94
+ CookieValidation.cookie_base_path('/foo/bar?query=a/b/c#fragment/b/c').should == '/foo/'
95
+ end
96
+ it "should handle URI objects" do
97
+ CookieValidation.cookie_base_path(URI.parse('http://www.foo.com/bar/')).should == '/bar/'
98
+ end
99
+ it "should preserve case" do
100
+ CookieValidation.cookie_base_path("/BaR/").should == '/BaR/'
101
+ end
102
+ end
103
+ describe '#determine_cookie_path' do
104
+ it "should use the requested path when none is specified for the cookie" do
105
+ CookieValidation.determine_cookie_path('http://foo.com/', nil).should == '/'
106
+ CookieValidation.determine_cookie_path('http://foo.com/bar/baz', '').should == '/bar/'
107
+ end
108
+ it "should handle URI objects" do
109
+ CookieValidation.determine_cookie_path(URI.parse('http://foo.com/bar/'), '').should == '/bar/'
110
+ end
111
+ it "should handle Cookie objects" do
112
+ cookie = Cookie.from_set_cookie('http://foo.com/', "name=value;path=/")
113
+ CookieValidation.determine_cookie_path('http://foo.com/', cookie).should == '/'
114
+ end
115
+ it "should ignore the request when a path is specified" do
116
+ CookieValidation.determine_cookie_path('http://foo.com/ignorable/path', '/path/').should == '/path/'
117
+ end
118
+ end
119
+ describe '#compute_search_domains' do
120
+ it "should handle subdomains" do
121
+ CookieValidation.compute_search_domains('http://www.auth.foo.com/').should ==
122
+ ['www.auth.foo.com', '.www.auth.foo.com', '.auth.foo.com']
123
+ end
124
+ it "should handle root domains" do
125
+ CookieValidation.compute_search_domains('http://foo.com/').should ==
126
+ ['foo.com', '.foo.com']
127
+ end
128
+ it "should handle IP addresses" do
129
+ CookieValidation.compute_search_domains('http://127.0.0.1/').should ==
130
+ ['127.0.0.1']
131
+ end
132
+ it "should handle local addresses" do
133
+ CookieValidation.compute_search_domains('http://zero/').should ==
134
+ ['zero.local', '.zero.local', '.local']
135
+ end
136
+ end
137
+ describe '#determine_cookie_domain' do
138
+ it "should add a dot to the front of domains" do
139
+ CookieValidation.determine_cookie_domain('http://foo.com/', 'foo.com').should == '.foo.com'
140
+ end
141
+ it "should not add a second dot if one present" do
142
+ CookieValidation.determine_cookie_domain('http://foo.com/', '.foo.com').should == '.foo.com'
143
+ end
144
+ it "should handle Cookie objects" do
145
+ c = Cookie.from_set_cookie('http://foo.com/', "foo=bar;domain=foo.com")
146
+ CookieValidation.determine_cookie_domain('http://foo.com/', c).should == '.foo.com'
147
+ end
148
+ it "should handle URI objects" do
149
+ CookieValidation.determine_cookie_domain(URI.parse('http://foo.com/'), '.foo.com').should == '.foo.com'
150
+ end
151
+ it "should use an exact hostname when no domain specified" do
152
+ CookieValidation.determine_cookie_domain('http://foo.com/', '').should == 'foo.com'
153
+ end
154
+ it "should leave IPv4 addresses alone" do
155
+ CookieValidation.determine_cookie_domain('http://127.0.0.1/', '127.0.0.1').should == '127.0.0.1'
156
+ end
157
+ it "should leave IPv6 addresses alone" do
158
+ ['2001:db8:85a3::8a2e:370:7334', '::ffff:192.0.2.128'].each do |value|
159
+ CookieValidation.determine_cookie_domain("http://[#{value}]/", value).should == value
160
+ end
161
+ end
162
+ end
163
+ describe "#effective_host" do
164
+ it "should leave proper domains the same" do
165
+ ['google.com', 'www.google.com', 'google.com.'].each do |value|
166
+ CookieValidation.effective_host(value).should == value
167
+ end
168
+ end
169
+ it "should handle a URI object" do
170
+ CookieValidation.effective_host(URI.parse('http://example.com/')).should == 'example.com'
171
+ end
172
+ it "should add a local suffix on unqualified hosts" do
173
+ CookieValidation.effective_host('localhost').should == 'localhost.local'
174
+ end
175
+ it "should leave IPv4 addresses alone" do
176
+ CookieValidation.effective_host('127.0.0.1').should == '127.0.0.1'
177
+ end
178
+ it "should leave IPv6 addresses alone" do
179
+ ['2001:db8:85a3::8a2e:370:7334', ':ffff:192.0.2.128'].each do |value|
180
+ CookieValidation.effective_host(value).should == value
181
+ end
182
+ end
183
+ it "should lowercase addresses" do
184
+ CookieValidation.effective_host('FOO.COM').should == 'foo.com'
185
+ end
186
+ end
187
+ describe '#match_domains' do
188
+ it "should handle exact matches" do
189
+ CookieValidation.domains_match('localhost.local', 'localhost.local').should == 'localhost.local'
190
+ CookieValidation.domains_match('foo.com', 'foo.com').should == 'foo.com'
191
+ CookieValidation.domains_match('127.0.0.1', '127.0.0.1').should == '127.0.0.1'
192
+ CookieValidation.domains_match('::ffff:192.0.2.128', '::ffff:192.0.2.128').should == '::ffff:192.0.2.128'
193
+ end
194
+ it "should handle matching a superdomain" do
195
+ CookieValidation.domains_match('.foo.com', 'auth.foo.com').should == '.foo.com'
196
+ CookieValidation.domains_match('.y.z.foo.com', 'x.y.z.foo.com').should == '.y.z.foo.com'
197
+ end
198
+ it "should not match superdomains, or illegal domains" do
199
+ CookieValidation.domains_match('.z.foo.com', 'x.y.z.foo.com').should be_nil
200
+ CookieValidation.domains_match('foo.com', 'com').should be_nil
201
+ end
202
+ it "should not match domains with and without a dot suffix together" do
203
+ CookieValidation.domains_match('foo.com.', 'foo.com').should be_nil
204
+ end
205
+ end
206
+ describe '#hostname_reach' do
207
+ it "should find the next highest subdomain" do
208
+ {'www.google.com' => 'google.com', 'auth.corp.companyx.com' => 'corp.companyx.com'}.each do |entry|
209
+ CookieValidation.hostname_reach(entry[0]).should == entry[1]
210
+ end
211
+ end
212
+ it "should handle domains with suffixed dots" do
213
+ CookieValidation.hostname_reach('www.google.com.').should == 'google.com.'
214
+ end
215
+ it "should return nil for a root domain" do
216
+ CookieValidation.hostname_reach('github.com').should be_nil
217
+ end
218
+ it "should return 'local' for a local domain" do
219
+ ['foo.local', 'foo.local.'].each do |hostname|
220
+ CookieValidation.hostname_reach(hostname).should == 'local'
221
+ end
222
+ end
223
+ it "should handle mixed-case '.local'" do
224
+ CookieValidation.hostname_reach('foo.LOCAL').should == 'local'
225
+ end
226
+ it "should return nil for an IPv4 address" do
227
+ CookieValidation.hostname_reach('127.0.0.1').should be_nil
228
+ end
229
+ it "should return nil for IPv6 addresses" do
230
+ ['2001:db8:85a3::8a2e:370:7334', '::ffff:192.0.2.128'].each do |value|
231
+ CookieValidation.hostname_reach(value).should be_nil
232
+ end
233
+ end
234
+ end
235
+ end
@@ -0,0 +1,205 @@
1
+ require 'cookiejar'
2
+ require 'yaml'
3
+ require 'rubygems'
4
+
5
+ include CookieJar
6
+
7
+ describe Jar do
8
+ describe '.setCookie' do
9
+ it "should allow me to set a cookie" do
10
+ jar = Jar.new
11
+ jar.set_cookie 'http://foo.com/', 'foo=bar'
12
+ end
13
+ it "should allow me to set multiple cookies" do
14
+ jar = Jar.new
15
+ jar.set_cookie 'http://foo.com/', 'foo=bar'
16
+ jar.set_cookie 'http://foo.com/', 'bar=baz'
17
+ jar.set_cookie 'http://auth.foo.com/', 'foo=bar'
18
+ jar.set_cookie 'http://auth.foo.com/', 'auth=135121...;domain=foo.com'
19
+ end
20
+ end
21
+ describe '.get_cookies' do
22
+ it "should let me read back cookies which are set" do
23
+ jar = Jar.new
24
+ jar.set_cookie 'http://foo.com/', 'foo=bar'
25
+ jar.set_cookie 'http://foo.com/', 'bar=baz'
26
+ jar.set_cookie 'http://auth.foo.com/', 'foo=bar'
27
+ jar.set_cookie 'http://auth.foo.com/', 'auth=135121...;domain=foo.com'
28
+ jar.get_cookies('http://foo.com/').should have(3).items
29
+ end
30
+ it "should return cookies longest path first" do
31
+ jar = Jar.new
32
+ uri = 'http://foo.com/a/b/c/d'
33
+ jar.set_cookie uri, 'a=bar'
34
+ jar.set_cookie uri, 'b=baz;path=/a/b/c/d'
35
+ jar.set_cookie uri, 'c=bar;path=/a/b'
36
+ jar.set_cookie uri, 'd=bar;path=/a/'
37
+ cookies = jar.get_cookies(uri)
38
+ cookies.should have(4).items
39
+ cookies[0].name.should == 'b'
40
+ cookies[1].name.should == 'a'
41
+ cookies[2].name.should == 'c'
42
+ cookies[3].name.should == 'd'
43
+ end
44
+ it "should not return expired cookies" do
45
+ jar = Jar.new
46
+ uri = 'http://localhost/'
47
+ jar.set_cookie uri, 'foo=bar;expires=Wednesday, 09-Nov-99 23:12:40 GMT'
48
+ cookies = jar.get_cookies(uri)
49
+ cookies.should have(0).items
50
+ end
51
+ end
52
+ describe '.get_cookie_headers' do
53
+ it "should return cookie headers" do
54
+ jar = Jar.new
55
+ uri = 'http://foo.com/a/b/c/d'
56
+ jar.set_cookie uri, 'a=bar'
57
+ jar.set_cookie uri, 'b=baz;path=/a/b/c/d'
58
+ cookie_headers = jar.get_cookie_header uri
59
+ cookie_headers.should == "b=baz;a=bar"
60
+ end
61
+ it "should handle a version 1 cookie" do
62
+ jar = Jar.new
63
+ uri = 'http://foo.com/a/b/c/d'
64
+ jar.set_cookie uri, 'a=bar'
65
+ jar.set_cookie uri, 'b=baz;path=/a/b/c/d'
66
+ jar.set_cookie2 uri, 'c=baz;Version=1;path="/"'
67
+ cookie_headers = jar.get_cookie_header uri
68
+ cookie_headers.should == '$Version=0;b=baz;$Path="/a/b/c/d";a=bar;$Path="/a/b/c/",$Version=1;c=baz;$Path="/"'
69
+ end
70
+ end
71
+ describe '.add_cookie' do
72
+ it "should let me add a pre-existing cookie" do
73
+ jar = Jar.new
74
+ cookie = Cookie.from_set_cookie 'http://localhost/', 'foo=bar'
75
+ jar.add_cookie cookie
76
+ end
77
+ end
78
+ describe '.to_a' do
79
+ it "should return me an array of all cookie objects" do
80
+ uri = 'http://foo.com/a/b/c/d'
81
+ jar = Jar.new
82
+ jar.set_cookie uri, 'a=bar;expires=Wednesday, 09-Nov-99 23:12:40 GMT'
83
+ jar.set_cookie uri, 'b=baz;path=/a/b/c/d'
84
+ jar.set_cookie uri, 'c=bar;path=/a/b'
85
+ jar.set_cookie uri, 'd=bar;path=/a/'
86
+ jar.set_cookie 'http://localhost/', 'foo=bar'
87
+ jar.to_a.should have(5).items
88
+ end
89
+ end
90
+ describe '.expire_cookies' do
91
+ it "should expire cookies which are no longer valid" do
92
+ uri = 'http://foo.com/a/b/c/d'
93
+ jar = Jar.new
94
+ jar.set_cookie uri, 'a=bar;expires=Wednesday, 09-Nov-99 23:12:40 GMT'
95
+ jar.set_cookie uri, 'b=baz;path=/a/b/c/d;expires=Wednesday, 01-Nov-2028 12:00:00 GMT'
96
+ jar.set_cookie uri, 'c=bar;path=/a/b'
97
+ jar.set_cookie uri, 'd=bar;path=/a/'
98
+ jar.set_cookie 'http://localhost/', 'foo=bar'
99
+ jar.to_a.should have(5).items
100
+ jar.expire_cookies
101
+ jar.to_a.should have(4).items
102
+ end
103
+ it "should let me expire all session cookies" do
104
+ uri = 'http://foo.com/a/b/c/d'
105
+ jar = Jar.new
106
+ jar.set_cookie uri, 'a=bar;expires=Wednesday, 09-Nov-99 23:12:40 GMT'
107
+ jar.set_cookie uri, 'b=baz;path=/a/b/c/d;expires=Wednesday, 01-Nov-2028 12:00:00 GMT'
108
+ jar.set_cookie uri, 'c=bar;path=/a/b'
109
+ jar.set_cookie uri, 'd=bar;path=/a/'
110
+ jar.set_cookie 'http://localhost/', 'foo=bar'
111
+ jar.to_a.should have(5).items
112
+ jar.expire_cookies true
113
+ jar.to_a.should have(1).items
114
+ end
115
+ end
116
+ describe '#set_cookies_from_headers' do
117
+ it "should handle a Set-Cookie header" do
118
+ jar = Jar.new
119
+ cookies = jar.set_cookies_from_headers 'http://localhost/',
120
+ { 'Set-Cookie' => 'foo=bar' }
121
+ cookies.should have(1).items
122
+ jar.to_a.should have(1).items
123
+ end
124
+ it "should handle multiple Set-Cookie headers" do
125
+ jar = Jar.new
126
+ cookies = jar.set_cookies_from_headers 'http://localhost/',
127
+ { 'Set-Cookie' => ['foo=bar','bar=baz'] }
128
+ cookies.should have(2).items
129
+ jar.to_a.should have(2).items
130
+ end
131
+ it "should handle a Set-Cookie2 header" do
132
+ jar = Jar.new
133
+ cookies = jar.set_cookies_from_headers 'http://localhost/',
134
+ { 'Set-Cookie2' => 'foo=bar;Version=1' }
135
+ cookies.should have(1).items
136
+ jar.to_a.should have(1).items
137
+ end
138
+ it "should handle multiple Set-Cookie2 headers" do
139
+ jar = Jar.new
140
+ cookies = jar.set_cookies_from_headers 'http://localhost/',
141
+ { 'Set-Cookie2' => ['foo=bar;Version=1','bar=baz;Version=1'] }
142
+ cookies.should have(2).items
143
+ jar.to_a.should have(2).items
144
+ end
145
+ it "should handle mixed distinct Set-Cookie and Set-Cookie2 headers" do
146
+ jar = Jar.new
147
+ cookies = jar.set_cookies_from_headers 'http://localhost/',
148
+ { 'Set-Cookie' => 'foo=bar',
149
+ 'Set-Cookie2' => 'bar=baz;Version=1' }
150
+ cookies.should have(2).items
151
+ jar.to_a.should have(2).items
152
+ end
153
+ it "should handle overlapping Set-Cookie and Set-Cookie2 headers" do
154
+ jar = Jar.new
155
+ cookies = jar.set_cookies_from_headers 'http://localhost/',
156
+ { 'Set-Cookie' => ['foo=bar','bar=baz'],
157
+ 'Set-Cookie2' => 'foo=bar;Version=1' }
158
+ cookies.should have(2).items
159
+ jar.to_a.should have(2).items
160
+ # and has the version 1 cookie
161
+ cookies.find do |cookie|
162
+ cookie.name == 'foo'
163
+ end.version.should == 1
164
+ end
165
+ end
166
+ begin
167
+ require 'json'
168
+ describe ".to_json" do
169
+ it "should serialize cookies to JSON" do
170
+
171
+ c = Cookie.from_set_cookie 'https://localhost/', 'foo=bar;secure;expires=Wed, 01-Nov-2028 12:00:00 GMT'
172
+ jar = Jar.new
173
+ jar.add_cookie c
174
+ json = jar.to_json
175
+ json.should be_a String
176
+ end
177
+ end
178
+ describe ".json_create" do
179
+ it "should deserialize a JSON array to a jar" do
180
+ json = "[{\"name\":\"foo\",\"value\":\"bar\",\"domain\":\"localhost.local\",\"path\":\"\\/\",\"created_at\":\"2009-09-11 12:51:03 -0600\",\"expiry\":\"2028-11-01 12:00:00 GMT\",\"secure\":true}]"
181
+ array = JSON.parse json
182
+
183
+ jar = Jar.json_create array
184
+ jar.get_cookies('https://localhost/').should have(1).items
185
+ end
186
+ it "should deserialize a JSON hash to a jar" do
187
+ json = "{\"cookies\":[{\"name\":\"foo\",\"value\":\"bar\",\"domain\":\"localhost.local\",\"path\":\"\\/\",\"created_at\":\"2009-09-11 12:51:03 -0600\",\"expiry\":\"2028-11-01 12:00:00 GMT\",\"secure\":true}]}"
188
+ hash = JSON.parse json
189
+
190
+ jar = Jar.json_create hash
191
+ jar.get_cookies('https://localhost/').should have(1).items
192
+ end
193
+
194
+ it "should automatically deserialize to a jar" do
195
+ json = "{\"json_class\":\"CookieJar::Jar\",\"cookies\":[{\"name\":\"foo\",\"value\":\"bar\",\"domain\":\"localhost.local\",\"path\":\"\\/\",\"created_at\":\"2009-09-11 12:51:03 -0600\",\"expiry\":\"2028-11-01 12:00:00 GMT\",\"secure\":true}]}"
196
+ jar = JSON.parse json
197
+ jar.get_cookies('https://localhost/').should have(1).items
198
+ end
199
+ end
200
+ rescue LoadError
201
+ it "does not appear the JSON library is installed" do
202
+ raise 'please install the JSON lirbary'
203
+ end
204
+ end
205
+ end
metadata ADDED
@@ -0,0 +1,62 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cookiejar
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.9
5
+ platform: ruby
6
+ authors:
7
+ - David Waite
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-10-02 00:00:00 -06:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: Allows for parsing and returning cookies in Ruby HTTP client code
17
+ email: david@alkaline-solutions.com
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files: []
23
+
24
+ files:
25
+ - lib/cookiejar/cookie.rb
26
+ - lib/cookiejar/cookie_validation.rb
27
+ - lib/cookiejar/jar.rb
28
+ - lib/cookiejar.rb
29
+ - test/cookie_test.rb
30
+ - test/cookie_validation_test.rb
31
+ - test/jar_test.rb
32
+ has_rdoc: true
33
+ homepage: http://alkaline-solutions.com
34
+ licenses: []
35
+
36
+ post_install_message:
37
+ rdoc_options:
38
+ - --title
39
+ - CookieJar -- Client-side HTTP Cookies
40
+ require_paths:
41
+ - lib
42
+ required_ruby_version: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: "0"
47
+ version:
48
+ required_rubygems_version: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: "0"
53
+ version:
54
+ requirements: []
55
+
56
+ rubyforge_project:
57
+ rubygems_version: 1.3.5
58
+ signing_key:
59
+ specification_version: 3
60
+ summary: Client-side HTTP Cookie library
61
+ test_files: []
62
+