class LittleSniffer::Adapters::NetHttpAdapter

Public Class Methods

new(handler:) click to toggle source
# File lib/little_sniffer/adapters/net_http_adapter.rb, line 9
def initialize(handler:)
  @handler = handler
end

Public Instance Methods

sniff() { || ... } click to toggle source
# File lib/little_sniffer/adapters/net_http_adapter.rb, line 13
def sniff
  Net::HTTP.define_method(:request_with_sniffer, build_request_with_sniffer(@handler))
  Net::HTTP.alias_method(:request_without_sniffer, :request)
  Net::HTTP.alias_method(:request, :request_with_sniffer)

  yield
ensure
  Net::HTTP.alias_method(:request, :request_without_sniffer)
  Net::HTTP.remove_method(:request_with_sniffer)
  Net::HTTP.remove_method(:request_without_sniffer)
end

Private Instance Methods

build_request_with_sniffer(handler) click to toggle source

rubocop:disable Metrics/AbcSize, Metrics/MethodLength

# File lib/little_sniffer/adapters/net_http_adapter.rb, line 28
def build_request_with_sniffer(handler)
  lambda do |req, body = nil, &block|
    data = {
      request: {
        host: @address,
        method: req.method,
        query: req.path,
        port: @port,
        headers: req.each_header.collect.to_h,
        body: req.body.to_s
      }
    }

    bm = Benchmark.realtime do
      @response = request_without_sniffer(req, body, &block)
    end

    data[:response] = {
      status: @response.code.to_i,
      headers: @response.each_header.collect.to_h,
      body: @response.body.to_s,
      timing: bm
    }

    handler.call(data)

    @response
  end
end