def initialize(body = "{}", headers = {}, url = nil)
@url = url
@headers = Hash[headers.map { |k,v| [k.downcase, v] }]
case body
when nil, '' then @data = {}
when respond_to(:to_str) then @body = body.to_str
when respond_to(:to_hash) then @data = body.to_hash
when respond_to(:to_ary) then @data = body.to_ary
else raise ArgumentError, "cannot parse #{body.inspect}"
end
@body.force_encoding("utf-8") if @body.respond_to? :force_encoding
@body ||= MultiJson.encode(@data)
@data ||= MultiJson.decode(@body)
rescue EncodingError => error
fail "Invalid encoding in #{url.to_s}, please contact github."
end