cp-sparrow 0.0.12 → 0.0.14

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.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -1
  3. data/.ruby-version +1 -1
  4. data/LICENSE.txt +1 -1
  5. data/README.md +96 -13
  6. data/lib/sparrow.rb +21 -4
  7. data/lib/sparrow/configuration.rb +23 -2
  8. data/lib/sparrow/core_ext/hash.rb +2 -0
  9. data/lib/sparrow/dependencies.rb +15 -0
  10. data/lib/sparrow/http_message.rb +103 -0
  11. data/lib/sparrow/logger.rb +53 -0
  12. data/lib/sparrow/middleware.rb +44 -63
  13. data/lib/sparrow/request_http_message.rb +22 -0
  14. data/lib/sparrow/request_middleware.rb +8 -10
  15. data/lib/sparrow/response_http_message.rb +49 -0
  16. data/lib/sparrow/response_middleware.rb +32 -28
  17. data/lib/sparrow/response_steward.rb +13 -0
  18. data/lib/sparrow/route_parser.rb +28 -5
  19. data/lib/sparrow/steward.rb +125 -0
  20. data/lib/sparrow/strategies.rb +6 -0
  21. data/lib/sparrow/strategies/form_hash.rb +27 -11
  22. data/lib/sparrow/strategies/ignore.rb +33 -5
  23. data/lib/sparrow/strategies/json_format_strategies.rb +4 -0
  24. data/lib/sparrow/strategies/json_format_strategies/array_json_format_strategy.rb +23 -0
  25. data/lib/sparrow/strategies/json_format_strategies/default_json_format_strategy.rb +11 -2
  26. data/lib/sparrow/strategies/json_format_strategies/json_format_strategy.rb +21 -6
  27. data/lib/sparrow/strategies/json_format_strategies/rack_body_json_format_strategy.rb +22 -0
  28. data/lib/sparrow/strategies/key_transformation.rb +2 -0
  29. data/lib/sparrow/strategies/key_transformation/camelize_key.rb +45 -17
  30. data/lib/sparrow/strategies/key_transformation/underscore_key.rb +17 -6
  31. data/lib/sparrow/strategies/raw_input.rb +29 -7
  32. data/lib/sparrow/strategies/transform_params.rb +46 -21
  33. data/lib/sparrow/transformable.rb +28 -20
  34. data/lib/sparrow/version.rb +1 -1
  35. data/sparrow.gemspec +1 -1
  36. data/spec/integration/apps/rails_app/config/boot.rb +1 -1
  37. data/spec/integration/rack/camel_caser_spec.rb +2 -2
  38. data/spec/unit/camelize_key_spec.rb +9 -7
  39. data/spec/unit/configuration_spec.rb +3 -0
  40. data/spec/unit/http_message.rb +66 -0
  41. data/spec/unit/logger_spec.rb +6 -0
  42. data/spec/unit/{camel_caser_spec.rb → sparrow_spec.rb} +8 -2
  43. data/spec/unit/steward_spec.rb +31 -0
  44. metadata +24 -13
  45. data/lib/sparrow/path_normalizer.rb +0 -10
  46. data/lib/sparrow/strategies/json_format_strategies/array_strategy.rb +0 -17
  47. data/lib/sparrow/strategies/json_format_strategies/rack_body.rb +0 -17
  48. data/lib/sparrow/strategies/key_transformation/key_normalizer.rb +0 -9
  49. data/spec/unit/path_normalizer_spec.rb +0 -23
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8c0adb0e16e2c7a97a4b7c4d6db2506cd3c3f91e
4
- data.tar.gz: 7e58676322eb7f4981618f359ab3a2fcef609bd4
3
+ metadata.gz: d21e1f781a7f5f4a27d6d8c286cd46d9af31cba4
4
+ data.tar.gz: 838ed5f0629f44eb18c8041c1dcaf3d5048b1630
5
5
  SHA512:
6
- metadata.gz: e653bf471ed0d7d59ce627d1b26dd219b9807bf42e52663af3a3a4f884ea53c3a1c6472fdeb02cda302666ebdb2a9d293cbcdd0195d6f163b8581f1f38cec34c
7
- data.tar.gz: a4542efb1cd4984760480db9b200bc1e6da846bbfde61b44294715c83ae3d625e486be14bef7bf01c9ccf4fa49daa6c0c9d91a4de6d6858e724e59e5094c2e0b
6
+ metadata.gz: 99f670f75b1a3dc078130af3d946738f80705f1c79e26922afbbcba0921aecaa1c38bc7edd1253fb3f0a07fbad8c9635f5d6a7e332a407b4109d8b122a59c301
7
+ data.tar.gz: cd0a34026665ddfd21c075a05af4839b5f1995cc0d45d70009a205329a2862dd8eb752b243f5fa6c1937b2e973245a3130a2d2c33d25ced0bccbef71761b41df
data/.gitignore CHANGED
@@ -20,4 +20,5 @@ test/tmp
20
20
  test/version_tmp
