cloudfoundry/cfoundry

View on GitHub
lib/cfoundry/trace_helpers.rb

Summary

Maintainability
A
55 mins
Test Coverage
require "net/https"
require "multi_json"

module CFoundry
  module TraceHelpers
    PROTECTED_ATTRIBUTES = ['Authorization', 'credentials']

    def request_trace(request)
      return nil unless request
      info = ["REQUEST: #{request[:method]} #{request[:url]}"]
      info << "REQUEST_HEADERS:"
      info << header_trace(request[:headers])
      info << "REQUEST_BODY: #{request[:body]}" if request[:body]
      info.join("\n")
    end


    def response_trace(response)
      return nil unless response
      info = ["RESPONSE: [#{response[:status]}]"]
      info << "RESPONSE_HEADERS:"
      info << header_trace(response[:headers])
      info << "RESPONSE_BODY:"
      begin
        parsed_body = MultiJson.load(response[:body])
        filter_protected_attributes(parsed_body)
        info << MultiJson.dump(parsed_body, :pretty => true)
      rescue
        info << "#{response[:body]}"
      end
      info.join("\n")
    end

    private

    def header_trace(headers)
      headers.sort.map do |key, value|
        unless PROTECTED_ATTRIBUTES.include?(key)
          "  #{key} : #{value}"
        else
          "  #{key} : [PRIVATE DATA HIDDEN]"
        end
      end
    end

    def filter_protected_attributes(hash_or_array)
      if hash_or_array.is_a? Array
        hash_or_array.each do |value|
          filter_protected_attributes(value)
        end
      else
        hash_or_array.each do |key, value|
          if PROTECTED_ATTRIBUTES.include? key
            hash_or_array[key] = "[PRIVATE DATA HIDDEN]"
          else
            if value.is_a?(Hash) || value.is_a?(Array)
              filter_protected_attributes(value)
            end
          end
        end
      end
    end
  end
end