cookiejar 0.3.2 → 0.3.3
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/.gitignore +7 -0
- data/.rspec +2 -0
- data/.travis.yml +17 -0
- data/Gemfile +2 -0
- data/README.markdown +15 -1
- data/Rakefile +11 -12
- data/cookiejar.gemspec +27 -0
- data/lib/cookiejar.rb +2 -1
- data/lib/cookiejar/cookie.rb +57 -63
- data/lib/cookiejar/cookie_validation.rb +102 -99
- data/lib/cookiejar/jar.rb +50 -48
- data/lib/cookiejar/version.rb +4 -0
- data/spec/cookie_spec.rb +90 -90
- data/spec/cookie_validation_spec.rb +147 -155
- data/spec/jar_spec.rb +107 -110
- data/spec/spec_helper.rb +5 -0
- metadata +50 -11
data/lib/cookiejar/jar.rb
CHANGED
@@ -56,7 +56,7 @@ module CookieJar
|
|
56
56
|
# @param [String] cookie_header_value the contents of the Set-Cookie
|
57
57
|
# @return [Cookie] which was created and stored
|
58
58
|
# @raise [InvalidCookieError] if the cookie header did not validate
|
59
|
-
def set_cookie
|
59
|
+
def set_cookie(request_uri, cookie_header_values)
|
60
60
|
cookie_header_values.split(/, (?=[\w]+=)/).each do |cookie_header_value|
|
61
61
|
cookie = Cookie.from_set_cookie request_uri, cookie_header_value
|
62
62
|
add_cookie cookie
|
@@ -70,7 +70,7 @@ module CookieJar
|
|
70
70
|
# @param [String] cookie_header_value the contents of the Set-Cookie2
|
71
71
|
# @return [Cookie] which was created and stored
|
72
72
|
# @raise [InvalidCookieError] if the cookie header did not validate
|
73
|
-
def set_cookie2
|
73
|
+
def set_cookie2(request_uri, cookie_header_value)
|
74
74
|
cookie = Cookie.from_set_cookie2 request_uri, cookie_header_value
|
75
75
|
add_cookie cookie
|
76
76
|
end
|
@@ -87,7 +87,7 @@ module CookieJar
|
|
87
87
|
# @return [Array<Cookie>,nil] the cookies created, or nil if none found.
|
88
88
|
# @raise [InvalidCookieError] if one of the cookie headers contained
|
89
89
|
# invalid formatting or data
|
90
|
-
def set_cookies_from_headers
|
90
|
+
def set_cookies_from_headers(request_uri, http_headers)
|
91
91
|
set_cookie_key = http_headers.keys.detect { |k| /\ASet-Cookie\Z/i.match k }
|
92
92
|
cookies = gather_header_values http_headers[set_cookie_key] do |value|
|
93
93
|
begin
|
@@ -123,7 +123,7 @@ module CookieJar
|
|
123
123
|
#
|
124
124
|
# @param [Cookie] cookie a pre-existing cookie object
|
125
125
|
# @return [Cookie] the cookie added to the store
|
126
|
-
def add_cookie
|
126
|
+
def add_cookie(cookie)
|
127
127
|
domain_paths = find_or_add_domain_for_cookie cookie
|
128
128
|
add_cookie_to_path domain_paths, cookie
|
129
129
|
cookie
|
@@ -149,7 +149,7 @@ module CookieJar
|
|
149
149
|
# @param [Array] a options controlling output JSON text
|
150
150
|
# (usually a State and a depth)
|
151
151
|
# @return [String] JSON representation of object data
|
152
|
-
def to_json
|
152
|
+
def to_json(*a)
|
153
153
|
{
|
154
154
|
'json_class' => self.class.name,
|
155
155
|
'cookies' => to_a.to_json(*a)
|
@@ -160,17 +160,13 @@ module CookieJar
|
|
160
160
|
#
|
161
161
|
# @param o [Hash] the expanded JSON object
|
162
162
|
# @return [CookieJar] a new CookieJar instance
|
163
|
-
def self.json_create
|
164
|
-
if o.is_a? String
|
165
|
-
|
166
|
-
end
|
167
|
-
if o.is_a? Hash
|
168
|
-
o = o['cookies']
|
169
|
-
end
|
163
|
+
def self.json_create(o)
|
164
|
+
o = JSON.parse(o) if o.is_a? String
|
165
|
+
o = o['cookies'] if o.is_a? Hash
|
170
166
|
cookies = o.inject([]) do |result, cookie_json|
|
171
167
|
result << (Cookie.json_create cookie_json)
|
172
168
|
end
|
173
|
-
|
169
|
+
from_a cookies
|
174
170
|
end
|
175
171
|
|
176
172
|
# Create a new Jar from an array of Cookie objects. Expired cookies
|
@@ -179,7 +175,7 @@ module CookieJar
|
|
179
175
|
#
|
180
176
|
# @param [Array<Cookie>] cookies array of cookie objects
|
181
177
|
# @return [CookieJar] a new CookieJar instance
|
182
|
-
def self.from_a
|
178
|
+
def self.from_a(cookies)
|
183
179
|
jar = new
|
184
180
|
cookies.each do |cookie|
|
185
181
|
jar.add_cookie cookie
|
@@ -192,10 +188,10 @@ module CookieJar
|
|
192
188
|
#
|
193
189
|
# @param session [Boolean] whether session cookies should be expired,
|
194
190
|
# or just cookies past their expiration date.
|
195
|
-
def expire_cookies
|
196
|
-
@domains.delete_if do |
|
197
|
-
paths.delete_if do |
|
198
|
-
cookies.delete_if do |
|
191
|
+
def expire_cookies(session = false)
|
192
|
+
@domains.delete_if do |_domain, paths|
|
193
|
+
paths.delete_if do |_path, cookies|
|
194
|
+
cookies.delete_if do |_cookie_name, cookie|
|
199
195
|
cookie.expired? || (session && cookie.session?)
|
200
196
|
end
|
201
197
|
cookies.empty?
|
@@ -209,27 +205,36 @@ module CookieJar
|
|
209
205
|
# otherwise unordered.
|
210
206
|
#
|
211
207
|
# @param [String, URI] request_uri the address the HTTP request will be
|
212
|
-
# sent to
|
208
|
+
# sent to. This must be a full URI, i.e. must include the protocol,
|
209
|
+
# if you pass digi.ninja it will fail to find the domain, you must pass
|
210
|
+
# http://digi.ninja
|
213
211
|
# @param [Hash] opts options controlling returned cookies
|
214
|
-
# @option opts [Boolean] :script (false) Cookies marked HTTP-only will be
|
215
|
-
# if true
|
212
|
+
# @option opts [Boolean] :script (false) Cookies marked HTTP-only will be
|
213
|
+
# ignored if true
|
216
214
|
# @return [Array<Cookie>] cookies which should be sent in the HTTP request
|
217
|
-
def get_cookies
|
215
|
+
def get_cookies(request_uri, opts = {})
|
218
216
|
uri = to_uri request_uri
|
219
217
|
hosts = Cookie.compute_search_domains uri
|
220
218
|
|
219
|
+
return [] if hosts.nil?
|
220
|
+
|
221
|
+
path = if uri.path == ''
|
222
|
+
'/'
|
223
|
+
else
|
224
|
+
uri.path
|
225
|
+
end
|
226
|
+
|
221
227
|
results = []
|
222
228
|
hosts.each do |host|
|
223
229
|
domain = find_domain host
|
224
|
-
domain.each do |
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
end
|
230
|
+
domain.each do |apath, cookies|
|
231
|
+
next unless path.start_with? apath
|
232
|
+
results += cookies.values.select do |cookie|
|
233
|
+
cookie.should_send? uri, opts[:script]
|
229
234
|
end
|
230
235
|
end
|
231
236
|
end
|
232
|
-
#Sort by path length, longest first
|
237
|
+
# Sort by path length, longest first
|
233
238
|
results.sort do |lhs, rhs|
|
234
239
|
rhs.path.length <=> lhs.path.length
|
235
240
|
end
|
@@ -242,22 +247,19 @@ module CookieJar
|
|
242
247
|
# @param [String, URI] request_uri the address the HTTP request will be
|
243
248
|
# sent to
|
244
249
|
# @param [Hash] opts options controlling returned cookies
|
245
|
-
# @option opts [Boolean] :script (false) Cookies marked HTTP-only will be
|
246
|
-
# if true
|
250
|
+
# @option opts [Boolean] :script (false) Cookies marked HTTP-only will be
|
251
|
+
# ignored if true
|
247
252
|
# @return String value of the Cookie header which should be sent on the
|
248
253
|
# HTTP request
|
249
|
-
def get_cookie_header
|
254
|
+
def get_cookie_header(request_uri, opts = {})
|
250
255
|
cookies = get_cookies request_uri, opts
|
251
|
-
|
252
|
-
ver = [[],[]]
|
256
|
+
ver = [[], []]
|
253
257
|
cookies.each do |cookie|
|
254
258
|
ver[cookie.version] << cookie
|
255
259
|
end
|
256
|
-
if
|
260
|
+
if ver[1].empty?
|
257
261
|
# can do a netscape-style cookie header, relish the opportunity
|
258
|
-
cookies.map
|
259
|
-
cookie.to_s
|
260
|
-
end.join ";"
|
262
|
+
cookies.map(&:to_s).join ';'
|
261
263
|
else
|
262
264
|
# build a RFC 2965-style cookie header. Split the cookies into
|
263
265
|
# version 0 and 1 groups so that we can reuse the '$Version' header
|
@@ -265,46 +267,46 @@ module CookieJar
|
|
265
267
|
unless ver[0].empty?
|
266
268
|
result << '$Version=0;'
|
267
269
|
result << ver[0].map do |cookie|
|
268
|
-
(cookie.to_s 1,false)
|
270
|
+
(cookie.to_s 1, false)
|
269
271
|
end.join(';')
|
270
272
|
# separate version 0 and 1 with a comma
|
271
273
|
result << ','
|
272
274
|
end
|
273
275
|
result << '$Version=1;'
|
274
276
|
ver[1].map do |cookie|
|
275
|
-
result << (cookie.to_s 1,false)
|
277
|
+
result << (cookie.to_s 1, false)
|
276
278
|
end
|
277
279
|
result
|
278
280
|
end
|
279
281
|
end
|
280
282
|
|
281
|
-
|
283
|
+
protected
|
282
284
|
|
283
|
-
def gather_header_values
|
285
|
+
def gather_header_values(http_header_value, &_block)
|
284
286
|
result = []
|
285
287
|
if http_header_value.is_a? Array
|
286
288
|
http_header_value.each do |value|
|
287
|
-
result <<
|
289
|
+
result << yield(value)
|
288
290
|
end
|
289
291
|
elsif http_header_value.is_a? String
|
290
|
-
result <<
|
292
|
+
result << yield(http_header_value)
|
291
293
|
end
|
292
294
|
result.compact
|
293
295
|
end
|
294
296
|
|
295
|
-
def to_uri
|
296
|
-
(request_uri.is_a? URI)? request_uri : (URI.parse request_uri)
|
297
|
+
def to_uri(request_uri)
|
298
|
+
(request_uri.is_a? URI) ? request_uri : (URI.parse request_uri)
|
297
299
|
end
|
298
300
|
|
299
|
-
def find_domain
|
301
|
+
def find_domain(host)
|
300
302
|
@domains[host] || {}
|
301
303
|
end
|
302
304
|
|
303
|
-
def find_or_add_domain_for_cookie
|
305
|
+
def find_or_add_domain_for_cookie(cookie)
|
304
306
|
@domains[cookie.domain] ||= {}
|
305
307
|
end
|
306
308
|
|
307
|
-
def add_cookie_to_path
|
309
|
+
def add_cookie_to_path(paths, cookie)
|
308
310
|
path_entry = (paths[cookie.path] ||= {})
|
309
311
|
path_entry[cookie.name] = cookie
|
310
312
|
end
|
data/spec/cookie_spec.rb
CHANGED
@@ -1,176 +1,176 @@
|
|
1
|
-
|
2
|
-
require '
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'spec_helper'
|
3
3
|
|
4
4
|
include CookieJar
|
5
5
|
|
6
|
-
FOO_URL = 'http://localhost/foo'
|
7
|
-
AMMO_URL = 'http://localhost/ammo'
|
6
|
+
FOO_URL = 'http://localhost/foo'.freeze
|
7
|
+
AMMO_URL = 'http://localhost/ammo'.freeze
|
8
8
|
NETSCAPE_SPEC_SET_COOKIE_HEADERS =
|
9
|
-
[['CUSTOMER=WILE_E_COYOTE; path=/; expires=Wednesday, 09-Nov-99 23:12:40 GMT',
|
9
|
+
[['CUSTOMER=WILE_E_COYOTE; path=/; expires=Wednesday, 09-Nov-99 23:12:40 GMT',
|
10
10
|
FOO_URL],
|
11
|
-
|
11
|
+
['PART_NUMBER=ROCKET_LAUNCHER_0001; path=/',
|
12
12
|
FOO_URL],
|
13
|
-
|
13
|
+
['SHIPPING=FEDEX; path=/foo',
|
14
14
|
FOO_URL],
|
15
|
-
|
15
|
+
['PART_NUMBER=ROCKET_LAUNCHER_0001; path=/',
|
16
16
|
FOO_URL],
|
17
|
-
|
18
|
-
AMMO_URL]]
|
17
|
+
['PART_NUMBER=RIDING_ROCKET_0023; path=/ammo',
|
18
|
+
AMMO_URL]].freeze
|
19
19
|
|
20
20
|
describe Cookie do
|
21
|
-
describe
|
22
|
-
it
|
21
|
+
describe '#from_set_cookie' do
|
22
|
+
it 'should handle cookies from the netscape spec' do
|
23
23
|
NETSCAPE_SPEC_SET_COOKIE_HEADERS.each do |value|
|
24
24
|
header, url = *value
|
25
|
-
|
25
|
+
Cookie.from_set_cookie url, header
|
26
26
|
end
|
27
27
|
end
|
28
|
-
it
|
28
|
+
it 'should give back the input names and values' do
|
29
29
|
cookie = Cookie.from_set_cookie 'http://localhost/', 'foo=bar'
|
30
|
-
cookie.name.
|
31
|
-
cookie.value.
|
30
|
+
expect(cookie.name).to eq 'foo'
|
31
|
+
expect(cookie.value).to eq 'bar'
|
32
32
|
end
|
33
|
-
it
|
33
|
+
it 'should normalize domain names' do
|
34
34
|
cookie = Cookie.from_set_cookie 'http://localhost/', 'foo=Bar;domain=LoCaLHoSt.local'
|
35
|
-
cookie.domain.
|
35
|
+
expect(cookie.domain).to eq '.localhost.local'
|
36
36
|
end
|
37
|
-
it
|
37
|
+
it 'should accept non-normalized .local' do
|
38
38
|
cookie = Cookie.from_set_cookie 'http://localhost/', 'foo=bar;domain=.local'
|
39
|
-
cookie.domain.
|
39
|
+
expect(cookie.domain).to eq '.local'
|
40
40
|
end
|
41
|
-
it
|
41
|
+
it 'should accept secure cookies' do
|
42
42
|
cookie = Cookie.from_set_cookie 'https://www.google.com/a/blah', 'GALX=RgmSftjnbPM;Path=/a/;Secure'
|
43
|
-
cookie.name.
|
44
|
-
cookie.secure.
|
43
|
+
expect(cookie.name).to eq 'GALX'
|
44
|
+
expect(cookie.secure).to be_truthy
|
45
45
|
end
|
46
46
|
end
|
47
|
-
describe
|
48
|
-
it
|
47
|
+
describe '#from_set_cookie2' do
|
48
|
+
it 'should give back the input names and values' do
|
49
49
|
cookie = Cookie.from_set_cookie2 'http://localhost/', 'foo=bar;Version=1'
|
50
|
-
cookie.name.
|
51
|
-
cookie.value.
|
50
|
+
expect(cookie.name).to eq 'foo'
|
51
|
+
expect(cookie.value).to eq 'bar'
|
52
52
|
end
|
53
|
-
it
|
53
|
+
it 'should normalize domain names' do
|
54
54
|
cookie = Cookie.from_set_cookie2 'http://localhost/', 'foo=Bar;domain=LoCaLHoSt.local;Version=1'
|
55
|
-
cookie.domain.
|
55
|
+
expect(cookie.domain).to eq '.localhost.local'
|
56
56
|
end
|
57
|
-
it
|
57
|
+
it 'should accept non-normalized .local' do
|
58
58
|
cookie = Cookie.from_set_cookie2 'http://localhost/', 'foo=bar;domain=.local;Version=1'
|
59
|
-
cookie.domain.
|
59
|
+
expect(cookie.domain).to eq '.local'
|
60
60
|
end
|
61
|
-
it
|
61
|
+
it 'should accept secure cookies' do
|
62
62
|
cookie = Cookie.from_set_cookie2 'https://www.google.com/a/blah', 'GALX=RgmSftjnbPM;Path="/a/";Secure;Version=1'
|
63
|
-
cookie.name.
|
64
|
-
cookie.path.
|
65
|
-
cookie.secure.
|
63
|
+
expect(cookie.name).to eq 'GALX'
|
64
|
+
expect(cookie.path).to eq '/a/'
|
65
|
+
expect(cookie.secure).to be_truthy
|
66
66
|
end
|
67
|
-
it
|
68
|
-
lambda do
|
69
|
-
Cookie.from_set_cookie2 'https://www.google.com/a/blah',
|
70
|
-
|
71
|
-
end.
|
67
|
+
it 'should fail on unquoted paths' do
|
68
|
+
expect(lambda do
|
69
|
+
Cookie.from_set_cookie2 'https://www.google.com/a/blah',
|
70
|
+
'GALX=RgmSftjnbPM;Path=/a/;Secure;Version=1'
|
71
|
+
end).to raise_error InvalidCookieError
|
72
72
|
end
|
73
|
-
it
|
73
|
+
it 'should accept quoted values' do
|
74
74
|
cookie = Cookie.from_set_cookie2 'http://localhost/', 'foo="bar";Version=1'
|
75
|
-
cookie.name.
|
76
|
-
cookie.value.
|
75
|
+
expect(cookie.name).to eq 'foo'
|
76
|
+
expect(cookie.value).to eq '"bar"'
|
77
77
|
end
|
78
|
-
it
|
78
|
+
it 'should accept poorly chosen names' do
|
79
79
|
cookie = Cookie.from_set_cookie2 'http://localhost/', 'Version=mine;Version=1'
|
80
|
-
cookie.name.
|
81
|
-
cookie.value.
|
80
|
+
expect(cookie.name).to eq 'Version'
|
81
|
+
expect(cookie.value).to eq 'mine'
|
82
82
|
end
|
83
|
-
it
|
84
|
-
|
83
|
+
it 'should accept quoted parameter values' do
|
84
|
+
Cookie.from_set_cookie2 'http://localhost/', 'foo=bar;Version="1"'
|
85
85
|
end
|
86
|
-
it
|
86
|
+
it 'should honor the discard and max-age parameters' do
|
87
87
|
cookie = Cookie.from_set_cookie2 'http://localhost/', 'f=b;max-age=100;discard;Version=1'
|
88
|
-
cookie.
|
89
|
-
cookie.
|
90
|
-
|
88
|
+
expect(cookie).to be_session
|
89
|
+
expect(cookie).to_not be_expired
|
90
|
+
|
91
91
|
cookie = Cookie.from_set_cookie2 'http://localhost/', 'f=b;max-age=100;Version=1'
|
92
|
-
cookie.
|
92
|
+
expect(cookie).to_not be_session
|
93
93
|
|
94
94
|
cookie = Cookie.from_set_cookie2 'http://localhost/', 'f=b;Version=1'
|
95
|
-
cookie.
|
95
|
+
expect(cookie).to be_session
|
96
96
|
end
|
97
|
-
it
|
97
|
+
it 'should handle quotable quotes' do
|
98
98
|
cookie = Cookie.from_set_cookie2 'http://localhost/', 'f="\"";Version=1'
|
99
|
-
cookie.value.
|
99
|
+
expect(cookie.value).to eq '"\""'
|
100
100
|
end
|
101
|
-
it
|
101
|
+
it 'should handle quotable apostrophes' do
|
102
102
|
cookie = Cookie.from_set_cookie2 'http://localhost/', 'f="\;";Version=1'
|
103
|
-
cookie.value.
|
103
|
+
expect(cookie.value).to eq '"\;"'
|
104
104
|
end
|
105
105
|
end
|
106
106
|
describe '#decoded_value' do
|
107
|
-
it
|
107
|
+
it 'should leave normal values alone' do
|
108
108
|
cookie = Cookie.from_set_cookie2 'http://localhost/', 'f=b;Version=1'
|
109
|
-
cookie.decoded_value.
|
109
|
+
expect(cookie.decoded_value).to eq 'b'
|
110
110
|
end
|
111
|
-
it
|
111
|
+
it 'should attempt to unencode quoted values' do
|
112
112
|
cookie = Cookie.from_set_cookie2 'http://localhost/', 'f="\"b";Version=1'
|
113
|
-
cookie.value.
|
114
|
-
cookie.decoded_value.
|
113
|
+
expect(cookie.value).to eq '"\"b"'
|
114
|
+
expect(cookie.decoded_value).to eq '"b'
|
115
115
|
end
|
116
116
|
end
|
117
117
|
describe '#to_s' do
|
118
|
-
it
|
118
|
+
it 'should handle a simple cookie' do
|
119
119
|
cookie = Cookie.from_set_cookie 'http://localhost/', 'f=b'
|
120
|
-
cookie.to_s.
|
121
|
-
cookie.to_s(1).
|
120
|
+
expect(cookie.to_s).to eq 'f=b'
|
121
|
+
expect(cookie.to_s(1)).to eq '$Version=0;f=b;$Path="/"'
|
122
122
|
end
|
123
|
-
it
|
123
|
+
it 'should report an explicit domain' do
|
124
124
|
cookie = Cookie.from_set_cookie2 'http://localhost/', 'f=b;Version=1;Domain=.local'
|
125
|
-
cookie.to_s(1).
|
125
|
+
expect(cookie.to_s(1)).to eq '$Version=1;f=b;$Path="/";$Domain=.local'
|
126
126
|
end
|
127
|
-
it
|
127
|
+
it 'should return specified ports' do
|
128
128
|
cookie = Cookie.from_set_cookie2 'http://localhost/', 'f=b;Version=1;Port="80,443"'
|
129
|
-
cookie.to_s(1).
|
129
|
+
expect(cookie.to_s(1)).to eq '$Version=1;f=b;$Path="/";$Port="80,443"'
|
130
130
|
end
|
131
|
-
it
|
131
|
+
it 'should handle specified paths' do
|
132
132
|
cookie = Cookie.from_set_cookie 'http://localhost/bar/', 'f=b;path=/bar/'
|
133
|
-
cookie.to_s.
|
134
|
-
cookie.to_s(1).
|
133
|
+
expect(cookie.to_s).to eq 'f=b'
|
134
|
+
expect(cookie.to_s(1)).to eq '$Version=0;f=b;$Path="/bar/"'
|
135
135
|
end
|
136
|
-
it
|
136
|
+
it 'should omit $Version header when asked' do
|
137
137
|
cookie = Cookie.from_set_cookie 'http://localhost/', 'f=b'
|
138
|
-
cookie.to_s(1,false).
|
138
|
+
expect(cookie.to_s(1, false)).to eq 'f=b;$Path="/"'
|
139
139
|
end
|
140
140
|
end
|
141
141
|
describe '#should_send?' do
|
142
|
-
it
|
142
|
+
it 'should not send if ports do not match' do
|
143
143
|
cookie = Cookie.from_set_cookie2 'http://localhost/', 'f=b;Version=1;Port="80"'
|
144
|
-
cookie.should_send?(
|
145
|
-
cookie.should_send?(
|
144
|
+
expect(cookie.should_send?('http://localhost/', false)).to be_truthy
|
145
|
+
expect(cookie.should_send?('https://localhost/', false)).to be_falsey
|
146
146
|
end
|
147
147
|
end
|
148
148
|
begin
|
149
149
|
require 'json'
|
150
|
-
describe
|
151
|
-
it
|
150
|
+
describe '.to_json' do
|
151
|
+
it 'should serialize a cookie to JSON' do
|
152
152
|
c = Cookie.from_set_cookie 'https://localhost/', 'foo=bar;secure;expires=Fri, September 11 2009 18:10:00 -0700'
|
153
153
|
json = c.to_json
|
154
|
-
json.
|
154
|
+
expect(json).to be_a String
|
155
155
|
end
|
156
156
|
end
|
157
|
-
describe
|
158
|
-
it
|
159
|
-
json =
|
157
|
+
describe '.json_create' do
|
158
|
+
it 'should deserialize JSON to a cookie' do
|
159
|
+
json = '{"name":"foo","value":"bar","domain":"localhost.local","path":"\\/","created_at":"2009-09-11 12:51:03 -0600","expiry":"2009-09-11 19:10:00 -0600","secure":true}'
|
160
160
|
hash = JSON.parse json
|
161
161
|
c = Cookie.json_create hash
|
162
162
|
CookieValidation.validate_cookie 'https://localhost/', c
|
163
163
|
end
|
164
|
-
it
|
165
|
-
json =
|
166
|
-
c = JSON.parse json, :
|
167
|
-
c.
|
164
|
+
it 'should automatically deserialize to a cookie' do
|
165
|
+
json = '{"json_class":"CookieJar::Cookie","name":"foo","value":"bar","domain":"localhost.local","path":"\\/","created_at":"2009-09-11 12:51:03 -0600","expiry":"2009-09-11 19:10:00 -0600","secure":true}'
|
166
|
+
c = JSON.parse json, create_additions: true
|
167
|
+
expect(c).to be_a Cookie
|
168
168
|
CookieValidation.validate_cookie 'https://localhost/', c
|
169
169
|
end
|
170
170
|
end
|
171
171
|
rescue LoadError
|
172
|
-
it
|
173
|
-
raise
|
172
|
+
it 'does not appear the JSON library is installed' do
|
173
|
+
raise 'please install the JSON library'
|
174
174
|
end
|
175
175
|
end
|
176
176
|
end
|