Class: Ridley::Middleware::ParseJson
- Inherits:
-
Faraday::Response::Middleware
- Object
- Faraday::Response::Middleware
- Ridley::Middleware::ParseJson
- Extended by:
- Logging
- Includes:
- Logging
- Defined in:
- lib/ridley/middleware/parse_json.rb
Constant Summary collapse
- JSON_TYPE =
'application/json'.freeze
- BRACKETS =
[ "[", "{" ].freeze
- WHITESPACE =
[ " ", "\n", "\r", "\t" ].freeze
Class Method Summary collapse
-
.json_response?(env) ⇒ Boolean
Determines if the response of the given Faraday request env contains JSON.
-
.looks_like_json?(env) ⇒ Boolean
Examines the body of a request env and returns true if it appears to contain JSON or false if it does not.
-
.parse(body) ⇒ Hash
Takes a string containing JSON and converts it to a Ruby hash symbols for keys.
-
.response_type(env) ⇒ String
Extracts the type of the response from the response headers of a Faraday request env.
Instance Method Summary collapse
Methods included from Logging
Class Method Details
.json_response?(env) ⇒ Boolean
Determines if the response of the given Faraday request env contains JSON
68 69 70 |
# File 'lib/ridley/middleware/parse_json.rb', line 68 def json_response?(env) response_type(env) == JSON_TYPE && looks_like_json?(env) end |
.looks_like_json?(env) ⇒ Boolean
Examines the body of a request env and returns true if it appears to contain JSON or false if it does not
78 79 80 81 82 |
# File 'lib/ridley/middleware/parse_json.rb', line 78 def looks_like_json?(env) return false unless env[:body].present? BRACKETS.include?(first_char(env[:body])) end |
.parse(body) ⇒ Hash
Takes a string containing JSON and converts it to a Ruby hash symbols for keys
29 30 31 32 |
# File 'lib/ridley/middleware/parse_json.rb', line 29 def parse(body) result = JSON.parse(body) result.is_a?(Hash) ? Hashie::Mash.new(result) : result end |
.response_type(env) ⇒ String
Extracts the type of the response from the response headers of a Faraday request env. ‘text/html’ will be returned if no content-type is specified in the response
52 53 54 55 56 57 58 59 |
# File 'lib/ridley/middleware/parse_json.rb', line 52 def response_type(env) if env[:response_headers][CONTENT_TYPE].nil? log.debug { "response did not specify a content type" } return "text/html" end env[:response_headers][CONTENT_TYPE].split(';', 2).first end |
Instance Method Details
#on_complete(env) ⇒ Object
97 98 99 100 101 102 103 104 |
# File 'lib/ridley/middleware/parse_json.rb', line 97 def on_complete(env) if self.class.json_response?(env) log.debug { "==> parsing Chef response body as JSON" } env[:body] = self.class.parse(env[:body]) else log.debug { "==> Chef response did not contain a JSON body" } end end |