def raw_http_request(method, url, headers, body)
headers = build_headers(method, url, headers, body)
retriable_rest_request(method, url, body, headers) do |rest_request|
begin
response = rest_request.call {|r| r.read_body}
Chef::Log.debug("---- HTTP Status and Header Data: ----")
Chef::Log.debug("HTTP #{response.http_version} #{response.code} #{response.msg}")
response.each do |header, value|
Chef::Log.debug("#{header}: #{value}")
end
Chef::Log.debug("---- End HTTP Status/Header Data ----")
response_body = decompress_body(response)
if response.kind_of?(Net::HTTPSuccess)
if response['content-type'] =~ /json/
Chef::JSONCompat.from_json(response_body.chomp)
else
Chef::Log.warn("Expected JSON response, but got content-type '#{response['content-type']}'")
response_body
end
elsif redirect_location = redirected_to(response)
follow_redirect {api_request(:GET, create_url(redirect_location))}
else
response.body.replace(decompress_body(response)) if response.body.respond_to?(:replace)
if response['content-type'] =~ /json/
exception = Chef::JSONCompat.from_json(response_body)
msg = "HTTP Request Returned #{response.code} #{response.message}: "
msg << (exception["error"].respond_to?(:join) ? exception["error"].join(", ") : exception["error"].to_s)
Chef::Log.info(msg)
end
response.error!
end
rescue Exception => e
if e.respond_to?(:chef_rest_request=)
e.chef_rest_request = rest_request
end
raise
end
end
end