class Chef::HTTP::JSONInput

Middleware that takes json input and turns it into raw text

Attributes

opts[RW]

Public Class Methods

new(opts = {}) click to toggle source
# File lib/chef/http/json_input.rb, line 30
def initialize(opts = {})
  @opts = opts
end

Public Instance Methods

handle_request(method, url, headers = {}, data = false) click to toggle source
# File lib/chef/http/json_input.rb, line 34
def handle_request(method, url, headers = {}, data = false)
  if data && should_encode_as_json?(headers)
    headers.delete_if { |key, _value| key.casecmp("content-type") == 0 }
    headers["Content-Type"] = "application/json"
    json_opts = {}
    json_opts[:validate_utf8] = opts[:validate_utf8] if opts.key?(:validate_utf8)
    data = Chef::JSONCompat.to_json(data, json_opts)
    # Force encoding to binary to fix SSL related EOFErrors
    # cf. http://tickets.opscode.com/browse/CHEF-2363
    # http://redmine.ruby-lang.org/issues/5233
    data.force_encoding(Encoding::BINARY) if data.respond_to?(:force_encoding)
  end
  [method, url, headers, data]
end
handle_response(http_response, rest_request, return_value) click to toggle source
# File lib/chef/http/json_input.rb, line 49
def handle_response(http_response, rest_request, return_value)
  [http_response, rest_request, return_value]
end
handle_stream_complete(http_response, rest_request, return_value) click to toggle source
# File lib/chef/http/json_input.rb, line 57
def handle_stream_complete(http_response, rest_request, return_value)
  [http_response, rest_request, return_value]
end
stream_response_handler(response) click to toggle source
# File lib/chef/http/json_input.rb, line 53
def stream_response_handler(response)
  nil
end

Private Instance Methods

should_encode_as_json?(headers) click to toggle source
# File lib/chef/http/json_input.rb, line 63
def should_encode_as_json?(headers)
  # ruby/Net::HTTP don't enforce capitalized headers (it normalizes them
  # for you before sending the request), so we have to account for all
  # the variations we might find
  requested_content_type = headers.find { |k, v| k.casecmp("content-type") == 0 }
  requested_content_type.nil? || requested_content_type.last.include?("json")
end