class Hoss::Spies::FaradaySpy

@api private

Constants

SUBTYPE
TYPE

Public Class Methods

without_net_http() { || ... } click to toggle source
# File lib/hoss/spies/faraday.rb, line 28
def self.without_net_http
  return yield unless defined?(NetHTTPSpy)

  Hoss::Spies::NetHTTPSpy.disable_in do
    yield
  end
end

Public Instance Methods

install() click to toggle source

rubocop:disable Metrics/CyclomaticComplexity

# File lib/hoss/spies/faraday.rb, line 37
def install
  ::Faraday::Connection.class_eval do
    alias run_request_without_apm run_request

    def run_request(method, url, body, headers, &block)
      result = nil
      error_in_request = false
      error_in_block = false
      begin
        Hoss.with_event do |event|
          Hoss::Spies::FaradaySpy.without_net_http do
            uri = URI(build_url(url))
            begin
              result = run_request_without_apm(method, url, body, headers) do |req|
                if block_given?
                  yield req
                  begin
                    new_path = req.path
                    new_query = URI.encode_www_form(req.params)
                    if uri.path != new_path || uri.query != new_query
                      test_uri = uri
                      test_uri.query = nil
                      begin
                        test_uri.path = new_path
                      rescue Exception => e
                      end
                      # The original url can be set to path if Faraday.get used
                      if test_uri.to_s != uri.to_s
                        uri.path = new_path
                      end
                      uri.query = new_query
                    end
                  rescue
                    error_in_block = true
                    raise
                  end
                end
                begin
                  event.request.method = method.to_s.upcase
                  event.request.url = uri.to_s
                  event.request.received_at = DateTime.now.strftime('%Q').to_i
                  event.request.headers['host'] = uri.hostname
                  req.headers.each {|n,v| event.request.headers[n] = v}
                  event.request.url = uri.to_s
                  event.request.body = req.body
                rescue
                  error_in_block = true
                  raise
                end
              end
            rescue
              error_in_request = true
              event.error = Hoss::Event::Error.new(Hoss::Event::Error::ConnectionError)
              event.error.received_at = DateTime.now.strftime('%Q').to_i
              raise
            end
            if result
              event.response = Hoss::Event::Response.new
              event.response.received_at = DateTime.now.strftime('%Q').to_i
              event.response.status_code = result.status.to_i
              result.headers.each {|n,v| event.response.headers[n] = v}
              event.response.body = result.body
            end
            result
          end
        end
      rescue Exception => e
        raise if error_in_request && !error_in_block
        puts format('Hoss Error: %s %s', e.inspect, e.backtrace)
        return result unless result.nil?
        return run_request_without_apm(method, url, body, headers, &block)
      end
    end
  end
end
run_request(method, url, body, headers) { |req| ... } click to toggle source
# File lib/hoss/spies/faraday.rb, line 41
def run_request(method, url, body, headers, &block)
  result = nil
  error_in_request = false
  error_in_block = false
  begin
    Hoss.with_event do |event|
      Hoss::Spies::FaradaySpy.without_net_http do
        uri = URI(build_url(url))
        begin
          result = run_request_without_apm(method, url, body, headers) do |req|
            if block_given?
              yield req
              begin
                new_path = req.path
                new_query = URI.encode_www_form(req.params)
                if uri.path != new_path || uri.query != new_query
                  test_uri = uri
                  test_uri.query = nil
                  begin
                    test_uri.path = new_path
                  rescue Exception => e
                  end
                  # The original url can be set to path if Faraday.get used
                  if test_uri.to_s != uri.to_s
                    uri.path = new_path
                  end
                  uri.query = new_query
                end
              rescue
                error_in_block = true
                raise
              end
            end
            begin
              event.request.method = method.to_s.upcase
              event.request.url = uri.to_s
              event.request.received_at = DateTime.now.strftime('%Q').to_i
              event.request.headers['host'] = uri.hostname
              req.headers.each {|n,v| event.request.headers[n] = v}
              event.request.url = uri.to_s
              event.request.body = req.body
            rescue
              error_in_block = true
              raise
            end
          end
        rescue
          error_in_request = true
          event.error = Hoss::Event::Error.new(Hoss::Event::Error::ConnectionError)
          event.error.received_at = DateTime.now.strftime('%Q').to_i
          raise
        end
        if result
          event.response = Hoss::Event::Response.new
          event.response.received_at = DateTime.now.strftime('%Q').to_i
          event.response.status_code = result.status.to_i
          result.headers.each {|n,v| event.response.headers[n] = v}
          event.response.body = result.body
        end
        result
      end
    end
  rescue Exception => e
    raise if error_in_request && !error_in_block
    puts format('Hoss Error: %s %s', e.inspect, e.backtrace)
    return result unless result.nil?
    return run_request_without_apm(method, url, body, headers, &block)
  end
end