request_headers_middleware 0.0.4

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 482bdde0e0b23e5af93e73940c52e48c51f2ccbd
4
+ data.tar.gz: 6d52bb7f30b71e12b55dc160d3b0687a2956c6d8
5
+ SHA512:
6
+ metadata.gz: 7d26b9d1958e822e4fb4e45bf5fb8fa8f485586bbd01fba3e2c93987891fdfbd06bba9cb34ea96f3a94e10e2b8d1cf40f9cd83cb9df14c1547e9785e21981356
7
+ data.tar.gz: 105f929b62dab5f7dccc415a11bde7099bfdf28f82de17efb39a7be8b239ddcd6831dfcc8546fddfa7e4d6f7985b3de63eed601e4fb08106fac9082f716869e3
data/.gitignore ADDED
@@ -0,0 +1,15 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ InstalledFiles
7
+ _yardoc
8
+ coverage
9
+ doc/
10
+ lib/bundler/man
11
+ pkg
12
+ rdoc
13
+ spec/reports
14
+ tmp
15
+ .byebug_history
data/.rubocop.yml ADDED
@@ -0,0 +1,27 @@
1
+ AllCops:
2
+ Exclude:
3
+ - '.git-hooks/**/*'
4
+ - 'bin/*'
5
+ - 'db/schema.rb'
6
+ - 'db/migrate/*'
7
+ - 'vendor/bundle/**/*'
8
+ - 'config/environments/*'
9
+ - 'Rakefile'
10
+
11
+ Style/ModuleFunction:
12
+ Enabled: false
13
+
14
+ Metrics/BlockLength:
15
+ Exclude:
16
+ - 'Rakefile'
17
+ - '**/*.rake'
18
+ - 'spec/**/*.rb'
19
+
20
+ Metrics/LineLength:
21
+ Max: 100
22
+
23
+ Style/Documentation:
24
+ Enabled: false
25
+
26
+ Lint/UnusedBlockArgument:
27
+ Enabled: false
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.3.3
data/.travis.yml ADDED
@@ -0,0 +1,18 @@
1
+ language: ruby
2
+ sudo: false
3
+ rvm:
4
+ - "2.3.1"
5
+ - "2.4.1"
6
+ - "2.3.3"
7
+
8
+ before_install: gem install bundler
9
+
10
+ script: bin/travis
11
+
12
+ matrix:
13
+ fast_finish: true
14
+
15
+ env:
16
+ matrix:
17
+ - BUILD_TYPE=rspec
18
+ - BUILD_TYPE=rubocop
data/Gemfile ADDED
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ # Specify your gem's dependencies in request_store.gemspec
6
+ gemspec
7
+
8
+ group :test, :development do
9
+ gem 'byebug'
10
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,65 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ request_headers_middleware (0.0.4)
5
+ request_store
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ ast (2.4.0)
11
+ byebug (9.0.6)
12
+ diff-lcs (1.2.5)
13
+ docile (1.1.5)
14
+ json (2.1.0)
15
+ parallel (1.12.1)
16
+ parser (2.5.0.2)
17
+ ast (~> 2.4.0)
18
+ powerpack (0.1.1)
19
+ rack (1.6.5)
20
+ rainbow (3.0.0)
21
+ rake (12.0.0)
22
+ request_store (1.4.0)
23
+ rack (>= 1.4)
24
+ rspec (3.5.0)
25
+ rspec-core (~> 3.5.0)
26
+ rspec-expectations (~> 3.5.0)
27
+ rspec-mocks (~> 3.5.0)
28
+ rspec-core (3.5.4)
29
+ rspec-support (~> 3.5.0)
30
+ rspec-expectations (3.5.0)
31
+ diff-lcs (>= 1.2.0, < 2.0)
32
+ rspec-support (~> 3.5.0)
33
+ rspec-mocks (3.5.0)
34
+ diff-lcs (>= 1.2.0, < 2.0)
35
+ rspec-support (~> 3.5.0)
36
+ rspec-support (3.5.0)
37
+ rubocop (0.53.0)
38
+ parallel (~> 1.10)
39
+ parser (>= 2.5)
40
+ powerpack (~> 0.1)
41
+ rainbow (>= 2.2.2, < 4.0)
42
+ ruby-progressbar (~> 1.7)
43
+ unicode-display_width (~> 1.0, >= 1.0.1)
44
+ ruby-progressbar (1.9.0)
45
+ simplecov (0.12.0)
46
+ docile (~> 1.1.0)
47
+ json (>= 1.8, < 3)
48
+ simplecov-html (~> 0.10.0)
49
+ simplecov-html (0.10.0)
50
+ unicode-display_width (1.3.0)
51
+
52
+ PLATFORMS
53
+ ruby
54
+
55
+ DEPENDENCIES
56
+ byebug
57
+ rack
58
+ rake
59
+ request_headers_middleware!
60
+ rspec
61
+ rubocop
62
+ simplecov
63
+
64
+ BUNDLED WITH
65
+ 1.16.1
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2017 Marc Grimme
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,123 @@
1
+ # RequestHeaderMiddleware [![build status](https://travis-ci.org/MarcGrimme/request_headers_middleware.png?branch=master)](https://travis-ci.org/MarcGrimme/request_headers_middleware) [![Code Climate](https://codeclimate.com/github/MarcGrimme/request_headers_middleware.png)](https://codeclimate.com/github/MarcGrimme/request_headers_middleware)
2
+
3
+ If you decided to go the microservice approach and services are growing everywhere you will release challenges as soon as more
4
+ service are interconnected and you need to figure out problems.
5
+
6
+ For example how can you connect a request over multiple micro service hubs? Imagine services connected synchronous or asynchronously then the
7
+ whole challenge grows.
8
+
9
+ For this issue the *X-Request-Id* HTTP header was introduced. In Rails the *ActionDispatch::RequestId* middleware helps create a unique ID
10
+ for each request if not already defined by the *X-Request-Id* header. Unfortunatelly if your service connects to another service the passing
11
+ over of this unique id is not in the scope of the *ActionDispatch::RequestId* middleware.
12
+
13
+ For that issue this middleware will help you to use the same 'X-Request-Id' for multiple requests to in the end help you figure out the
14
+ request path also over multiple services. But it will not do the whole game. It will mainly just store the *X-Request-Id* header in a globally
15
+ available throughout the application (and not only in the controller when getting a request).
16
+
17
+ The middleware can be extended to store more information from the header. For example you might want to reuse a *Bearer* token or the
18
+ *X-Forward* header or more. For this you can either introduce whitelists - to only filter the headers you want to store - or a blacklist
19
+ to definitely not forward specific headers.
20
+
21
+ Default is the whilelist. It is initialized with *X-Request-Id*.
22
+
23
+ ## Installation
24
+
25
+ ### Rails
26
+
27
+ So how does it work with Rails.
28
+
29
+ Add this line to your application's Gemfile:
30
+
31
+ ``
32
+ gem 'request_headers_middleware'
33
+ ``
34
+
35
+ And then execute:
36
+
37
+ ``
38
+ $ bundle
39
+ ``
40
+
41
+ Or install it yourself as:
42
+
43
+ ``
44
+ $ gem install request_headers_middleware
45
+ ``
46
+
47
+ That's it now you can access the request headers (all you filtered - by default just the *X-Request-Id*) through the
48
+
49
+ ``
50
+ RequestHeadersMiddleware.store
51
+ ``
52
+
53
+ ### ActiveResource::Base
54
+
55
+ For example to make *ActiveResource::Base* reuse the headers use:
56
+
57
+ ```ruby
58
+ class BaseResource < ActiveResource::Base
59
+ def self.headers
60
+ RequestHeadersMiddleware.store.merge(ActiveResource::Base.headers)
61
+ end
62
+
63
+ ..
64
+ end
65
+ ```
66
+
67
+ ### Faraday
68
+
69
+ In *Faraday* you can do it as follows:
70
+
71
+ ```ruby
72
+ Faraday.new(
73
+ url: host,
74
+ headers: RequestHeadersMiddleware.store,
75
+ ..
76
+ )
77
+ ```
78
+
79
+ ### JsonApiClient
80
+
81
+ For a class extended from *JsonApiClient* it could work like this. Let's call the class *MyJsonApiClient*.
82
+
83
+ ```ruby
84
+ MyJsonApiClient.with_headers(RequestHeadersMiddleware.store) do
85
+ .. # Do the request by the MyJsonApiClient
86
+ end
87
+ ```
88
+
89
+ ### Whitelist
90
+
91
+ Per default the middleware applies a whitelist to only filter *X-Request-Id* header. Generally this is just as follows:
92
+
93
+ ``
94
+ Rails.configuration.request_headers_middleware.whitelist = [ 'X-Request-Id' ]
95
+ ``
96
+
97
+ As this is just a list it can be easily overwriten in an initilizer.
98
+
99
+ ### Blacklist
100
+
101
+ The same holds for the blacklist but first you need to disable the whitelist by setting it to nil or empty as follows.
102
+
103
+ ``
104
+ Rails.configuration.request_headers_middleware.whitelist = [ 'X-Request-Id' ]
105
+ ``
106
+
107
+ ### Callbacks
108
+
109
+ TODO: when I remeber why I thought this might make sense.
110
+
111
+ ## Development
112
+
113
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `bin/console` for an interactive prompt that will allow you to experiment.
114
+
115
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release` to create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
116
+
117
+ ## Contributing
118
+
119
+ 1. Fork it ( https://github.com/marcgrimme/request_headers_middleware/fork )
120
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
121
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
122
+ 4. Push to the branch (`git push origin my-new-feature`)
123
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+ require 'bundler/gem_tasks'
3
+
4
+ require 'rspec/core/rake_task'
5
+
6
+ # Add default task. When you type just rake command this would run. Travis CI runs this. Making this run spec
7
+ desc 'Default: run specs.'
8
+ task :default => :spec
9
+
10
+ # Defining spec task for running spec
11
+ desc "Run specs"
12
+ RSpec::Core::RakeTask.new('spec') do |spec|
13
+ # Pattern filr for spec files to run. This is default btw.
14
+ spec.pattern = "./spec/**/*_spec.rb"
15
+ end
16
+
17
+ # Run the rdoc task to generate rdocs for this gem
18
+ require 'rdoc/task'
19
+ RDoc::Task.new do |rdoc|
20
+ require File.expand_path("../lib/request_headers_middleware/version", __FILE__)
21
+ version = RequestHeadersMiddleware::VERSION
22
+
23
+ rdoc.rdoc_dir = 'rdoc'
24
+ rdoc.title = "release_headers_middleware #{version}"
25
+ rdoc.rdoc_files.include('README*')
26
+ rdoc.rdoc_files.include('lib/**/*.rb')
27
+ end
28
+
29
+ desc "Code coverage detail"
30
+ task :coverage do
31
+ ENV['COVERAGE'] = "true"
32
+ Rake::Task['spec'].execute
33
+ end
34
+
35
+ desc "Console for checking things"
36
+ task :console do
37
+ require 'irb'
38
+ require 'irb/completion'
39
+ require 'logger_instrumentation'
40
+ ARGV.clear
41
+ IRB.start
42
+ end
data/bin/travis ADDED
@@ -0,0 +1,12 @@
1
+ #!/bin/sh
2
+
3
+ set -e
4
+
5
+ case "$BUILD_TYPE" in
6
+ "rubocop")
7
+ bundle exec rubocop
8
+ ;;
9
+ "rspec")
10
+ bundle exec rspec
11
+ ;;
12
+ esac
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'request_headers_middleware/railtie' if defined?(Rails)
4
+ require 'request_headers_middleware/middleware'
5
+
6
+ module RequestHeadersMiddleware # :nodoc:
7
+ extend self
8
+
9
+ attr_accessor :blacklist, :whitelist, :callbacks
10
+ @whitelist = ['x-request-id'.to_sym]
11
+ @blacklist = []
12
+ @callbacks = []
13
+
14
+ def store
15
+ RequestStore[:headers] ||= {}
16
+ end
17
+
18
+ def store=(store)
19
+ RequestStore[:headers] = store
20
+ end
21
+
22
+ def setup(config)
23
+ @whitelist = config.whitelist.map { |key| key.downcase.to_sym } if config.whitelist
24
+ @blacklist = config.blacklist.map { |key| key.downcase.to_sym } if config.blacklist
25
+
26
+ config.callbacks && @callbacks = config.callbacks
27
+ end
28
+ end
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'request_store'
4
+
5
+ module RequestHeadersMiddleware # :nodoc:
6
+ # The Middleware that stores the header. Default is only to store the
7
+ # X-Request-Id or the action_dispatch.request_id from environment if not set.
8
+ class Middleware
9
+ def initialize(app)
10
+ @app = app
11
+ end
12
+
13
+ def call(env)
14
+ RequestStore.store[:headers] = filter(headers(env))
15
+ RequestHeadersMiddleware.callbacks.each { |cb| cb.call(env) }
16
+ @app.call(env)
17
+ end
18
+
19
+ private
20
+
21
+ def headers(env)
22
+ default_headers(env)
23
+ .merge(Hash[*sanitize_headers(select_headers(env)).sort.flatten])
24
+ end
25
+
26
+ def filter(headers)
27
+ if RequestHeadersMiddleware.whitelist &&
28
+ !RequestHeadersMiddleware.whitelist.empty?
29
+ whitelist(headers)
30
+ else
31
+ blacklist(headers)
32
+ end
33
+ end
34
+
35
+ def select_headers(env)
36
+ env.select { |k, _v| k.start_with? 'HTTP_' }
37
+ end
38
+
39
+ def sanitize_headers(headers)
40
+ headers.collect { |k, v| [k.sub(/^HTTP_/, ''), v] }.collect do |k, v|
41
+ [k.split('_').collect(&:capitalize).join('-').to_sym, v]
42
+ end
43
+ end
44
+
45
+ def whitelist(headers)
46
+ headers.select do |key, _|
47
+ RequestHeadersMiddleware.whitelist.include?(key.downcase)
48
+ end
49
+ end
50
+
51
+ def blacklist(headers)
52
+ headers.reject do |key, _|
53
+ RequestHeadersMiddleware.blacklist.include?(key.downcase)
54
+ end
55
+ end
56
+
57
+ def default_headers(env)
58
+ { "X-Request-Id": env['action_dispatch.request_id'] }
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RequestHeadersMiddleware
4
+ # The Railtie triggering a setup from RAILs to make it configurable
5
+ class Railtie < ::Rails::Railtie
6
+ config.request_headers_middleware = ::ActiveSupport::OrderedOptions.new
7
+ config.request_headers_middleware.blacklist = []
8
+ config.request_headers_middleware.callbacks = []
9
+
10
+ initializer 'request_headers_middleware.insert_middleware' do
11
+ config.app_middleware.insert_after ActionDispatch::RequestId,
12
+ RequestHeadersMiddleware::Middleware
13
+ config.after_initialize do
14
+ RequestHeadersMiddleware.setup(config.request_headers_middleware)
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RequestHeadersMiddleware
4
+ VERSION = '0.0.4'
5
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path('lib', __dir__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+ require 'request_headers_middleware/version'
6
+
7
+ Gem::Specification.new do |gem|
8
+ gem.name = 'request_headers_middleware'
9
+ gem.version = RequestHeadersMiddleware::VERSION
10
+ gem.authors = ['Marc Grimme']
11
+ gem.email = ['marc.grimme@gmail.com']
12
+ gem.description = 'RequestHeader gives you per-req global header storage.'
13
+ gem.summary = 'RequestStore gives you per-reqt global header storage.'
14
+ gem.homepage = 'http://github.com/marcgrimme/request_headers_middleware'
15
+ gem.licenses = ['MIT']
16
+
17
+ gem.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
18
+ gem.executables = gem.files.grep(%r{^bin/}).map { |f| File.basename(f) }
19
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
20
+ gem.require_paths = ['lib']
21
+
22
+ gem.add_dependency 'request_store'
23
+ gem.add_development_dependency 'rack'
24
+ gem.add_development_dependency 'rake'
25
+ gem.add_development_dependency 'rspec'
26
+ gem.add_development_dependency 'rubocop'
27
+ gem.add_development_dependency 'simplecov'
28
+ end
@@ -0,0 +1,86 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe RequestHeadersMiddleware::Middleware do
6
+ let(:app) { MockRackApp.new }
7
+ subject { described_class.new(app) }
8
+
9
+ context 'when MockRackApp called with a request' do
10
+ let(:env) do
11
+ Rack::MockRequest.env_for('/some/path', 'HTTP_X_REQUEST_ID' => '1234',
12
+ 'HTTP_X_FORWARD' => '123',
13
+ 'HTTP_X_REQUEST_ID1' => '12',
14
+ 'CONTENT_TYPE' => 'text/plain')
15
+ end
16
+
17
+ it 'returns an empty Hash by default' do
18
+ expect(RequestHeadersMiddleware.store).to eq({})
19
+ end
20
+
21
+ it 'only saves the X-Request-Id in RequestHeadersMiddleware.store' do
22
+ subject.call(env)
23
+ expect(app['CONTENT_TYPE']).to eq('text/plain')
24
+ expect(RequestHeadersMiddleware.store).to match('X-Request-Id': '1234')
25
+ end
26
+
27
+ context 'with whitelist' do
28
+ before do
29
+ RequestHeadersMiddleware.whitelist = [:'x-forward']
30
+ RequestHeadersMiddleware.blacklist = []
31
+ end
32
+ after do
33
+ RequestHeadersMiddleware.whitelist = []
34
+ RequestHeadersMiddleware.blacklist = []
35
+ end
36
+
37
+ it 'only saves the X-Forward in RequestHeadersMiddleware.store' do
38
+ subject.call(env)
39
+ expect(app['CONTENT_TYPE']).to eq('text/plain')
40
+ expect(RequestHeadersMiddleware.store).to match('X-Forward': '123')
41
+ end
42
+ end
43
+
44
+ context 'with blacklist' do
45
+ before do
46
+ RequestHeadersMiddleware.whitelist = []
47
+ RequestHeadersMiddleware.blacklist = [:'x-forward']
48
+ end
49
+ after do
50
+ RequestHeadersMiddleware.whitelist = []
51
+ RequestHeadersMiddleware.blacklist = []
52
+ end
53
+
54
+ it 'only saves the X-Forward in RequestHeadersMiddleware.store' do
55
+ subject.call(env)
56
+ expect(app['CONTENT_TYPE']).to eq('text/plain')
57
+ expect(RequestHeadersMiddleware.store)
58
+ .to match('X-Request-Id1': '12', 'X-Request-Id': '1234')
59
+ end
60
+ end
61
+
62
+ context 'with callbacks' do
63
+ before do
64
+ RequestHeadersMiddleware.whitelist = %I[x-request-id x-request-id1]
65
+ RequestHeadersMiddleware.blacklist = []
66
+ RequestHeadersMiddleware.callbacks = [
67
+ proc { |env| env['HTTP_X_REQUEST_ID'] = '4321' },
68
+ proc { |env| env['HTTP_X_REQUEST_ID1'] = '21' }
69
+ ]
70
+ end
71
+ after do
72
+ RequestHeadersMiddleware.whitelist = []
73
+ RequestHeadersMiddleware.blacklist = []
74
+ RequestHeadersMiddleware.callbacks = nil
75
+ end
76
+
77
+ it 'only saves the X-Forward in RequestHeadersMiddleware.store' do
78
+ subject.call(env)
79
+ expect(app['CONTENT_TYPE']).to eq('text/plain')
80
+ expect(app['HTTP_X_REQUEST_ID']).to eq('4321')
81
+ expect(RequestHeadersMiddleware.store)
82
+ .to match('X-Request-Id1': '12', 'X-Request-Id': '1234')
83
+ end
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Notice there is a .rspec file in the root folder. It defines rspec arguments
4
+
5
+ # Ruby 1.9 uses simplecov. The ENV['COVERAGE'] is set when rake coverage
6
+ # is run in ruby 1.9
7
+ if ENV['COVERAGE']
8
+ require 'simplecov'
9
+ SimpleCov.start do
10
+ # Remove the spec folder from coverage. By default all code files are
11
+ # included.
12
+ # For more config options see
13
+ # https://github.com/colszowka/simplecov
14
+ add_filter File.expand_path('../spec', __dir__)
15
+ end
16
+ end
17
+
18
+ # Modify load path so you can require 'ogstasher directly.
19
+ $LOAD_PATH.unshift(File.expand_path('../lib', __dir__))
20
+
21
+ require 'rubygems'
22
+ # Loads bundler setup tasks. Now if I run spec without installing gems then it
23
+ # would say gem not installed and do bundle install instead of ugly load error
24
+ # on require.
25
+ require 'bundler/setup'
26
+
27
+ # This will require me all the gems automatically for the groups. If I do only
28
+ # .setup then I will have to require gems manually. Note that you have still
29
+ # have to require some gems if they are part of bigger gem like ActiveRecord
30
+ # which is part of Rails. You can say :require => false in gemfile to always
31
+ # use explicit requiring
32
+ Bundler.require(:test)
33
+
34
+ Dir[File.join('./spec/support/**/*.rb')].each { |f| require f }
35
+
36
+ # Set Rails environment as test
37
+ ENV['RAILS_ENV'] = 'test'
38
+
39
+ require 'request_headers_middleware'
40
+ require 'rack/mock'
41
+
42
+ RSpec.configure do |config|
43
+ config.run_all_when_everything_filtered = true
44
+ config.filter_run :focus
45
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ class MockRackApp
4
+ attr_reader :request_body
5
+
6
+ def initialize
7
+ @request_headers = {}
8
+ end
9
+
10
+ def call(env)
11
+ @env = env
12
+ @request_body = env['rack.input'].read
13
+ [200, { 'Content-Type' => 'text/plain' }, ['OK']]
14
+ end
15
+
16
+ def [](key)
17
+ @env[key]
18
+ end
19
+ end
metadata ADDED
@@ -0,0 +1,150 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: request_headers_middleware
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.4
5
+ platform: ruby
6
+ authors:
7
+ - Marc Grimme
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-03-13 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: request_store
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
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
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rubocop
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: simplecov
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ description: RequestHeader gives you per-req global header storage.
98
+ email:
99
+ - marc.grimme@gmail.com
100
+ executables:
101
+ - travis
102
+ extensions: []
103
+ extra_rdoc_files: []
104
+ files:
105
+ - ".gitignore"
106
+ - ".rubocop.yml"
107
+ - ".ruby-version"
108
+ - ".travis.yml"
109
+ - Gemfile
110
+ - Gemfile.lock
111
+ - LICENSE.txt
112
+ - README.md
113
+ - Rakefile
114
+ - bin/travis
115
+ - lib/request_headers_middleware.rb
116
+ - lib/request_headers_middleware/middleware.rb
117
+ - lib/request_headers_middleware/railtie.rb
118
+ - lib/request_headers_middleware/version.rb
119
+ - request_headers_middleware.gemspec
120
+ - spec/request_headers_middleware_spec.rb
121
+ - spec/spec_helper.rb
122
+ - spec/support/mock_rack_app.rb
123
+ homepage: http://github.com/marcgrimme/request_headers_middleware
124
+ licenses:
125
+ - MIT
126
+ metadata: {}
127
+ post_install_message:
128
+ rdoc_options: []
129
+ require_paths:
130
+ - lib
131
+ required_ruby_version: !ruby/object:Gem::Requirement
132
+ requirements:
133
+ - - ">="
134
+ - !ruby/object:Gem::Version
135
+ version: '0'
136
+ required_rubygems_version: !ruby/object:Gem::Requirement
137
+ requirements:
138
+ - - ">="
139
+ - !ruby/object:Gem::Version
140
+ version: '0'
141
+ requirements: []
142
+ rubyforge_project:
143
+ rubygems_version: 2.5.2
144
+ signing_key:
145
+ specification_version: 4
146
+ summary: RequestStore gives you per-reqt global header storage.
147
+ test_files:
148
+ - spec/request_headers_middleware_spec.rb
149
+ - spec/spec_helper.rb
150
+ - spec/support/mock_rack_app.rb