rack-idempotency 0.3.1 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ca24944f2339362d6a62ba819fbf8a1aee0b77a7
4
- data.tar.gz: f2a778af3baa57d06eb2aaf429cf124a4fa06a3f
3
+ metadata.gz: cae375a11eb57a07c4cc39d3268b3b682ae72753
4
+ data.tar.gz: dbd1cc40c4bec020d060b9374b2355bac78e6dda
5
5
  SHA512:
6
- metadata.gz: 5481ccc3dd5d30d29876fc4ef8d047bc6e42f975706aa2df5353c6849b8f09c048fded27d90b3d41ccb72df4c74c0c6ea831a3c3cf807f21835cca50342e8fa4
7
- data.tar.gz: fb2480784debdc0b9427c192cb36a3b0a20f8341aa1c5b8a40970b54999a42052119828d3feff02867056f7c32cbf72aec85b2be918172b7643bf15bc66834e1
6
+ metadata.gz: 57fb2e7b113064b4543ad2c5f2d1a35316b3e13f5889c2a7961b86a21157879406b03b0a3f98021d4f24b9b65cacd0a22706ed25150b98e42e3af0a0a7752e05
7
+ data.tar.gz: aed9b10b6d6292b02e4be049511e0395383fa5e677ad732e33df1c3c99508dcad9e9fe9ae062d8ddf37d2c4e748fad614ff59faf905d9aeccd40132285ba78ad
data/README.md CHANGED
@@ -41,7 +41,9 @@ The `store` argument should be any object that responds to both `read(id)` and `
41
41
  ## Using with Rails
42
42
 
43
43
  ```ruby
44
- config.middleware.use Rack::Idempotency, store: Rails.cache
44
+ config.before_initialize do
45
+ config.middleware.use Rack::Idempotency, store: Rails.cache
46
+ end
45
47
  ```
46
48
 
47
49
  ## Client Usage
@@ -2,6 +2,7 @@ require "json"
2
2
 
3
3
  require "rack/idempotency/version"
4
4
 
5
+ require "rack/idempotency/errors"
5
6
  require "rack/idempotency/memory_store"
6
7
  require "rack/idempotency/null_store"
7
8
  require "rack/idempotency/request"
@@ -21,31 +22,18 @@ module Rack
21
22
  end
22
23
 
23
24
  def call(env)
24
- @env = env
25
- @request = Request.new(env.dup.freeze)
25
+ request = Request.new(env.dup.freeze)
26
+ storage = RequestStorage.new(@store, request)
26
27
 
27
- lookup || store_response
28
+ storage.read || store_response(storage, env)
28
29
  end
29
30
 
30
31
  private
31
32
 
32
- attr_reader :app
33
- attr_reader :env
34
- attr_reader :request
35
- attr_reader :store
36
-
37
- def request_store
38
- @request_store ||= RequestStorage.new(store, request)
39
- end
40
-
41
- def lookup
42
- request_store.read
43
- end
44
-
45
- def store_response
33
+ def store_response(storage, env)
46
34
  response = Response.new(*@app.call(env))
47
35
 
48
- request_store.write(response) if response.success?
36
+ storage.write(response) if response.success?
49
37
 
50
38
  response.to_a
51
39
  end
@@ -0,0 +1,13 @@
1
+ module Rack
2
+ class Idempotency
3
+ # For all errors
4
+ class Error < RuntimeError
5
+ attr :env
6
+ def initialize(env)
7
+ @env = env
8
+ end
9
+ end
10
+
11
+ class InsecureKeyError < Error; end
12
+ end
13
+ end
@@ -1,10 +1,14 @@
1
1
  require "rack/request"
2
2
 
3
3
  module Rack
4
- class Idempotency
4
+ class Idempotency
5
5
  class Request < Rack::Request
6
6
  def idempotency_key
7
- get_header("HTTP_IDEMPOTENCY_KEY")
7
+ get_header("HTTP_IDEMPOTENCY_KEY").tap do |key|
8
+ unless key.nil? || key.match?(/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i)
9
+ raise InsecureKeyError.new(env), 'Idempotency-Key must be a valid UUID'
10
+ end
11
+ end
8
12
  end
9
13
  end
10
14
  end
@@ -22,10 +22,6 @@ module Rack
22
22
  def to_json
23
23
  to_a.to_json
24
24
  end
25
-
26
- def idempotency_key
27
- headers["Idempotency-Key"]
28
- end
29
25
  end
30
26
  end
31
27
  end
@@ -1,5 +1,5 @@
1
1
  module Rack
2
2
  class Idempotency
3
- VERSION = "0.3.1".freeze
3
+ VERSION = "0.4.0".freeze
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rack-idempotency
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt Pruitt
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-03-16 00:00:00.000000000 Z
11
+ date: 2017-08-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -112,6 +112,7 @@ files:
112
112
  - bin/console
113
113
  - bin/setup
114
114
  - lib/rack/idempotency.rb
115
+ - lib/rack/idempotency/errors.rb
115
116
  - lib/rack/idempotency/memory_store.rb
116
117
  - lib/rack/idempotency/null_store.rb
117
118
  - lib/rack/idempotency/request.rb