riak-sessions 0.9.2 → 0.9.7
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/riak/session_store.rb +20 -2
- data/riak-sessions.gemspec +10 -10
- data/spec/riak_session_store_spec.rb +58 -1
- data/spec/spec_helper.rb +1 -1
- metadata +73 -78
data/lib/riak/session_store.rb
CHANGED
@@ -25,6 +25,9 @@ module Riak
|
|
25
25
|
# Usage (Rails):
|
26
26
|
# config.middleware.use Riak::SessionStore
|
27
27
|
#
|
28
|
+
# Usage (Rails 2.3), requires you to swap out the default store:
|
29
|
+
# config.middleware.swap ActionController::Session::CookieStore, Riak::SessionStore
|
30
|
+
#
|
28
31
|
# For configuration options, see #initialize.
|
29
32
|
class SessionStore < Rack::Session::Abstract::ID
|
30
33
|
DEFAULT_OPTIONS = Rack::Session::Abstract::ID::DEFAULT_OPTIONS.merge \
|
@@ -36,8 +39,8 @@ module Riak
|
|
36
39
|
:dw => 0,
|
37
40
|
:rw => 1,
|
38
41
|
:n_val => 2,
|
39
|
-
:last_write_wins => false
|
40
|
-
|
42
|
+
:last_write_wins => false,
|
43
|
+
:content_type => "application/x-ruby-marshal"
|
41
44
|
|
42
45
|
attr_reader :bucket
|
43
46
|
|
@@ -47,6 +50,7 @@ module Riak
|
|
47
50
|
# @see Rack::Session::Abstract::ID#initialize
|
48
51
|
def initialize(app, options={})
|
49
52
|
super
|
53
|
+
@riak_options = options.merge(DEFAULT_OPTIONS)
|
50
54
|
@client = Riak::Client.new(@default_options.slice(*Riak::Client::VALID_OPTIONS))
|
51
55
|
@bucket = @client.bucket(default_options[:bucket])
|
52
56
|
set_bucket_defaults
|
@@ -63,6 +67,7 @@ module Riak
|
|
63
67
|
private
|
64
68
|
def get_session(env, session_id)
|
65
69
|
if session_id && robject = (bucket.get(session_id) rescue nil)
|
70
|
+
@session_id = session_id
|
66
71
|
if stale?(robject)
|
67
72
|
bucket.delete(session_id)
|
68
73
|
fresh_session
|
@@ -79,8 +84,20 @@ module Riak
|
|
79
84
|
bucket.delete(session_id)
|
80
85
|
return false if options[:drop]
|
81
86
|
session_id = generate_sid
|
87
|
+
elsif session_id.nil?
|
88
|
+
# Rails 2.3 kills the session id from the request when
|
89
|
+
# reset_session is called. Working around that by temp.
|
90
|
+
# storing it in the middleware and explicitly destroying it
|
91
|
+
# as it's not guaranteed that Riak expiry is enabled
|
92
|
+
session_id = if @session_id
|
93
|
+
destroy_session(env, @session_id, options)
|
94
|
+
else
|
95
|
+
generate_sid
|
96
|
+
end
|
82
97
|
end
|
98
|
+
|
83
99
|
robject = bucket.get_or_new(session_id)
|
100
|
+
robject.content_type = options[:content_type]
|
84
101
|
robject.meta['expire-after'] = (Time.now + options[:expire_after]).httpdate if options[:expire_after]
|
85
102
|
robject.data = session
|
86
103
|
robject.store
|
@@ -106,6 +123,7 @@ module Riak
|
|
106
123
|
def fresh_session
|
107
124
|
session_id, robject = generate_sid, bucket.new
|
108
125
|
robject.key = session_id
|
126
|
+
robject.content_type = @riak_options[:content_type]
|
109
127
|
robject.data = {}
|
110
128
|
robject.store
|
111
129
|
[session_id, robject.data]
|
data/riak-sessions.gemspec
CHANGED
@@ -2,19 +2,19 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{riak-sessions}
|
5
|
-
s.version = "0.9.
|
5
|
+
s.version = "0.9.7"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
|
-
s.authors = [
|
9
|
-
s.date = %q{2011-
|
8
|
+
s.authors = [%q{Sean Cribbs}]
|
9
|
+
s.date = %q{2011-07-26}
|
10
10
|
s.description = %q{riak-sessions is a session store backed by Riak, the distributed database by Basho. It includes session implementations for both Rack and Rails 3.}
|
11
11
|
s.email = %q{sean@basho.com}
|
12
|
-
s.files = [
|
12
|
+
s.files = [%q{Gemfile}, %q{lib/riak/session_store.rb}, %q{lib/riak-sessions.rb}, %q{lib/ripple/session_store.rb}, %q{Rakefile}, %q{riak-sessions.gemspec}, %q{spec/fixtures/session_autoload_test/session_autoload_test/foo.rb}, %q{spec/riak_session_store_spec.rb}, %q{spec/ripple_session_store_spec.rb}, %q{spec/spec_helper.rb}, %q{spec/support/ripple_session_support.rb}, %q{spec/support/rspec-rails-neuter.rb}, %q{spec/support/test_server.rb}, %q{spec/support/test_server.yml.example}]
|
13
13
|
s.homepage = %q{http://seancribbs.github.com/ripple}
|
14
|
-
s.require_paths = [
|
15
|
-
s.rubygems_version = %q{1.
|
14
|
+
s.require_paths = [%q{lib}]
|
15
|
+
s.rubygems_version = %q{1.8.5}
|
16
16
|
s.summary = %q{riak-sessions is a session store backed by Riak, the distributed database by Basho.}
|
17
|
-
s.test_files = [
|
17
|
+
s.test_files = [%q{spec/riak_session_store_spec.rb}, %q{spec/ripple_session_store_spec.rb}]
|
18
18
|
|
19
19
|
if s.respond_to? :specification_version then
|
20
20
|
s.specification_version = 3
|
@@ -25,7 +25,7 @@ Gem::Specification.new do |s|
|
|
25
25
|
s.add_development_dependency(%q<yajl-ruby>, [">= 0"])
|
26
26
|
s.add_development_dependency(%q<rails>, ["~> 3.0.0"])
|
27
27
|
s.add_development_dependency(%q<rake>, [">= 0"])
|
28
|
-
s.add_runtime_dependency(%q<riak-client>, ["~> 0.9.
|
28
|
+
s.add_runtime_dependency(%q<riak-client>, ["~> 0.9.7"])
|
29
29
|
s.add_runtime_dependency(%q<rack>, [">= 1.0"])
|
30
30
|
else
|
31
31
|
s.add_dependency(%q<rspec>, ["~> 2.4.0"])
|
@@ -33,7 +33,7 @@ Gem::Specification.new do |s|
|
|
33
33
|
s.add_dependency(%q<yajl-ruby>, [">= 0"])
|
34
34
|
s.add_dependency(%q<rails>, ["~> 3.0.0"])
|
35
35
|
s.add_dependency(%q<rake>, [">= 0"])
|
36
|
-
s.add_dependency(%q<riak-client>, ["~> 0.9.
|
36
|
+
s.add_dependency(%q<riak-client>, ["~> 0.9.7"])
|
37
37
|
s.add_dependency(%q<rack>, [">= 1.0"])
|
38
38
|
end
|
39
39
|
else
|
@@ -42,7 +42,7 @@ Gem::Specification.new do |s|
|
|
42
42
|
s.add_dependency(%q<yajl-ruby>, [">= 0"])
|
43
43
|
s.add_dependency(%q<rails>, ["~> 3.0.0"])
|
44
44
|
s.add_dependency(%q<rake>, [">= 0"])
|
45
|
-
s.add_dependency(%q<riak-client>, ["~> 0.9.
|
45
|
+
s.add_dependency(%q<riak-client>, ["~> 0.9.7"])
|
46
46
|
s.add_dependency(%q<rack>, [">= 1.0"])
|
47
47
|
end
|
48
48
|
end
|
@@ -36,6 +36,11 @@ describe Riak::SessionStore do
|
|
36
36
|
env['rack.session.options'][:defer] = true
|
37
37
|
incrementor.call(env)
|
38
38
|
end
|
39
|
+
reset_session = proc do |env|
|
40
|
+
env['rack.session.options'].delete(:id)
|
41
|
+
env['rack.session'] = {}
|
42
|
+
incrementor.call(env)
|
43
|
+
end
|
39
44
|
|
40
45
|
it "creates a new cookie" do
|
41
46
|
pool = Riak::SessionStore.new(incrementor)
|
@@ -56,7 +61,7 @@ describe Riak::SessionStore do
|
|
56
61
|
end
|
57
62
|
|
58
63
|
it "survives nonexistant cookies" do
|
59
|
-
bad_cookie = "rack.session
|
64
|
+
bad_cookie = "rack.session=#{Digest::SHA1.hexdigest(Time.now.to_s)}"
|
60
65
|
pool = Riak::SessionStore.new(incrementor)
|
61
66
|
res = Rack::MockRequest.new(pool).
|
62
67
|
get("/", "HTTP_COOKIE" => bad_cookie)
|
@@ -102,6 +107,7 @@ describe Riak::SessionStore do
|
|
102
107
|
res3["Set-Cookie"][session_match].should_not == session
|
103
108
|
res3.body.should == '{"counter"=>1}'
|
104
109
|
end
|
110
|
+
|
105
111
|
it "provides new session id with :renew option" do
|
106
112
|
pool = Riak::SessionStore.new(incrementor)
|
107
113
|
req = Rack::MockRequest.new(pool)
|
@@ -149,4 +155,55 @@ describe Riak::SessionStore do
|
|
149
155
|
res3["Set-Cookie"][session_match].should == session
|
150
156
|
res3.body.should == '{"counter"=>4}'
|
151
157
|
end
|
158
|
+
|
159
|
+
it "should store the session as marshaled Ruby" do
|
160
|
+
client = Riak::Client.new(Riak::SessionStore::DEFAULT_OPTIONS.slice(*Riak::Client::VALID_OPTIONS))
|
161
|
+
pool = Riak::SessionStore.new(incrementor)
|
162
|
+
res = Rack::MockRequest.new(pool).get("/")
|
163
|
+
session_id = res["Set-Cookie"].gsub(/rack\.session=([a-z0-9]+);.+$/, '\1')
|
164
|
+
session = client.bucket('_sessions').get(session_id)
|
165
|
+
session.content_type.should == "application/x-ruby-marshal"
|
166
|
+
end
|
167
|
+
|
168
|
+
it "should create a new session when the session is harshly reset" do
|
169
|
+
pool = Riak::SessionStore.new(incrementor)
|
170
|
+
req = Rack::MockRequest.new(pool)
|
171
|
+
reset_session = Rack::Utils::Context.new(pool, reset_session)
|
172
|
+
reset_req = Rack::MockRequest.new(reset_session)
|
173
|
+
|
174
|
+
res0 = req.get("/")
|
175
|
+
session = (cookie = res0["Set-Cookie"])[session_match]
|
176
|
+
res0.body.should == '{"counter"=>1}'
|
177
|
+
|
178
|
+
res1 = req.get("/", "HTTP_COOKIE" => cookie)
|
179
|
+
res1["Set-Cookie"][session_match].should == session
|
180
|
+
res1.body.should == '{"counter"=>2}'
|
181
|
+
|
182
|
+
res2 = reset_req.get("/", "HTTP_COOKIE" => cookie)
|
183
|
+
res2["Set-Cookie"][session_match].should_not == session
|
184
|
+
res2.body.should == '{"counter"=>1}'
|
185
|
+
end
|
186
|
+
|
187
|
+
it "should delete the old session when the session is harshly reset" do
|
188
|
+
pool = Riak::SessionStore.new(incrementor)
|
189
|
+
req = Rack::MockRequest.new(pool)
|
190
|
+
reset_session = Rack::Utils::Context.new(pool, reset_session)
|
191
|
+
reset_req = Rack::MockRequest.new(reset_session)
|
192
|
+
|
193
|
+
res0 = req.get("/")
|
194
|
+
session = (cookie = res0["Set-Cookie"])[session_match]
|
195
|
+
res0.body.should == '{"counter"=>1}'
|
196
|
+
|
197
|
+
res1 = req.get("/", "HTTP_COOKIE" => cookie)
|
198
|
+
res1["Set-Cookie"][session_match].should == session
|
199
|
+
res1.body.should == '{"counter"=>2}'
|
200
|
+
|
201
|
+
res2 = reset_req.get("/", "HTTP_COOKIE" => cookie)
|
202
|
+
|
203
|
+
client = Riak::Client.new(Riak::SessionStore::DEFAULT_OPTIONS.slice(*Riak::Client::VALID_OPTIONS))
|
204
|
+
expect {
|
205
|
+
client.bucket('_session').get(session)
|
206
|
+
}.to raise_error(Riak::HTTPFailedRequest)
|
207
|
+
end
|
208
|
+
|
152
209
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -21,7 +21,7 @@ require 'riak'
|
|
21
21
|
require 'riak-sessions'
|
22
22
|
require 'rspec'
|
23
23
|
|
24
|
-
Dir[File.join(File.dirname(__FILE__), "support", "*.rb")].each {|f| require f }
|
24
|
+
Dir[File.join(File.dirname(__FILE__), "support", "*.rb")].sort.each {|f| require f }
|
25
25
|
|
26
26
|
RSpec.configure do |config|
|
27
27
|
config.mock_with :rspec
|
metadata
CHANGED
@@ -1,103 +1,100 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: riak-sessions
|
3
|
-
version: !ruby/object:Gem::Version
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.9.7
|
4
5
|
prerelease:
|
5
|
-
version: 0.9.2
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- Sean Cribbs
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2011-07-26 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
16
15
|
name: rspec
|
17
|
-
|
18
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: &2156045460 !ruby/object:Gem::Requirement
|
19
17
|
none: false
|
20
|
-
requirements:
|
18
|
+
requirements:
|
21
19
|
- - ~>
|
22
|
-
- !ruby/object:Gem::Version
|
20
|
+
- !ruby/object:Gem::Version
|
23
21
|
version: 2.4.0
|
24
22
|
type: :development
|
25
|
-
version_requirements: *id001
|
26
|
-
- !ruby/object:Gem::Dependency
|
27
|
-
name: rspec-rails
|
28
23
|
prerelease: false
|
29
|
-
|
24
|
+
version_requirements: *2156045460
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rspec-rails
|
27
|
+
requirement: &2156038140 !ruby/object:Gem::Requirement
|
30
28
|
none: false
|
31
|
-
requirements:
|
29
|
+
requirements:
|
32
30
|
- - ~>
|
33
|
-
- !ruby/object:Gem::Version
|
31
|
+
- !ruby/object:Gem::Version
|
34
32
|
version: 2.4.0
|
35
33
|
type: :development
|
36
|
-
version_requirements: *id002
|
37
|
-
- !ruby/object:Gem::Dependency
|
38
|
-
name: yajl-ruby
|
39
34
|
prerelease: false
|
40
|
-
|
35
|
+
version_requirements: *2156038140
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: yajl-ruby
|
38
|
+
requirement: &2156036520 !ruby/object:Gem::Requirement
|
41
39
|
none: false
|
42
|
-
requirements:
|
43
|
-
- -
|
44
|
-
- !ruby/object:Gem::Version
|
45
|
-
version:
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
46
44
|
type: :development
|
47
|
-
version_requirements: *id003
|
48
|
-
- !ruby/object:Gem::Dependency
|
49
|
-
name: rails
|
50
45
|
prerelease: false
|
51
|
-
|
46
|
+
version_requirements: *2156036520
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: rails
|
49
|
+
requirement: &2156035340 !ruby/object:Gem::Requirement
|
52
50
|
none: false
|
53
|
-
requirements:
|
51
|
+
requirements:
|
54
52
|
- - ~>
|
55
|
-
- !ruby/object:Gem::Version
|
53
|
+
- !ruby/object:Gem::Version
|
56
54
|
version: 3.0.0
|
57
55
|
type: :development
|
58
|
-
version_requirements: *id004
|
59
|
-
- !ruby/object:Gem::Dependency
|
60
|
-
name: rake
|
61
56
|
prerelease: false
|
62
|
-
|
57
|
+
version_requirements: *2156035340
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: rake
|
60
|
+
requirement: &2156034040 !ruby/object:Gem::Requirement
|
63
61
|
none: false
|
64
|
-
requirements:
|
65
|
-
- -
|
66
|
-
- !ruby/object:Gem::Version
|
67
|
-
version:
|
62
|
+
requirements:
|
63
|
+
- - ! '>='
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '0'
|
68
66
|
type: :development
|
69
|
-
version_requirements: *id005
|
70
|
-
- !ruby/object:Gem::Dependency
|
71
|
-
name: riak-client
|
72
67
|
prerelease: false
|
73
|
-
|
68
|
+
version_requirements: *2156034040
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: riak-client
|
71
|
+
requirement: &2156031880 !ruby/object:Gem::Requirement
|
74
72
|
none: false
|
75
|
-
requirements:
|
73
|
+
requirements:
|
76
74
|
- - ~>
|
77
|
-
- !ruby/object:Gem::Version
|
78
|
-
version: 0.9.
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: 0.9.7
|
79
77
|
type: :runtime
|
80
|
-
version_requirements: *id006
|
81
|
-
- !ruby/object:Gem::Dependency
|
82
|
-
name: rack
|
83
78
|
prerelease: false
|
84
|
-
|
79
|
+
version_requirements: *2156031880
|
80
|
+
- !ruby/object:Gem::Dependency
|
81
|
+
name: rack
|
82
|
+
requirement: &2156030500 !ruby/object:Gem::Requirement
|
85
83
|
none: false
|
86
|
-
requirements:
|
87
|
-
- -
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version:
|
84
|
+
requirements:
|
85
|
+
- - ! '>='
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '1.0'
|
90
88
|
type: :runtime
|
91
|
-
|
92
|
-
|
89
|
+
prerelease: false
|
90
|
+
version_requirements: *2156030500
|
91
|
+
description: riak-sessions is a session store backed by Riak, the distributed database
|
92
|
+
by Basho. It includes session implementations for both Rack and Rails 3.
|
93
93
|
email: sean@basho.com
|
94
94
|
executables: []
|
95
|
-
|
96
95
|
extensions: []
|
97
|
-
|
98
96
|
extra_rdoc_files: []
|
99
|
-
|
100
|
-
files:
|
97
|
+
files:
|
101
98
|
- Gemfile
|
102
99
|
- lib/riak/session_store.rb
|
103
100
|
- lib/riak-sessions.rb
|
@@ -114,31 +111,29 @@ files:
|
|
114
111
|
- spec/support/test_server.yml.example
|
115
112
|
homepage: http://seancribbs.github.com/ripple
|
116
113
|
licenses: []
|
117
|
-
|
118
114
|
post_install_message:
|
119
115
|
rdoc_options: []
|
120
|
-
|
121
|
-
require_paths:
|
116
|
+
require_paths:
|
122
117
|
- lib
|
123
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
118
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
124
119
|
none: false
|
125
|
-
requirements:
|
126
|
-
- -
|
127
|
-
- !ruby/object:Gem::Version
|
128
|
-
version:
|
129
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
120
|
+
requirements:
|
121
|
+
- - ! '>='
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
version: '0'
|
124
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
130
125
|
none: false
|
131
|
-
requirements:
|
132
|
-
- -
|
133
|
-
- !ruby/object:Gem::Version
|
134
|
-
version:
|
126
|
+
requirements:
|
127
|
+
- - ! '>='
|
128
|
+
- !ruby/object:Gem::Version
|
129
|
+
version: '0'
|
135
130
|
requirements: []
|
136
|
-
|
137
131
|
rubyforge_project:
|
138
|
-
rubygems_version: 1.
|
132
|
+
rubygems_version: 1.8.5
|
139
133
|
signing_key:
|
140
134
|
specification_version: 3
|
141
|
-
summary: riak-sessions is a session store backed by Riak, the distributed database
|
142
|
-
|
135
|
+
summary: riak-sessions is a session store backed by Riak, the distributed database
|
136
|
+
by Basho.
|
137
|
+
test_files:
|
143
138
|
- spec/riak_session_store_spec.rb
|
144
139
|
- spec/ripple_session_store_spec.rb
|