rack-cachely 0.3.4 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 2f4080bb9c2d7996d66615deb889c894bbb4899d
4
+ data.tar.gz: 97b741a1f1b6c746c417066cb8191465f647af0f
5
+ SHA512:
6
+ metadata.gz: 1e95627d21f37a878f4017c57647fb90fc6c51f185631f482d5b3f048562b635bc16e5b77273248d4376991217e5213c079ecae71fb88829e8ee2d4b02cbe4bc
7
+ data.tar.gz: 9185062d94498de7efa4003205ebd66d0cac8974661f3e94eaabe3e569cc0f59af027c85a36003a8e769585c8ee0bbd6624884fb92b58ecef95cfe50b7aac745
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rack-cachely (0.3.4)
4
+ rack-cachely (0.4.0)
5
5
  rack
6
6
 
7
7
  GEM
@@ -14,7 +14,7 @@ GEM
14
14
  fakeweb (1.3.0)
15
15
  i18n (0.6.1)
16
16
  multi_json (1.3.6)
17
- rack (1.5.1)
17
+ rack (1.5.2)
18
18
  rspec (2.11.0)
19
19
  rspec-core (~> 2.11.0)
20
20
  rspec-expectations (~> 2.11.0)
data/README.md CHANGED
@@ -46,14 +46,14 @@ end
46
46
  ### Detailed Configuration
47
47
 
