class MiniProxy::Remote

Controls the remote DRb service, which provides a communcation mechanism

Constants

SERVER_DYNAMIC_PORT_RANGE
SERVER_START_TIMEOUT

Public Class Methods

drb_process_alive?() click to toggle source
# File lib/miniproxy/remote.rb, line 17
def self.drb_process_alive?
  pid && Process.kill(0, pid) == 1
rescue Errno::ESRCH
  false
end
new(host) click to toggle source
# File lib/miniproxy/remote.rb, line 135
def initialize(host)
  @host = host
  @stubs = []
  @messages = []
  @allowed_requests = []
end
pid() click to toggle source
# File lib/miniproxy/remote.rb, line 13
def self.pid
  @pid
end
server(host = "127.0.0.1") click to toggle source
# File lib/miniproxy/remote.rb, line 23
def self.server(host = "127.0.0.1")
  @unix_socket_uri ||= begin
    tempfile = Tempfile.new("mini_proxy")
    socket_path = tempfile.path
    tempfile.close!
    "drbunix:///#{socket_path}"
  end

  return @unix_socket_uri if drb_process_alive?

  @pid = fork do
    remote = Remote.new(host)

    Timeout.timeout(SERVER_START_TIMEOUT) do
      begin
        fake_server_port = SERVER_DYNAMIC_PORT_RANGE.sample
        fake_server = FakeSSLServer.new(
          AllowedRequestCheck: remote.method(:allowed_request?),
          Port: fake_server_port,
          MockHandlerCallback: remote.method(:handler),
        )
        Thread.new { fake_server.start }
      rescue Errno::EADDRINUSE
        retry
      end

      begin
        remote.port = ENV["MINI_PROXY_PORT"] || SERVER_DYNAMIC_PORT_RANGE.sample
        proxy = MiniProxy::ProxyServer.new(
          AllowedRequestCheck: remote.method(:allowed_request?),
          Port: remote.port,
          FakeServerPort: fake_server_port,
          MockHandlerCallback: remote.method(:handler),
        )
        Thread.new { proxy.start }
      rescue Errno::EADDRINUSE
        retry
      end
    end

    DRb.start_service(@unix_socket_uri, remote)
    DRb.thread.join

    Process.exit!
  end

  Process.detach(@pid)
  @unix_socket_uri
end

Public Instance Methods

allow_request(method:, url:) click to toggle source
# File lib/miniproxy/remote.rb, line 93
def allow_request(method:, url:)
  @allowed_requests.push(MiniProxy::Stub::Request.new(method: method, url: url, response: nil))
end
allowed_request?(req) click to toggle source
# File lib/miniproxy/remote.rb, line 97
def allowed_request?(req)
  return true if ["127.0.0.1", "localhost", @host].include?(req.host)

  @allowed_requests.any? { |allowed_request| allowed_request.match?(req) }
end
clear() click to toggle source
# File lib/miniproxy/remote.rb, line 115
def clear
  @stubs.clear
  @allowed_requests.clear
end
drain_messages() click to toggle source
# File lib/miniproxy/remote.rb, line 120
def drain_messages
  @messages.slice!(0, @messages.length)
end
handler(req, res) click to toggle source
# File lib/miniproxy/remote.rb, line 73
def handler(req, res)
  if (request = @stubs.detect { |mock_request| mock_request.match?(req) })
    response = request.response
    res.status = response.code
    response.headers.each { |key, value| res[key] = value }
    res.body = response.body
  else
    res.status = 200
    res.body = ""
    queue_message "WARN: external request to #{req.host}#{req.path} not mocked"
    queue_message %Q{Stub with: MiniProxy.stub_request(method: "#{req.request_method}", url: "#{req.host}#{req.path}")}
  end
end
port() click to toggle source
# File lib/miniproxy/remote.rb, line 103
def port
  @port
end
port=(value) click to toggle source
# File lib/miniproxy/remote.rb, line 107
def port=(value)
  @port = value
end
started?() click to toggle source
# File lib/miniproxy/remote.rb, line 124
def started?
  current_server = DRb.current_server()
  current_server && current_server.alive?
end
stop() click to toggle source
# File lib/miniproxy/remote.rb, line 111
def stop
  DRb.stop_service
end
stub_request(method:, url:, response:) click to toggle source
# File lib/miniproxy/remote.rb, line 87
def stub_request(method:, url:, response:)
  response = MiniProxy::Stub::Response.new(headers: response[:headers], body: response[:body])
  request = MiniProxy::Stub::Request.new(method: method, url: url, response: response)
  @stubs.push(request)
end

Private Instance Methods

queue_message(msg) click to toggle source
# File lib/miniproxy/remote.rb, line 131
def queue_message(msg)
  @messages.push msg
end