redis-rack 2.0.4 → 2.0.5
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/README.md +5 -0
- data/lib/rack/session/redis.rb +7 -24
- data/lib/redis/rack/connection.rb +42 -0
- data/lib/redis/rack/version.rb +1 -1
- data/test/rack/session/redis_test.rb +21 -14
- data/test/redis/rack/connection_test.rb +67 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 66572ef2577985ef4e66d8eff099b41cd2522452
|
4
|
+
data.tar.gz: 021ff43d18f10505f52187456132922eddea15b8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dd6ac3b843ebadac7e56d802680badd2163ac0320a90377e94f730465c739ee74738e5c2b347a34c4fae1b6d94160a8f988c8e748ab540c820750ed7792b2ae0
|
7
|
+
data.tar.gz: b26ae6bfb3306d19260454d41ce2559e88997365bfc713c10fd33168b8e70ea052b45be7fed5e5370a8c36b0b66c5415935df19d77ae2a6cef1db64fd925e36c
|
data/README.md
CHANGED
@@ -42,6 +42,11 @@ require 'rack'
|
|
42
42
|
require 'rack/session/redis'
|
43
43
|
|
44
44
|
use Rack::Session::Redis
|
45
|
+
|
46
|
+
# Alternatively you can specify options to use:
|
47
|
+
use Rack::Session::Redis,
|
48
|
+
:redis_server => "redis://redis:6379/0",
|
49
|
+
:expires_in => 3600 # Seconds. If you are using ActiveSupport you can use 1.hour
|
45
50
|
```
|
46
51
|
|
47
52
|
## Development
|
data/lib/rack/session/redis.rb
CHANGED
@@ -1,38 +1,26 @@
|
|
1
1
|
require 'rack/session/abstract/id'
|
2
2
|
require 'redis-store'
|
3
3
|
require 'thread'
|
4
|
+
require 'redis/rack/connection'
|
4
5
|
|
5
6
|
module Rack
|
6
7
|
module Session
|
7
8
|
class Redis < Abstract::ID
|
8
|
-
attr_reader :mutex
|
9
|
+
attr_reader :mutex
|
9
10
|
|
10
|
-
DEFAULT_OPTIONS = Abstract::ID::DEFAULT_OPTIONS.merge
|
11
|
+
DEFAULT_OPTIONS = Abstract::ID::DEFAULT_OPTIONS.merge(
|
11
12
|
:redis_server => 'redis://127.0.0.1:6379/0/rack:session'
|
13
|
+
)
|
12
14
|
|
13
15
|
def initialize(app, options = {})
|
14
16
|
super
|
15
17
|
|
16
18
|
@mutex = Mutex.new
|
17
|
-
@
|
18
|
-
raise "pool must be an instance of ConnectionPool" unless @default_options[:pool].is_a?(ConnectionPool)
|
19
|
-
@pooled = true
|
20
|
-
@default_options[:pool]
|
21
|
-
elsif [:pool_size, :pool_timeout].any? { |key| @default_options.has_key?(key) }
|
22
|
-
pool_options = {}
|
23
|
-
pool_options[:size] = options[:pool_size] if options[:pool_size]
|
24
|
-
pool_options[:timeout] = options[:pool_timeout] if options[:pool_timeout]
|
25
|
-
@pooled = true
|
26
|
-
::ConnectionPool.new(pool_options) { ::Redis::Store::Factory.create(@default_options[:redis_server]) }
|
27
|
-
else
|
28
|
-
@default_options.has_key?(:redis_store) ?
|
29
|
-
@default_options[:redis_store] :
|
30
|
-
::Redis::Store::Factory.create(@default_options[:redis_server])
|
31
|
-
|
32
|
-
end
|
19
|
+
@conn = ::Redis::Rack::Connection.new(@default_options)
|
33
20
|
end
|
34
21
|
|
35
22
|
def generate_unique_sid(session)
|
23
|
+
return generate_sid if session.empty?
|
36
24
|
loop do
|
37
25
|
sid = generate_sid
|
38
26
|
first = with do |c|
|
@@ -88,13 +76,8 @@ module Rack
|
|
88
76
|
end
|
89
77
|
|
90
78
|
def with(&block)
|
91
|
-
|
92
|
-
@pool.with(&block)
|
93
|
-
else
|
94
|
-
block.call(@pool)
|
95
|
-
end
|
79
|
+
@conn.with(&block)
|
96
80
|
end
|
97
|
-
|
98
81
|
end
|
99
82
|
end
|
100
83
|
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
class Redis
|
2
|
+
module Rack
|
3
|
+
class Connection
|
4
|
+
def initialize(options = {})
|
5
|
+
@options = options
|
6
|
+
@store = options[:redis_store]
|
7
|
+
@pool = options[:pool]
|
8
|
+
|
9
|
+
if @pool && !@pool.is_a?(ConnectionPool)
|
10
|
+
raise ArgumentError, "pool must be an instance of ConnectionPool"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def with(&block)
|
15
|
+
if pooled?
|
16
|
+
pool.with(&block)
|
17
|
+
else
|
18
|
+
block.call(store)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def pooled?
|
23
|
+
[:pool, :pool_size, :pool_timeout].any? { |key| @options.key?(key) }
|
24
|
+
end
|
25
|
+
|
26
|
+
def pool
|
27
|
+
@pool ||= ConnectionPool.new(pool_options) { store } if pooled?
|
28
|
+
end
|
29
|
+
|
30
|
+
def store
|
31
|
+
@store ||= Redis::Store::Factory.create(@options[:redis_server])
|
32
|
+
end
|
33
|
+
|
34
|
+
def pool_options
|
35
|
+
{
|
36
|
+
size: @options[:pool_size],
|
37
|
+
timeout: @options[:pool_timeout]
|
38
|
+
}
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
data/lib/redis/rack/version.rb
CHANGED
@@ -39,8 +39,9 @@ describe Rack::Session::Redis do
|
|
39
39
|
|
40
40
|
it "can create it's own pool" do
|
41
41
|
session_store = Rack::Session::Redis.new(incrementor, pool_size: 5, pool_timeout: 10)
|
42
|
-
session_store.
|
43
|
-
|
42
|
+
conn = session_store.instance_variable_get(:@conn)
|
43
|
+
conn.pool.class.must_equal ::ConnectionPool
|
44
|
+
conn.pool.instance_variable_get(:@size).must_equal 5
|
44
45
|
end
|
45
46
|
|
46
47
|
it "can create it's own pool using default Redis server" do
|
@@ -55,30 +56,33 @@ describe Rack::Session::Redis do
|
|
55
56
|
|
56
57
|
it "can use a supplied pool" do
|
57
58
|
session_store = Rack::Session::Redis.new(incrementor, pool: ::ConnectionPool.new(size: 1, timeout: 1) { ::Redis::Store::Factory.create("redis://127.0.0.1:6380/1")})
|
58
|
-
session_store.
|
59
|
-
|
59
|
+
conn = session_store.instance_variable_get(:@conn)
|
60
|
+
conn.pool.class.must_equal ::ConnectionPool
|
61
|
+
conn.pool.instance_variable_get(:@size).must_equal 1
|
60
62
|
end
|
61
63
|
|
62
64
|
it "uses the specified Redis store when provided" do
|
63
65
|
store = ::Redis::Store::Factory.create('redis://127.0.0.1:6380/1')
|
64
66
|
pool = Rack::Session::Redis.new(incrementor, :redis_store => store)
|
65
|
-
pool.
|
66
|
-
|
67
|
+
pool.with do |p|
|
68
|
+
p.to_s.must_match(/127\.0\.0\.1:6380 against DB 1$/)
|
69
|
+
p.must_equal(store)
|
70
|
+
end
|
67
71
|
end
|
68
72
|
|
69
73
|
it "uses the default Redis server and namespace when not provided" do
|
70
74
|
pool = Rack::Session::Redis.new(incrementor)
|
71
|
-
pool.
|
75
|
+
pool.with { |p| p.to_s.must_match(/127\.0\.0\.1:6379 against DB 0 with namespace rack:session$/) }
|
72
76
|
end
|
73
77
|
|
74
78
|
it "uses the specified namespace when provided" do
|
75
79
|
pool = Rack::Session::Redis.new(incrementor, :redis_server => {:namespace => 'test:rack:session'})
|
76
|
-
pool.
|
80
|
+
pool.with { |p| p.to_s.must_match(/namespace test:rack:session$/) }
|
77
81
|
end
|
78
82
|
|
79
83
|
it "uses the specified Redis server when provided" do
|
80
84
|
pool = Rack::Session::Redis.new(incrementor, :redis_server => 'redis://127.0.0.1:6380/1')
|
81
|
-
pool.
|
85
|
+
pool.with { |p| p.to_s.must_match(/127\.0\.0\.1:6380 against DB 1$/) }
|
82
86
|
end
|
83
87
|
|
84
88
|
it "is threadsafe by default" do
|
@@ -86,6 +90,12 @@ describe Rack::Session::Redis do
|
|
86
90
|
sesion_store.threadsafe?.must_equal(true)
|
87
91
|
end
|
88
92
|
|
93
|
+
it "does not store a blank session" do
|
94
|
+
session_store = Rack::Session::Redis.new(incrementor)
|
95
|
+
sid = session_store.generate_unique_sid({})
|
96
|
+
session_store.with { |c| c.get(sid).must_be_nil }
|
97
|
+
end
|
98
|
+
|
89
99
|
it "locks the store mutex" do
|
90
100
|
mutex = Mutex.new
|
91
101
|
mutex.expects(:lock).once
|
@@ -260,15 +270,12 @@ describe Rack::Session::Redis do
|
|
260
270
|
end
|
261
271
|
|
262
272
|
it "does not hit with :skip option" do
|
263
|
-
with_pool_management(incrementor) do |
|
264
|
-
skip = Rack::Utils::Context.new(
|
273
|
+
with_pool_management(incrementor) do |session_store|
|
274
|
+
skip = Rack::Utils::Context.new(session_store, skip_session)
|
265
275
|
sreq = Rack::MockRequest.new(skip)
|
266
276
|
|
267
|
-
pool.instance_variable_set('@pool', MiniTest::Mock.new)
|
268
|
-
|
269
277
|
res0 = sreq.get("/")
|
270
278
|
res0.body.must_equal('{"counter"=>1}')
|
271
|
-
assert pool.pool.verify
|
272
279
|
end
|
273
280
|
end
|
274
281
|
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'connection_pool'
|
3
|
+
require 'redis/rack/connection'
|
4
|
+
|
5
|
+
class Redis
|
6
|
+
module Rack
|
7
|
+
describe Connection do
|
8
|
+
def setup
|
9
|
+
@defaults = {
|
10
|
+
host: 'localhost'
|
11
|
+
}
|
12
|
+
end
|
13
|
+
|
14
|
+
it "can create it's own pool" do
|
15
|
+
conn = Connection.new @defaults.merge(pool_size: 5, pool_timeout: 10)
|
16
|
+
|
17
|
+
conn.pooled?.must_equal true
|
18
|
+
conn.pool.class.must_equal ConnectionPool
|
19
|
+
conn.pool.instance_variable_get(:@size).must_equal 5
|
20
|
+
end
|
21
|
+
|
22
|
+
it "can create it's own pool using default Redis server" do
|
23
|
+
conn = Connection.new @defaults.merge(pool_size: 5, pool_timeout: 10)
|
24
|
+
|
25
|
+
conn.pooled?.must_equal true
|
26
|
+
|
27
|
+
conn.with do |connection|
|
28
|
+
connection.to_s.must_match(/127\.0\.0\.1:6379 against DB 0$/)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
it "can create it's own pool using provided Redis server" do
|
33
|
+
conn = Connection.new(redis_server: 'redis://127.0.0.1:6380/1', pool_size: 5, pool_timeout: 10)
|
34
|
+
conn.pooled?.must_equal true
|
35
|
+
conn.with do |connection|
|
36
|
+
connection.to_s.must_match(/127\.0\.0\.1:6380 against DB 1$/)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
it "can use a supplied pool" do
|
41
|
+
pool = ConnectionPool.new size: 1, timeout: 1 do
|
42
|
+
::Redis::Store::Factory.create('redis://127.0.0.1:6380/1')
|
43
|
+
end
|
44
|
+
conn = Connection.new pool: pool
|
45
|
+
conn.pooled?.must_equal true
|
46
|
+
conn.pool.class.must_equal ConnectionPool
|
47
|
+
conn.pool.instance_variable_get(:@size).must_equal 1
|
48
|
+
end
|
49
|
+
|
50
|
+
it "uses the specified Redis store when provided" do
|
51
|
+
store = ::Redis::Store::Factory.create('redis://127.0.0.1:6380/1')
|
52
|
+
conn = Connection.new(redis_store: store)
|
53
|
+
|
54
|
+
conn.pooled?.must_equal false
|
55
|
+
conn.store.to_s.must_match(/127\.0\.0\.1:6380 against DB 1$/)
|
56
|
+
conn.store.must_equal(store)
|
57
|
+
end
|
58
|
+
|
59
|
+
it "uses the specified Redis server when provided" do
|
60
|
+
conn = Connection.new(redis_server: 'redis://127.0.0.1:6380/1')
|
61
|
+
|
62
|
+
conn.pooled?.must_equal false
|
63
|
+
conn.store.to_s.must_match(/127\.0\.0\.1:6380 against DB 1$/)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: redis-rack
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Luca Guidi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-11-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: redis-store
|
@@ -168,9 +168,11 @@ files:
|
|
168
168
|
- gemfiles/rack_2.gemfile
|
169
169
|
- lib/rack/session/redis.rb
|
170
170
|
- lib/redis-rack.rb
|
171
|
+
- lib/redis/rack/connection.rb
|
171
172
|
- lib/redis/rack/version.rb
|
172
173
|
- redis-rack.gemspec
|
173
174
|
- test/rack/session/redis_test.rb
|
175
|
+
- test/redis/rack/connection_test.rb
|
174
176
|
- test/test_helper.rb
|
175
177
|
homepage: http://redis-store.org/redis-rack
|
176
178
|
licenses:
|
@@ -198,4 +200,5 @@ specification_version: 4
|
|
198
200
|
summary: Redis Store for Rack
|
199
201
|
test_files:
|
200
202
|
- test/rack/session/redis_test.rb
|
203
|
+
- test/redis/rack/connection_test.rb
|
201
204
|
- test/test_helper.rb
|