rack-idempotency 0.3.1 → 0.4.0

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