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.
@@ -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