secobarbital-cookiejar 0.2.9.1
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.
- data/lib/cookiejar/cookie.rb +252 -0
- data/lib/cookiejar/cookie_validation.rb +400 -0
- data/lib/cookiejar/jar.rb +308 -0
- data/lib/cookiejar.rb +2 -0
- data/test/cookie_test.rb +176 -0
- data/test/cookie_validation_test.rb +251 -0
- data/test/jar_test.rb +226 -0
- metadata +73 -0
@@ -0,0 +1,251 @@
|
|
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 hexadecimal TLDs" do
|
129
|
+
CookieValidation.compute_search_domains('http://tiny.cc/').should ==
|
130
|
+
['tiny.cc', '.tiny.cc']
|
131
|
+
end
|
132
|
+
it "should handle IP addresses" do
|
133
|
+
CookieValidation.compute_search_domains('http://127.0.0.1/').should ==
|
134
|
+
['127.0.0.1']
|
135
|
+
end
|
136
|
+
it "should handle local addresses" do
|
137
|
+
CookieValidation.compute_search_domains('http://zero/').should ==
|
138
|
+
['zero.local', '.zero.local', '.local']
|
139
|
+
end
|
140
|
+
end
|
141
|
+
describe '#determine_cookie_domain' do
|
142
|
+
it "should add a dot to the front of domains" do
|
143
|
+
CookieValidation.determine_cookie_domain('http://foo.com/', 'foo.com').should == '.foo.com'
|
144
|
+
end
|
145
|
+
it "should not add a second dot if one present" do
|
146
|
+
CookieValidation.determine_cookie_domain('http://foo.com/', '.foo.com').should == '.foo.com'
|
147
|
+
end
|
148
|
+
it "should handle Cookie objects" do
|
149
|
+
c = Cookie.from_set_cookie('http://foo.com/', "foo=bar;domain=foo.com")
|
150
|
+
CookieValidation.determine_cookie_domain('http://foo.com/', c).should == '.foo.com'
|
151
|
+
end
|
152
|
+
it "should handle URI objects" do
|
153
|
+
CookieValidation.determine_cookie_domain(URI.parse('http://foo.com/'), '.foo.com').should == '.foo.com'
|
154
|
+
end
|
155
|
+
it "should use an exact hostname when no domain specified" do
|
156
|
+
CookieValidation.determine_cookie_domain('http://foo.com/', '').should == 'foo.com'
|
157
|
+
end
|
158
|
+
it "should leave IPv4 addresses alone" do
|
159
|
+
CookieValidation.determine_cookie_domain('http://127.0.0.1/', '127.0.0.1').should == '127.0.0.1'
|
160
|
+
end
|
161
|
+
it "should leave IPv6 addresses alone" do
|
162
|
+
['2001:db8:85a3::8a2e:370:7334', '::ffff:192.0.2.128'].each do |value|
|
163
|
+
CookieValidation.determine_cookie_domain("http://[#{value}]/", value).should == value
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
167
|
+
describe "#effective_host" do
|
168
|
+
it "should leave proper domains the same" do
|
169
|
+
['google.com', 'www.google.com', 'google.com.'].each do |value|
|
170
|
+
CookieValidation.effective_host(value).should == value
|
171
|
+
end
|
172
|
+
end
|
173
|
+
it "should leave blank domains blank" do
|
174
|
+
['', nil].each do |value|
|
175
|
+
CookieValidation.effective_host(value).should == ''
|
176
|
+
end
|
177
|
+
end
|
178
|
+
it "should handle a URI object" do
|
179
|
+
CookieValidation.effective_host(URI.parse('http://example.com/')).should == 'example.com'
|
180
|
+
end
|
181
|
+
it "should add a local suffix on unqualified hosts" do
|
182
|
+
CookieValidation.effective_host('localhost').should == 'localhost.local'
|
183
|
+
end
|
184
|
+
it "should leave IPv4 addresses alone" do
|
185
|
+
CookieValidation.effective_host('127.0.0.1').should == '127.0.0.1'
|
186
|
+
end
|
187
|
+
it "should leave IPv6 addresses alone" do
|
188
|
+
['2001:db8:85a3::8a2e:370:7334', ':ffff:192.0.2.128'].each do |value|
|
189
|
+
CookieValidation.effective_host(value).should == value
|
190
|
+
end
|
191
|
+
end
|
192
|
+
it "should lowercase addresses" do
|
193
|
+
CookieValidation.effective_host('FOO.COM').should == 'foo.com'
|
194
|
+
end
|
195
|
+
end
|
196
|
+
describe '#match_domains' do
|
197
|
+
it "should handle exact matches" do
|
198
|
+
CookieValidation.domains_match('localhost.local', 'localhost.local').should == 'localhost.local'
|
199
|
+
CookieValidation.domains_match('foo.com', 'foo.com').should == 'foo.com'
|
200
|
+
CookieValidation.domains_match('127.0.0.1', '127.0.0.1').should == '127.0.0.1'
|
201
|
+
CookieValidation.domains_match('::ffff:192.0.2.128', '::ffff:192.0.2.128').should == '::ffff:192.0.2.128'
|
202
|
+
end
|
203
|
+
it "should handle matching a superdomain" do
|
204
|
+
CookieValidation.domains_match('.foo.com', 'auth.foo.com').should == '.foo.com'
|
205
|
+
CookieValidation.domains_match('.y.z.foo.com', 'x.y.z.foo.com').should == '.y.z.foo.com'
|
206
|
+
end
|
207
|
+
it "should not match superdomains, or illegal domains" do
|
208
|
+
CookieValidation.domains_match('.z.foo.com', 'x.y.z.foo.com').should be_nil
|
209
|
+
CookieValidation.domains_match('foo.com', 'com').should be_nil
|
210
|
+
end
|
211
|
+
it "should not match blank domains" do
|
212
|
+
CookieValidation.domains_match('.foo.com', '').should be_nil
|
213
|
+
CookieValidation.domains_match('.foo.com', nil).should be_nil
|
214
|
+
CookieValidation.domains_match('', 'foo.com').should be_nil
|
215
|
+
CookieValidation.domains_match('', '').should be_nil
|
216
|
+
CookieValidation.domains_match('', nil).should be_nil
|
217
|
+
end
|
218
|
+
it "should not match domains with and without a dot suffix together" do
|
219
|
+
CookieValidation.domains_match('foo.com.', 'foo.com').should be_nil
|
220
|
+
end
|
221
|
+
end
|
222
|
+
describe '#hostname_reach' do
|
223
|
+
it "should find the next highest subdomain" do
|
224
|
+
{'www.google.com' => 'google.com', 'auth.corp.companyx.com' => 'corp.companyx.com'}.each do |entry|
|
225
|
+
CookieValidation.hostname_reach(entry[0]).should == entry[1]
|
226
|
+
end
|
227
|
+
end
|
228
|
+
it "should handle domains with suffixed dots" do
|
229
|
+
CookieValidation.hostname_reach('www.google.com.').should == 'google.com.'
|
230
|
+
end
|
231
|
+
it "should return nil for a root domain" do
|
232
|
+
CookieValidation.hostname_reach('github.com').should be_nil
|
233
|
+
end
|
234
|
+
it "should return 'local' for a local domain" do
|
235
|
+
['foo.local', 'foo.local.'].each do |hostname|
|
236
|
+
CookieValidation.hostname_reach(hostname).should == 'local'
|
237
|
+
end
|
238
|
+
end
|
239
|
+
it "should handle mixed-case '.local'" do
|
240
|
+
CookieValidation.hostname_reach('foo.LOCAL').should == 'local'
|
241
|
+
end
|
242
|
+
it "should return nil for an IPv4 address" do
|
243
|
+
CookieValidation.hostname_reach('127.0.0.1').should be_nil
|
244
|
+
end
|
245
|
+
it "should return nil for IPv6 addresses" do
|
246
|
+
['2001:db8:85a3::8a2e:370:7334', '::ffff:192.0.2.128'].each do |value|
|
247
|
+
CookieValidation.hostname_reach(value).should be_nil
|
248
|
+
end
|
249
|
+
end
|
250
|
+
end
|
251
|
+
end
|
data/test/jar_test.rb
ADDED
@@ -0,0 +1,226 @@
|
|
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 a set-cookie header" do
|
125
|
+
jar = Jar.new
|
126
|
+
cookies = jar.set_cookies_from_headers 'http://localhost/',
|
127
|
+
{ 'set-cookie' => 'foo=bar' }
|
128
|
+
cookies.should have(1).items
|
129
|
+
jar.to_a.should have(1).items
|
130
|
+
end
|
131
|
+
it "should handle multiple Set-Cookie headers" do
|
132
|
+
jar = Jar.new
|
133
|
+
cookies = jar.set_cookies_from_headers 'http://localhost/',
|
134
|
+
{ 'Set-Cookie' => ['foo=bar','bar=baz'] }
|
135
|
+
cookies.should have(2).items
|
136
|
+
jar.to_a.should have(2).items
|
137
|
+
end
|
138
|
+
it "should handle a Set-Cookie2 header" do
|
139
|
+
jar = Jar.new
|
140
|
+
cookies = jar.set_cookies_from_headers 'http://localhost/',
|
141
|
+
{ 'Set-Cookie2' => 'foo=bar;Version=1' }
|
142
|
+
cookies.should have(1).items
|
143
|
+
jar.to_a.should have(1).items
|
144
|
+
end
|
145
|
+
it "should handle a set-cookie2 header" do
|
146
|
+
jar = Jar.new
|
147
|
+
cookies = jar.set_cookies_from_headers 'http://localhost/',
|
148
|
+
{ 'set-cookie2' => 'foo=bar;Version=1' }
|
149
|
+
cookies.should have(1).items
|
150
|
+
jar.to_a.should have(1).items
|
151
|
+
end
|
152
|
+
it "should handle multiple Set-Cookie2 headers" do
|
153
|
+
jar = Jar.new
|
154
|
+
cookies = jar.set_cookies_from_headers 'http://localhost/',
|
155
|
+
{ 'Set-Cookie2' => ['foo=bar;Version=1','bar=baz;Version=1'] }
|
156
|
+
cookies.should have(2).items
|
157
|
+
jar.to_a.should have(2).items
|
158
|
+
end
|
159
|
+
it "should handle mixed distinct Set-Cookie and Set-Cookie2 headers" do
|
160
|
+
jar = Jar.new
|
161
|
+
cookies = jar.set_cookies_from_headers 'http://localhost/',
|
162
|
+
{ 'Set-Cookie' => 'foo=bar',
|
163
|
+
'Set-Cookie2' => 'bar=baz;Version=1' }
|
164
|
+
cookies.should have(2).items
|
165
|
+
jar.to_a.should have(2).items
|
166
|
+
end
|
167
|
+
it "should handle overlapping Set-Cookie and Set-Cookie2 headers" do
|
168
|
+
jar = Jar.new
|
169
|
+
cookies = jar.set_cookies_from_headers 'http://localhost/',
|
170
|
+
{ 'Set-Cookie' => ['foo=bar','bar=baz'],
|
171
|
+
'Set-Cookie2' => 'foo=bar;Version=1' }
|
172
|
+
cookies.should have(2).items
|
173
|
+
jar.to_a.should have(2).items
|
174
|
+
# and has the version 1 cookie
|
175
|
+
cookies.find do |cookie|
|
176
|
+
cookie.name == 'foo'
|
177
|
+
end.version.should == 1
|
178
|
+
end
|
179
|
+
it "should silently drop invalid cookies" do
|
180
|
+
jar = Jar.new
|
181
|
+
cookies = jar.set_cookies_from_headers 'http://localhost/',
|
182
|
+
{ 'Set-Cookie' => ['foo=bar','bar=baz;domain=.foo.com'] }
|
183
|
+
cookies.should have(1).items
|
184
|
+
jar.to_a.should have(1).items
|
185
|
+
end
|
186
|
+
end
|
187
|
+
begin
|
188
|
+
require 'json'
|
189
|
+
describe ".to_json" do
|
190
|
+
it "should serialize cookies to JSON" do
|
191
|
+
|
192
|
+
c = Cookie.from_set_cookie 'https://localhost/', 'foo=bar;secure;expires=Wed, 01-Nov-2028 12:00:00 GMT'
|
193
|
+
jar = Jar.new
|
194
|
+
jar.add_cookie c
|
195
|
+
json = jar.to_json
|
196
|
+
json.should be_a String
|
197
|
+
end
|
198
|
+
end
|
199
|
+
describe ".json_create" do
|
200
|
+
it "should deserialize a JSON array to a jar" do
|
201
|
+
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}]"
|
202
|
+
array = JSON.parse json
|
203
|
+
|
204
|
+
jar = Jar.json_create array
|
205
|
+
jar.get_cookies('https://localhost/').should have(1).items
|
206
|
+
end
|
207
|
+
it "should deserialize a JSON hash to a jar" do
|
208
|
+
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}]}"
|
209
|
+
hash = JSON.parse json
|
210
|
+
|
211
|
+
jar = Jar.json_create hash
|
212
|
+
jar.get_cookies('https://localhost/').should have(1).items
|
213
|
+
end
|
214
|
+
|
215
|
+
it "should automatically deserialize to a jar" do
|
216
|
+
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}]}"
|
217
|
+
jar = JSON.parse json
|
218
|
+
jar.get_cookies('https://localhost/').should have(1).items
|
219
|
+
end
|
220
|
+
end
|
221
|
+
rescue LoadError
|
222
|
+
it "does not appear the JSON library is installed" do
|
223
|
+
raise 'please install the JSON lirbary'
|
224
|
+
end
|
225
|
+
end
|
226
|
+
end
|
metadata
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: secobarbital-cookiejar
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 2
|
8
|
+
- 9
|
9
|
+
- 1
|
10
|
+
version: 0.2.9.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- David Waite
|
14
|
+
- Seggy Umboh
|
15
|
+
autorequire:
|
16
|
+
bindir: bin
|
17
|
+
cert_chain: []
|
18
|
+
|
19
|
+
date: 2010-06-04 00:00:00 -07:00
|
20
|
+
default_executable:
|
21
|
+
dependencies: []
|
22
|
+
|
23
|
+
description: Allows for parsing and returning cookies in Ruby HTTP client code
|
24
|
+
email:
|
25
|
+
- david@alkaline-solutions.com
|
26
|
+
- sumboh@thingbuzz.com
|
27
|
+
executables: []
|
28
|
+
|
29
|
+
extensions: []
|
30
|
+
|
31
|
+
extra_rdoc_files: []
|
32
|
+
|
33
|
+
files:
|
34
|
+
- lib/cookiejar/cookie.rb
|
35
|
+
- lib/cookiejar/cookie_validation.rb
|
36
|
+
- lib/cookiejar/jar.rb
|
37
|
+
- lib/cookiejar.rb
|
38
|
+
- test/cookie_test.rb
|
39
|
+
- test/cookie_validation_test.rb
|
40
|
+
- test/jar_test.rb
|
41
|
+
has_rdoc: true
|
42
|
+
homepage: http://alkaline-solutions.com
|
43
|
+
licenses: []
|
44
|
+
|
45
|
+
post_install_message:
|
46
|
+
rdoc_options:
|
47
|
+
- --title
|
48
|
+
- CookieJar -- Client-side HTTP Cookies
|
49
|
+
require_paths:
|
50
|
+
- lib
|
51
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - ">="
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
segments:
|
56
|
+
- 0
|
57
|
+
version: "0"
|
58
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
segments:
|
63
|
+
- 0
|
64
|
+
version: "0"
|
65
|
+
requirements: []
|
66
|
+
|
67
|
+
rubyforge_project:
|
68
|
+
rubygems_version: 1.3.6
|
69
|
+
signing_key:
|
70
|
+
specification_version: 3
|
71
|
+
summary: Client-side HTTP Cookie library
|
72
|
+
test_files: []
|
73
|
+
|