48
48
  ```ruby
49
- config.middleware.use Rack::Cachely,
49
+ config.middleware.use Rack::Cachely,
50
50
  # Print debug information out to the log (default is false):
51
- verbose: false,
51
+ verbose: false,
52
52
  # Each Cachely account has a custom URL endpoint.
53
53
  # The URL can be found in your Heroku config or through
54
54
  # your Cachely dashboard. By default it looks for an
55
55
  # ENV variable named CACHELY_URL:
56
- cachely_url: ENV["CACHELY_URL"],
56
+ cachely_url: ENV["CACHELY_URL"],
57
57
  # How long are you willing to wait for requests to the Cachely
58
58
  # service to respond? Default is 1 second.
59
59
  timeout: 1.0
@@ -83,3 +83,8 @@ Rack::Cachely::Store.delete("users/\d+")
83
83
  3. Commit your changes (`git commit -am 'Add some feature'`)
84
84
  4. Push to the branch (`git push origin my-new-feature`)
85
85
  5. Create new Pull Request
86
+
87
+ ## Contributors
88
+
89
+ * Mark Bates
90
+ * Tim Raymond
@@ -5,7 +5,7 @@ module Rack
5
5
  attr_accessor :options
6
6
 
7
7
  def initialize(options = {})
8
- self.options = {ignore_query_params: [], timeout: 1.0}
8
+ self.options = {ignore_query_params: [], allow_query_params: [], timeout: 1.0}
9
9
  options.each do |key, value|
10
10
  self.send("#{key}=", value)
11
11
  end
@@ -16,6 +16,10 @@ module Rack
16
16
  self.options[:ignore_query_params] = [args].flatten.map {|x| x.downcase}
17
17
  end
18
18
 
19
+ def allow_query_params=(*args)
20
+ self.options[:allow_query_params] = [args].flatten.map {|x| x.downcase}
21
+ end
22
+
19
23
  def method_missing(sym, *args, &block)
20
24
  if /(.+)=$/.match(sym.to_s)
21
25
  self.options[$1.to_sym] = args[0]
@@ -39,4 +43,4 @@ module Rack
39
43
 
40
44
  end
41
45
  end
42
- end
46
+ end
@@ -43,11 +43,48 @@ module Rack
43
43
  # and applying consistent escaping.
44
44
  def query_string
45
45
  return nil if @request.query_string.nil?
46
- ignore_query_params = ["no-cachely", "refresh-cachely", Rack::Cachely.config.ignore_query_params].flatten
47
- query = @request.query_string.split(/[&;] */n).map { |p| unescape(p).split('=', 2) }.sort
48
- query = query.reject{|k,v| ignore_query_params.include?(k)}.map{ |k,v| "#{escape(k)}=#{escape(v)}" }
46
+ if whitelist_mode?
47
+ whitelist(@request.query_string)
48
+ else
49
+ blacklist(@request.query_string)
50
+ end
51
+ end
52
+
53
+ def whitelist(query_string)
54
+ query_params = deparameterize(query_string)
55
+ whitelisted_params = query_params.select{|k,v| whitelisted?(k) }
56
+ parameterize(whitelisted_params)
57
+ end
58
+
59
+ def blacklist(query_string)
60
+ query_params = deparameterize(query_string)
61
+ blacklisted_params = query_params.reject{|k,v| blacklisted?(k) }
62
+ parameterize(blacklisted_params)
63
+ end
64
+
65
+ def parameterize(params)
66
+ params.map{ |k,v| "#{escape(k)}=#{escape(v)}" }.join('&')
67
+ end
68
+
69
+ def deparameterize(query_string)
70
+ query_string.split(/[&;] */n).map { |p| unescape(p).split('=', 2) }.sort
71
+ end
72
+
73
+ def whitelisted?(param)
74
+ Rack::Cachely.config.allow_query_params.include?(param)
75
+ end
76
+
77
+ def blacklisted?(param)
78
+ ["no-cachely", "refresh-cachely", Rack::Cachely.config.ignore_query_params].flatten.include?(param)
79
+ end
80
+
81
+ def whitelist_mode?
82
+ # Whitelist mode is enabled when the whitelist is the ONLY list set
83
+ Rack::Cachely.config.ignore_query_params.empty? && Rack::Cachely.config.allow_query_params.any?
84
+ end
49
85
 
50
- query.join('&')
86
+ def blacklist_mode?
87
+ !whitelist_mode?
51
88
  end
52
89
  end
53
90
 
@@ -1,5 +1,5 @@
1
1
  module Rack
2
2
  class Cachely
3
- VERSION = "0.3.4"
3
+ VERSION = "0.4.0"
4
4
  end
5
5
  end
@@ -14,9 +14,28 @@ describe Rack::Cachely::Key do
14
14
 
15
15
  it "will ignore certain query params" do
16
16
  Rack::Cachely.config.ignore_query_params = ["A", "c"]
17
+ Rack::Cachely.config.allow_query_params = []
17
18
  key.to_s.should eql("http://example.com/foo/bar?b=B&d=D")
18
19
  end
19
20
 
21
+ it "allows whitelisted query params" do
22
+ Rack::Cachely.config.ignore_query_params = []
23
+ Rack::Cachely.config.allow_query_params = ["A", "b"]
24
+ key.to_s.should eql("http://example.com/foo/bar?a=A&b=B")
25
+ end
26
+
27
+ it "will blacklist query params if both whitelist and blacklist are present" do
28
+ Rack::Cachely.config.allow_query_params = ["A", "b"]
29
+ Rack::Cachely.config.ignore_query_params = ["A", "c"]
30
+ key.to_s.should eql("http://example.com/foo/bar?b=B&d=D")
31
+ end
32
+
33
+ it "will allow all query params when neither blacklist nor whitelist is set" do
34
+ Rack::Cachely.config.allow_query_params = []
35
+ Rack::Cachely.config.ignore_query_params = []
36
+ key.to_s.should eql("http://example.com/foo/bar?a=A&b=B&c=C&d=D")
37
+ end
38
+
20
39
  context "no query string" do
21
40
 
22
41
  let(:request) { double(scheme: "http", host: "example.com", port: 80, script_name: "/foo", path_info: "/bar", query_string: "") }
@@ -29,4 +48,4 @@ describe Rack::Cachely::Key do
29
48
 
30
49
  end
31
50
 
32
- end
51
+ end
metadata CHANGED
@@ -1,30 +1,27 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rack-cachely
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.4
5
- prerelease:
4
+ version: 0.4.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Mark Bates
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-02-03 00:00:00.000000000 Z
11
+ date: 2013-05-31 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: rack
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - '>='
20
18
  - !ruby/object:Gem::Version
21
19
  version: '0'
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - '>='
28
25
  - !ruby/object:Gem::Version
29
26
  version: '0'
30
27
  description: Rack middleware for interfacing with the Cachely page caching service.
@@ -54,27 +51,26 @@ files:
54
51
  - spec/spec_helper.rb
55
52
  homepage: http://www.cachelyapp.com
56
53
  licenses: []
54
+ metadata: {}
57
55
  post_install_message:
58
56
  rdoc_options: []
59
57
  require_paths:
60
58
  - lib
61
59
  required_ruby_version: !ruby/object:Gem::Requirement
62
- none: false
63
60
  requirements:
64
- - - ! '>='
61
+ - - '>='
65
62
  - !ruby/object:Gem::Version
66
63
  version: '0'
67
64
  required_rubygems_version: !ruby/object:Gem::Requirement
68
- none: false
69
65
  requirements:
70
- - - ! '>='
66
+ - - '>='
71
67
  - !ruby/object:Gem::Version
72
68
  version: '0'
73
69
  requirements: []
74
70
  rubyforge_project:
75
- rubygems_version: 1.8.24
71
+ rubygems_version: 2.0.3
76
72
  signing_key:
77
- specification_version: 3
73
+ specification_version: 4
78
74
  summary: Rack middleware for interfacing with the Cachely page caching service.
79
75
  test_files:
80
76
  - spec/rack-cachely/config_spec.rb