rack-requestid 0.1

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 05cb5461dd64235e8c10705dfff1a7f029769f7b
4
+ data.tar.gz: 0fcbb9da47dbfad13a2362748b674e240110beb3
5
+ SHA512:
6
+ metadata.gz: 95860cc5316b6f625e762f127f13c432747b18734ec531c776cf3f7d7ae3a3925b523a93605287b28dca145026a563ecc0f368f4b103d62a2a7f6277e4e5a75b
7
+ data.tar.gz: 06cdf2688ce0351d92189d7b46a6eccb2a8d354b15bba90387ef8dbcff2ccf52a091ab9c4c628f09a87800548c8514d3b59d7ea747daac20949e911e9bbf2214
@@ -0,0 +1,2 @@
1
+ Gemfile.lock
2
+ *.gem
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --require spec_helper
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
@@ -0,0 +1,33 @@
1
+ # Rack::RequestID, a Rack middleware for generating request IDs
2
+
3
+ This is a simple middleware that will generate a request GUID if one was not
4
+ already provided by the client or platform.
5
+
6
+ A request ID can be specified in the request (by the client or platform) by
7
+ setting the `X-Request-Id` header, and it will be available to other middleware
8
+ via the `HTTP_X_REQUEST_ID` key in the Rack environment hash. If a request ID
9
+ was not provided, Rack::RequestID will generate one and insert it into the Rack
10
+ environment. It will also insert the request ID into the `X-Request-Id` header
11
+ of the response.
12
+
13
+ ## Configuration
14
+
15
+ To use Rack::RequestID, add the following to your Gemfile:
16
+
17
+ gem 'rack-requestid', :github => 'dancavallaro/rack-requestid'
18
+
19
+ Then in `config.ru`:
20
+
21
+ use Rack::RequestID
22
+
23
+ Use Rack::RequestID before any middleware that needs a request ID.
24
+
25
+ There are a few options you can pass in:
26
+
27
+ * `:include_response_header` determines whether to include the request ID in a response header.
28
+ * `:overwrite` can be enabled to overwrite any request ID provided by the platform or client.
29
+ * `:generator` can be specified to provide a custom request ID generator.
30
+
31
+ If you want to modify the options used, simply do:
32
+
33
+ use Rack::RequestID, :include_response_header => false, :generator => lambda { "#{Time.now.getutc.to_i}" }
@@ -0,0 +1,7 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new
5
+
6
+ task :default => :spec
7
+ task :test => :spec
@@ -0,0 +1,33 @@
1
+ require 'securerandom'
2
+
3
+ module Rack
4
+ class RequestID
5
+
6
+ REQUEST_ID_HEADER = 'X-Request-Id'
7
+ REQUEST_ID_KEY = 'HTTP_X_REQUEST_ID'
8
+
9
+ def initialize(app, options={})
10
+ @app = app
11
+
12
+ @include_response_header = options.fetch(:include_response_header, true)
13
+ @overwrite = options.fetch(:overwrite, false)
14
+ @generator = options[:generator] || lambda { SecureRandom.uuid }
15
+ end
16
+
17
+ def call(env)
18
+ if !env.key?(REQUEST_ID_KEY) || @overwrite
19
+ request_id = @generator.call
20
+ env[REQUEST_ID_KEY] = request_id
21
+ end
22
+
23
+ status, headers, body = @app.call(env)
24
+
25
+ if @include_response_header
26
+ headers[REQUEST_ID_HEADER] = env[REQUEST_ID_KEY]
27
+ end
28
+
29
+ [status, headers, body]
30
+ end
31
+
32
+ end
33
+ end
@@ -0,0 +1,16 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = 'rack-requestid'
3
+ s.version = '0.1'
4
+ s.summary = 'Middleware for generating request IDs.'
5
+ s.description = 'Rack::RequestID is a Rack middleware for generating request IDs. It generates a request GUID for every request (if one was not already provided) and inserts the request ID as a response header.'
6
+ s.author = 'Dan Cavallaro'
7
+ s.email = 'dan.t.cavallaro@gmail.com'
8
+ s.homepage = 'https://github.com/dancavallaro/rack-requestid'
9
+
10
+ s.files = `git ls-files`.split("\n")
11
+ s.test_files = `git ls-files -- spec/*`.split("\n")
12
+
13
+ s.add_development_dependency 'rspec'
14
+ s.add_development_dependency 'rack'
15
+ s.add_development_dependency 'rake'
16
+ end
@@ -0,0 +1,68 @@
1
+ require 'yaml'
2
+
3
+ REQUEST_ID_HEADER = 'X-Request-Id'
4
+ REQUEST_ID_KEY = 'HTTP_X_REQUEST_ID'
5
+
6
+ TEST_REQUEST_ID = '00000000-0000-0000-0000-000000000000'
7
+
8
+ describe Rack::RequestID do
9
+
10
+ let(:app) { lambda { |env| [200, {}, [env.to_yaml]] } }
11
+ let(:stack) { Rack::RequestID.new app }
12
+ let(:request) { Rack::MockRequest.new stack }
13
+
14
+ it "should generate random request IDs" do
15
+ first_requestid = get_id_from_response request.get('/')
16
+ second_requestid = get_id_from_response request.get('/')
17
+
18
+ expect(first_requestid).not_to eq(second_requestid)
19
+ end
20
+
21
+ it "should return the request ID in the response headers" do
22
+ response = request.get '/'
23
+ requestid = get_id_from_response(response)
24
+
25
+ expect(response.headers[REQUEST_ID_HEADER]).to eq(requestid)
26
+ end
27
+
28
+ it "should not overwrite existing request ID" do
29
+ response = request.get '/', REQUEST_ID_KEY => TEST_REQUEST_ID
30
+
31
+ expect(get_id_from_response(response)).to eq(TEST_REQUEST_ID)
32
+ end
33
+
34
+ context "when header disabled" do
35
+ let(:stack) { Rack::RequestID.new app, :include_response_header => false }
36
+
37
+ it "should not insert response header" do
38
+ response = request.get '/'
39
+
40
+ expect(response.headers).not_to have_key(REQUEST_ID_HEADER)
41
+ end
42
+ end
43
+
44
+ context "when using custom generator" do
45
+ let(:stack) { Rack::RequestID.new app, :generator => lambda { TEST_REQUEST_ID } }
46
+
47
+ it "should use correct request ID" do
48
+ requestid = get_id_from_response request.get('/')
49
+
50
+ expect(requestid).to eq(TEST_REQUEST_ID)
51
+ end
52
+ end
53
+
54
+ context "when overwriting request ID" do
55
+ let(:stack) { Rack::RequestID.new app, :overwrite => true }
56
+
57
+ it "should overwrite request ID" do
58
+ response = request.get '/', REQUEST_ID_KEY => TEST_REQUEST_ID
59
+
60
+ expect(get_id_from_response(response)).not_to eq(TEST_REQUEST_ID)
61
+ end
62
+ end
63
+
64
+ def get_id_from_response(response)
65
+ YAML.load(response.body)[REQUEST_ID_KEY]
66
+ end
67
+
68
+ end
@@ -0,0 +1,5 @@
1
+ require 'bundler/setup'
2
+ Bundler.setup
3
+
4
+ require 'rack/mock'
5
+ require 'rack/request_id'
metadata ADDED
@@ -0,0 +1,97 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rack-requestid
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.1'
5
+ platform: ruby
6
+ authors:
7
+ - Dan Cavallaro
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-11-30 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rack
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description: Rack::RequestID is a Rack middleware for generating request IDs. It generates
56
+ a request GUID for every request (if one was not already provided) and inserts the
57
+ request ID as a response header.
58
+ email: dan.t.cavallaro@gmail.com
59
+ executables: []
60
+ extensions: []
61
+ extra_rdoc_files: []
62
+ files:
63
+ - ".gitignore"
64
+ - ".rspec"
65
+ - Gemfile
66
+ - README.md
67
+ - Rakefile
68
+ - lib/rack/request_id.rb
69
+ - rack-requestid.gemspec
70
+ - spec/requestid_spec.rb
71
+ - spec/spec_helper.rb
72
+ homepage: https://github.com/dancavallaro/rack-requestid
73
+ licenses: []
74
+ metadata: {}
75
+ post_install_message:
76
+ rdoc_options: []
77
+ require_paths:
78
+ - lib
79
+ required_ruby_version: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ required_rubygems_version: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ requirements: []
90
+ rubyforge_project:
91
+ rubygems_version: 2.4.4
92
+ signing_key:
93
+ specification_version: 4
94
+ summary: Middleware for generating request IDs.
95
+ test_files:
96
+ - spec/requestid_spec.rb
97
+ - spec/spec_helper.rb