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