riak-sessions 0.9.2 → 0.9.7

Sign up to get free protection for your applications and to get access to all the features.
@@ -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]
@@ -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.2"
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 = ["Sean Cribbs"]
9
- s.date = %q{2011-04-11}
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 = ["Gemfile", "lib/riak/session_store.rb", "lib/riak-sessions.rb", "lib/ripple/session_store.rb", "Rakefile", "riak-sessions.gemspec", "spec/fixtures/session_autoload_test/session_autoload_test/foo.rb", "spec/riak_session_store_spec.rb", "spec/ripple_session_store_spec.rb", "spec/spec_helper.rb", "spec/support/ripple_session_support.rb", "spec/support/rspec-rails-neuter.rb", "spec/support/test_server.rb", "spec/support/test_server.yml.example"]
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 = ["lib"]
15
- s.rubygems_version = %q{1.7.2}
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 = ["spec/riak_session_store_spec.rb", "spec/ripple_session_store_spec.rb"]
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.2"])
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.2"])
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.2"])
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=blarghfasel"
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
@@ -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
- date: 2011-04-11 00:00:00 Z
14
- dependencies:
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
- prerelease: false
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
- requirement: &id002 !ruby/object:Gem::Requirement
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
- requirement: &id003 !ruby/object:Gem::Requirement
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: "0"
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
- requirement: &id004 !ruby/object:Gem::Requirement
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
- requirement: &id005 !ruby/object:Gem::Requirement
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: "0"
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
- requirement: &id006 !ruby/object:Gem::Requirement
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.2
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
- requirement: &id007 !ruby/object:Gem::Requirement
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: "1.0"
84
+ requirements:
85
+ - - ! '>='
86
+ - !ruby/object:Gem::Version
87
+ version: '1.0'
90
88
  type: :runtime
91
- version_requirements: *id007
92
- description: riak-sessions is a session store backed by Riak, the distributed database by Basho. It includes session implementations for both Rack and Rails 3.
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: "0"
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: "0"
126
+ requirements:
127
+ - - ! '>='
128
+ - !ruby/object:Gem::Version
129
+ version: '0'
135
130
  requirements: []
136
-
137
131
  rubyforge_project:
138
- rubygems_version: 1.7.2
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 by Basho.
142
- test_files:
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