21
21
  tmp
22
22
  .idea
23
- .project
23
+ .project
24
+ hoogfile.yml
@@ -1 +1 @@
1
- 2.1.5
1
+ 2.2
@@ -1,4 +1,4 @@
1
- Copyright (c) 2014 Daniel Schmidt
1
+ Copyright (c) 2014 gateprotect GmbH
2
2
 
3
3
  MIT License
4
4
 
data/README.md CHANGED
@@ -25,7 +25,8 @@ If you're using Rails, that's it. You haven't to do anything more. If you're not
25
25
  ```rb
26
26
  require 'sparrow'
27
27
 
28
- use Sparrow::Middleware
28
+ use Sparrow::RequestMiddleware
29
+ use Sparrow::ResponseMiddleware
29
30
  ```
30
31
 
31
32
  ## Configuration
@@ -43,18 +44,100 @@ Sparrow.configure do |config|
43
44
  end
44
45
  ```
45
46
 
46
- There are several options available
47
-
48
- | Option | Example | Meaning |
49
- |---------|---------|----------------------|
50
- | excluded_routes | see above | An Array of Strings and/or Regexps defining which paths should not be touched by the middleware. The entries should matchs paths for your application. They should *not* start with a leading slash. |
51
- | default_json_request_key_transformation_strategy | "underscore" | Defines how the middleware should treat incoming parameters via Request. Which means how they get tranformed, i.e. defining _underscore_ here means that incoming parameters get underscore. Possible values are _underscore_ and _camelize_ |
52
- | default_json_response_key_transformation_strategy | "camelize" | Same as *default_json_request_key_transformation_strategy, but for responses. I.e. this defines to which format the keys get transformed when the response gets sent.
53
- | json_request_format_header| "request-json-format" | Defines the HTTP Header key which sets the request transformation strategy as in default_json_request_key_transformation_strategy*. This definition has higher priority than the default definition. Any valid HTTP Header String value is possible. Defaults to 'request-json-format' |
54
- | json_response_format_header| "response-json-format" | Same as *json_request_format_header*, but for the response handling. Defaults to 'response-json-format' |
55
- | camelize_ignore_uppercase_keys | `true` | A boolean that indicates to not camelize keys that are all Uppercase, like CountryCodes "EN" ... |
56
- | allowed_content_types |`['application/json', 'text/x-json']` | A list of HTTP content types upon which the middleware shall trigger and possibly start conversion. Defaults to `['application/json', 'application/x-www-form-urlencoded', 'text/x-json']`. If `nil` is present in the list, requests/responses with *no* Content-Type header will be processed as well. Possible values can also be the start of the content-type-header like ```application/``` which matches everything which starts with ```application/``` like ```application/json``` |
57
- | allowed_accepts | `['application/json', 'text/x-json']` | Same as **allowed_content_types**, but reacts to the HTTP Accept Header. Applies to the same possible options, behavior. Defaults to the same set of MIME types, but also includes `nil` by default, which ignores checking the Accept header in default configuration |
47
+ Options may be:
48
+
49
+ ### excluded_routes
50
+
51
+ > `Array(String|Regexp)`. Default: `[]`
52
+
53
+ An Array of Strings and/or Regexps defining which paths should not be touched by the middleware. The entries should matchs paths for your application. They should *not* start with a leading slash.
54
+
55
+ Example:
56
+ `config.excluded_routes = ['api/model/certificates']`
57
+
58
+
59
+ ### default_json_request_key_transformation_strategy
60
+
61
+ > `String`. Default: `camelize`
62
+
63
+ Defines how the middleware should treat incoming parameters via Request. Which means how they get tranformed, i.e. defining _underscore_ here means that incoming parameters get underscore. Possible values are _underscore_ and _camelize_
64
+
65
+ Example:
66
+ `config.default_json_request_key_transformation_strategy = "underscore"`
67
+
68
+ ### default_json_response_key_transformation_strategy
69
+
70
+ > `String`. Default: `camelize`
71
+
72
+ Same as **default_json_request_key_transformation_strategy**, but for responses. I.e. this defines to which format the keys get transformed when the response gets sent.
73
+
74
+ Example:
75
+ `config.default_json_response_key_transformation_strategy = "camelize"`
76
+
77
+ ### json_request_format_header
78
+
79
+ > `String`. Default: `request-json-format`
80
+
81
+ Defines the HTTP Header key which sets the request transformation strategy as in default_json_request_key_transformation_strategy*. This definition has higher priority than the default definition. Any valid HTTP Header String value is possible. Defaults to `request-json-format`.
82
+
83
+ Example:
84
+ > `config.json_request_format_header = "request-json-format"`
85
+
86
+
87
+ ### json_response_format_header
88
+
89
+ > `String`. Default: `response-json-format`
90
+
91
+ Same as **json_request_format_header**, but for the response handling. Defaults to `response-json-format`
92
+
93
+ Example:
94
+ `config.json_response_format_header = "response-json-format"`
95
+
96
+ ### camelize_ignore_uppercase_keys
97
+
98
+ > `Boolean`. Default: `true`
99
+
100
+ A boolean that indicates to not camelize keys that are all Uppercase, like CountryCodes "EN", etc.
101
+
102
+ Example:
103
+ `config.camelize_ignore_uppercase_keys = true `
104
+
105
+ ### allowed_content_types
106
+
107
+ > `Array(String)`. Default: `%w[application/json application/x-www-form-urlencoded text/x-json]`
108
+
109
+ A list of HTTP content types upon which the middleware shall trigger and possibly start conversion. Defaults to `['application/json', 'application/x-www-form-urlencoded', 'text/x-json']`. If `nil` is present in the list, requests/responses with *no* Content-Type header will be processed as well. Possible values can also be the start of the content-type-header like ```application/``` which matches everything that starts with ```application/``` like ```application/json```
110
+
111
+ Example:
112
+ `config.allowed_content_types = ['application/json', 'text/x-json']`
113
+
114
+ ### allowed_accepts
115
+
116
+ > `Array(String)`. Default: `['application/json', 'application/x-www-form-urlencoded', 'text/x-json', nil]`
117
+
118
+ Same as [allowed_content_types], but reacts to the HTTP Accept Header. Applies to the same possible options, behavior. Defaults to the same set of MIME types, but also includes `nil` by default, which ignores checking the Accept header in default configuration
119
+
120
+ Example:
121
+ `config.allowed_accepts = ['application/json', 'text/x-json']`
122
+
123
+ ### enable_logging
124
+
125
+ > `Boolean`. Default: `false`
126
+
127
+ Determines logging while the middleware is active. Primary output is which conversion strategy gets chosen upon which request/response.
128
+
129
+ Example:
130
+ `config.enable_logging = true`
131
+
132
+ ### camelize_strategy
133
+
134
+ > `Symbol`. Default: `:lower`
135
+
136
+ Defines which strategy to use when camelizing keys. Possible options are `:lower` and `:upper`, which tells the middleware to
137
+ start camelized keys with an uppercased character or with a lowercased character.
138
+
139
+ Example:
140
+ `config.camelize_strategy = :lower`
58
141
 
59
142
  ## Tests
60
143
 
@@ -1,25 +1,42 @@
1
- require 'active_support/version'
1
+ require 'sparrow/dependencies'
2
2
  require 'sparrow/version'
3
3
  require 'sparrow/configuration'
4
4
  require 'sparrow/route_parser'
5
+ require 'sparrow/transformable'
6
+ require 'sparrow/strategies'
7
+ require 'sparrow/http_message'
8
+ require 'sparrow/request_http_message'
9
+ require 'sparrow/response_http_message'
10
+ require 'sparrow/steward'
11
+ require 'sparrow/response_steward'
12
+ require 'sparrow/middleware'
5
13
  require 'sparrow/request_middleware'
6
14
  require 'sparrow/response_middleware'
7
- require 'sparrow/strategies/json_format_strategies/rack_body'
8
- require 'sparrow/strategies/json_format_strategies/array_strategy'
15
+ require 'sparrow/logger'
9
16
  require 'sparrow/railtie' if defined?(Rails)
10
17
 
11
18
  module Sparrow
12
19
  class << self
20
+ # @yield [Configuration] configuration
13
21
  def configure
14
22
  yield configuration
15
23
  end
16
24
 
25
+ # @return [Configuration] the configuration
17
26
  def configuration
18
27
  @configuration ||= Configuration.new
19
28
  end
20
29
 
30
+ # resets the configuration values to their defaults, i.e.
31
+ # reinitializes the Configuration object without any arguments
32
+ # @return [Configuration] the (new initial) configuration
21
33
  def reset_configuration
22
- @configuration = nil
34
+ @configuration = Configuration.new
35
+ end
36
+
37
+ # @return [Logger] the middleware's logger
38
+ def logger
39
+ @logger ||= Logger.new(configuration.enable_logging)
23
40
  end
24
41
  end
25
42
  end
@@ -1,4 +1,6 @@
1
1
  module Sparrow
2
+ # Middleware configuration store
3
+ # see {https://github.com/GateprotectGmbH/sparrow#configuration}
2
4
  class Configuration
3
5
  attr_accessor :json_request_format_header,
4
6
  :json_response_format_header,
@@ -7,9 +9,15 @@ module Sparrow
7
9
  :default_json_response_key_transformation_strategy,
8
10
  :camelize_ignore_uppercase_keys,
9
11
  :allowed_content_types,
10
- :allowed_accepts
12
+ :allowed_accepts,
13
+ :enable_logging,
14
+ :ignored_response_codes,
15
+ :camelize_strategy
11
16
 
17
+ ##
18
+ # Initializes a new Configuration with default parameters
12
19
  def initialize
20
+ @enable_logging = false
13
21
  @json_request_format_header = 'request-json-format'
14
22
  @json_response_format_header = 'response-json-format'
15
23
  @excluded_routes = []
@@ -22,13 +30,26 @@ module Sparrow
22
30
  text/x-json
23
31
  ]
24
32
 
25
- @allowed_accepts = @allowed_content_types + [nil]
33
+ @allowed_accepts = @allowed_content_types + [nil]
34
+ @ignored_response_codes = [404] + (500..511).to_a
35
+ @camelize_strategy = :lower
26
36
  end
27
37
 
38
+ ##
39
+ # @param type [String] the http message type.
40
+ # Must be either 'request' or 'response'.
41
+ # @return [String] the configuration value for the json_format_header for
42
+ # the given http message type
28
43
  def json_format_header(type)
29
44
  public_send("json_#{type}_format_header")
30
45
  end
31
46
 
47
+ ##
48
+ # the default json_key_transformation_strategy option for the given
49
+ # http message type
50
+ # @param type [String] http message type. Must be either 'request' or
51
+ # 'response'
52
+ # @return [String] the configuration option value
32
53
  def default_json_key_transformation_strategy(type)
33
54
  public_send("default_json_#{type}_key_transformation_strategy")
34
55
  end
@@ -1,4 +1,6 @@
1
1
  class Hash
2
+ # Defines deep_transform_keys as available in ActiveSupport >= 4.0.2.
3
+ # See {http://apidock.com/rails/v4.2.1/Hash/deep_transform_keys}
2
4
  def deep_transform_keys(&block)
3
5
  deep_transform_in_object(self, &block)
4
6
  end
@@ -0,0 +1,15 @@
1
+ require 'active_support/core_ext/object'
2
+ require 'active_support/core_ext/string'
3
+ require 'active_support/version'
4
+
5
+ if ActiveSupport::VERSION::STRING.match(/3\.\d+\.\d+/)
6
+ require 'sparrow/core_ext/hash'
7
+ require 'active_support/core_ext/object/to_param'
8
+ require 'active_support/core_ext/object/to_query'
9
+ end
10
+
11
+ unless defined?(Rails)
12
+ require 'active_support/core_ext/logger'
13
+ end
14
+
15
+ require 'singleton'
@@ -0,0 +1,103 @@
1
+ module Sparrow
2
+ ##
3
+ # Wrapper class for either a ::ActiveDispatch::Request or ::Rack::Request
4
+ # instance for the given rack environment.
5
+ # The wrapped class is determined based on the presence of the Rails constant.
6
+ # @abstract RequestHttpMessage and ResponseHttpMessage should be used in
7
+ # practice
8
+ class HttpMessage
9
+ # The rack environment hash key that determines if it is a form hash request
10
+ FORM_HASH_KEY = 'rack.request.form_hash'
11
+ # The rack environment hash key to access the input/output
12
+ RACK_INPUT_KEY = 'rack.input'
13
+
14
+ ##
15
+ # @return [Hash] the Rack environment
16
+ # @see #initialize
17
+ attr_reader :env
18
+
19
+ ##
20
+ # Initializes the HttpMessage
21
+ # @param [Hash] env The Rack environment
22
+ def initialize(env)
23
+ @env = env
24
+ end
25
+
26
+ ##
27
+ # Depending on the environment this attribute may either be a
28
+ # [::ActionDispatch::Request], when running in a Rails environment,
29
+ # or a [::Rack::Request] otherwise
30
+ # Encapsulates the Rack env.
31
+ # @see #env
32
+ # @return [Object]
33
+ def request
34
+ @request ||= request_class.new(env)
35
+ end
36
+
37
+ # @return [Boolean] true any values is insides the FORM_HASH_KEY of the
38
+ # rack environment
39
+ # @see ::FORM_HASH_KEY
40
+ # @see #env
41
+ def form_hash?
42
+ env[FORM_HASH_KEY].present?
43
+ end
44
+
45
+ # Requested path within this HTTP message
46
+ # @return [String] the path
47
+ def path
48
+ http_header(:path_info)
49
+ end
50
+
51
+ ##
52
+ # The HTTP Accept Header field
53
+ # @return String the HTTP Accept Header value
54
+ def accept
55
+ http_header(:accept)
56
+ end
57
+
58
+ ##
59
+ # The HTTP Content Type Field
60
+ # @return String the HTTP Content-Type Header value
61
+ def content_type
62
+ http_header(:content_type)
63
+ end
64
+
65
+ ##
66
+ # Delegates all unknown method calls to the wrapped request
67
+ # @see #request
68
+ def method_missing(method_name, *args)
69
+ request.public_send(method_name, *args)
70
+ end
71
+
72
+ private
73
+
74
+ def request_class
75
+ if defined?(Rails)
76
+ ::ActionDispatch::Request
77
+ else
78
+ ::Rack::Request
79
+ end
80
+ end
81
+
82
+ ##
83
+ # Make sure to use any appropriate format of common HTTP Header key syntax
84
+ # for the given key
85
+ def http_header(key)
86
+ key = key.to_s
87
+ header_key = [
88
+ key,
89
+ key.upcase,
90
+ key.upcase.dasherize,
91
+ key.humanize,
92
+ key.dasherize,
93
+ key.parameterize,
94
+ key.underscore.split('_').map(&:humanize).join('-')
95
+ ].detect do |transformed_key|
96
+ headers_hash[transformed_key]
97
+ end
98
+
99
+ return nil unless header_key
100
+ headers_hash[header_key].to_s.split(';').first
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,53 @@
1
+ module Sparrow
2
+ ##
3
+ # Simple Logger class to handle behavior's in Rails and Rack environment
4
+ # without the need to depend on an a "real" Logger to be available under the
5
+ # hood.
6
+ #
7
+ # If the middleware is running in a Rails environment
8
+ # (i.e. the Rails-constant is defined), is will delegate all its method calls
9
+ # to the Rails logger.
10
+ # Otherwise a simple log to STDOUT will get triggered using the method name as
11
+ # log level and the argument as message.
12
+ #
13
+ # Examples:
14
+ #
15
+ # Sparrow::Logger.debug('this is a debug message')
16
+ #
17
+ # when in a Rails env equals
18
+ #
19
+ # Rails.logger.debug('this is a debug message')
20
+ #
21
+ # when not in a Rails environment the same call equals
22
+ #
23
+ # ActiveSupport::Logger.debug("this is a debug message")
24
+ class Logger
25
+ ##
26
+ # @return [Boolean] logging enabled
27
+ attr_accessor :enabled
28
+ alias_method :enabled?, :enabled
29
+
30
+ ##
31
+ # Wrapped Logger class
32
+ # the Rails logger or a plain ActiveSupport::Logger instance using STDOUT
33
+ attr_reader :logger
34
+
35
+ # Initialize the Logger
36
+ # Enables the logging only if +enabled+ is truthy.
37
+ # Otherwise the logger will do nothing at all.
38
+ #
39
+ # @param [Boolean] enabled logging enabled
40
+ def initialize(enabled)
41
+ self.enabled = enabled
42
+ @logger = if defined?(Rails) then
43
+ Rails.logger
44
+ else
45
+ ::Logger.new(STDOUT)
46
+ end
47
+ end
48
+
49
+ def method_missing(method_name, *args)
50
+ logger.public_send(method_name, *args) if enabled?
51
+ end
52
+ end
53
+ end
@@ -1,88 +1,69 @@
1
- require 'active_support/core_ext/object/blank'
2
- require 'sparrow/strategies/form_hash'
3
- require 'sparrow/strategies/raw_input'
4
- require 'sparrow/strategies/ignore'
5
-
6
1
  module Sparrow
2
+ ##
3
+ # Parent middleware class for both Requests and Responses.
4
+ # Provides common accessors, but does not modify the http message.
7
5
  class Middleware
8
- attr_reader :app, :body, :status, :headers
9
-
6
+ # @return [Object] the parent Rack application in the stack.
7
+ attr_reader :app
8
+ # @return [Array<String>] the rack body after the middleware call
9
+ attr_reader :body
10
+ # @return [Hash<String, String>] the HTTP Headers after the middleware call
11
+ attr_reader :headers
12
+ # @return [Integer] the HTTP status after the middleware call
13
+ attr_reader :status
14
+ # @return [Array<Integer>] List of ignored HTTP response codes
15
+ # @see Configuration#ignored_response_codes
16
+ attr_reader :ignored_response_codes
17
+
18
+
19
+ ##
20
+ # Creates a new Middleware object
21
+ # @param [#call] app the Rack application as defined by. Any object that
22
+ # responds to #call as defined in {https://rack.github.io/}.
10
23
  def initialize(app)
11
- @app = app
24
+ @app = app
25
+ @ignored_response_codes = ignored_response_codes
12
26
  end
13
27
 
28
+ # @return [Array] The Rack tuple of status, headers and body
29
+ # as defined by {https://rack.github.io/}
30
+ # Does nothing by default.
14
31
  def call(env)
15
32
  @last_env = env
16
33
  @status, @headers, @body = @app.call(convert(env))
17
34
  end
18
35
 
36
+ # Converts the Rack environment
37
+ # Does nothing.
38
+ # @param [Hash] env the rack env
39
+ # @return [Hash] the rack env
19
40
  def convert(env)
20
41
  env
21
42
  end
22
43
 
23
44
  private
24
45
 
25
- def strategy
26
- if is_processable?
27
- Rails.logger.debug 'Choosing strategy RawInput' if defined? Rails
28
- Strategies::RawInput
29
- else
30
- Rails.logger.debug 'Choosing strategy Ignore' if defined? Rails
31
- Strategies::Ignore
32
- end
33
- end
34
-
35
- def is_processable?
36
- accepted_content_type? && accepted_accept_header? && includes_route?
46
+ def steward
47
+ Steward.new(http_message,
48
+ allowed_content_types: Sparrow.configuration.allowed_content_types,
49
+ allowed_accepts: Sparrow.configuration.allowed_accepts,
50
+ excluded_routes: Sparrow.configuration.excluded_routes,
51
+ ignored_response_codes: Sparrow.configuration.ignored_response_codes)
37
52
  end
38
53
 
39
- def includes_route?
40
- path = request.path || last_env['PATH_INFO']
41
- RouteParser.new.allow?(path)
42
- end
43
-
44
- def accepted_content_type?
45
- content_type_equals?(content_type) || content_type_matches?(content_type)
46
- end
47
-
48
- def accepted_accept_header?
49
- allowed_accepts = Sparrow.configuration.allowed_accepts
50
- accept_header = last_env['ACCEPT'] || last_env['Accept']
51
-
52
- allowed_accepts.include?(nil) || accept_type_matches?(allowed_accepts, accept_header)
54
+ def strategy
55
+ strategy = if steward.has_processable_http_message?
56
+ Strategies::RawInput
57
+ else
58
+ Strategies::Ignore
59
+ end
60
+
61
+ Sparrow.logger.debug("#{self.class.name} choosing strategy #{strategy.name}")
62
+ strategy
53
63
  end
54
64
 
55
65
  def last_env
56
66
  @last_env || {}
57
67
  end
58
-
59
- def request
60
- request_class = if defined?(Rails) then
61
- ActionDispatch::Request
62
- else
63
- Rack::Request
64
- end
65
-
66
- request_class.new(last_env)
67
- end
68
-
69
- def content_type_equals?(type)
70
- Sparrow.configuration.allowed_content_types.include?(type)
71
- end
72
-
73
- def content_type_matches?(type)
74
- matches = Sparrow.configuration.allowed_content_types.map do |acceptable_content_type|
75
- (acceptable_content_type && type.to_s.starts_with?(acceptable_content_type.to_s))
76
- end
77
-
78
- matches.any?
79
- end
80
-
81
- def accept_type_matches?(accepted_headers, type)
82
- accepted_headers.detect do |accept|
83
- type.include?(accept)
84
- end
85
- end
86
68
  end
87
69
  end
88
-