Sha256: 6f5ae52ee51a8644a8e5b23a7c88a370406bed0ac074637f5bae8b16c46e7f55

Contents?: true

Size: 1.96 KB

Versions: 6

Compression:

Stored size: 1.96 KB

Contents

# encoding: utf-8
# This file is distributed under New Relic's license terms.
# See https://github.com/newrelic/rpm/blob/master/LICENSE for complete details.

require 'socket'

module FlakyProxy
  class Proxy
    def initialize(options)
      @listen_host = options.fetch(:listen_host)
      @listen_port = options.fetch(:listen_port)
      @backend_server = Server.new(options.fetch(:target_host), options.fetch(:target_port))
      @rules = RuleSet.build('')
      @rules_path = options[:rules_path]
      @listen_socket = nil
      reload_rules_file
    end

    def service_connection(client_socket)
      with_connection_logging(client_socket) do
        Connection.new(client_socket, @backend_server, @rules).service
      end
    rescue => e
      FlakyProxy.logger.error("Error servicing connection: #{e}, from #{e.backtrace.join("\n")}")
    end

    def reload_rules_file
      if @rules_path
        mtime = File.stat(@rules_path).mtime
        if @last_rules_mtime.nil? || mtime > @last_rules_mtime
          FlakyProxy.logger.info("Reloading rules file at #{@rules_path}")
          @rules = RuleSet.build(File.read(@rules_path))
          @last_rules_mtime = mtime
        end
      end
    rescue => e
      FlakyProxy.logger.error("Error reloading rules file at #{@rules_path}: #{e}\n#{e.backtrace.join("\n")}")
    end

    def with_connection_logging(client_socket)
      peer_info = client_socket.peeraddr(:hostname)
      client_str = "#{peer_info[2]}:#{peer_info[1]}"
      FlakyProxy.logger.info("Accepted connection from #{client_str}")
      yield
      FlakyProxy.logger.info("Finished servicing connection from #{client_str}")
    end

    def run
      FlakyProxy.logger.info("Starting FlakyProxy on #{@listen_host}:#{@listen_port} -> #{@backend_server.to_s}")
      @listen_socket = TCPServer.new(@listen_host, @listen_port)
      loop do
        client_socket = @listen_socket.accept
        service_connection(client_socket)
        reload_rules_file
      end
    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
newrelic_rpm-3.9.3.241 test/flaky_proxy/lib/flaky_proxy/proxy.rb
newrelic_rpm-3.9.2.239 test/flaky_proxy/lib/flaky_proxy/proxy.rb
newrelic_rpm-3.9.1.236 test/flaky_proxy/lib/flaky_proxy/proxy.rb
newrelic_rpm-3.9.0.229 test/flaky_proxy/lib/flaky_proxy/proxy.rb
newrelic_rpm-3.8.1.221 test/flaky_proxy/lib/flaky_proxy/proxy.rb
newrelic_rpm-3.8.0.218 test/flaky_proxy/lib/flaky_proxy/proxy.rb