class WebhookRecorder::Server

Attributes

http_expose[RW]
http_url[RW]
https_url[RW]
log_verbose[RW]
port[RW]
recorded_reqs[RW]
response_config[RW]

Public Class Methods

new(port, response_config, http_expose = true, log_verbose = false) click to toggle source
# File lib/webhook_recorder/server.rb, line 12
def initialize(port, response_config, http_expose = true, log_verbose = false)
  self.port = port
  self.response_config = response_config
  self.recorded_reqs = []
  self.http_expose = http_expose
  self.log_verbose = log_verbose
  @started = false
end
open(port, response_config, http_expose = true, log_verbose=false) { |server| ... } click to toggle source
# File lib/webhook_recorder/server.rb, line 21
def self.open(port, response_config, http_expose = true, log_verbose=false)
  server = new(port, response_config, http_expose, log_verbose)
  server.start
  server.wait
  if server.http_expose
    Ngrok::Tunnel.start(port: port, authtoken: ENV['NGROK_AUTH_TOKEN'])
    server.http_url = Ngrok::Tunnel.ngrok_url
    server.https_url = Ngrok::Tunnel.ngrok_url_https
  end
  yield server
ensure
  server.recorded_reqs.clear
  server.stop
  Ngrok::Tunnel.stop
end

Public Instance Methods

call(env) click to toggle source
# File lib/webhook_recorder/server.rb, line 54
def call(env)
  path = env['PATH_INFO']
  request = Rack::Request.new(env)
  recorded_reqs << env.merge(request_body: request.body.string).deep_transform_keys(&:downcase).with_indifferent_access
  if response_config[path]
    res = response_config[path]
    [res[:code], res[:headers] || {}, [res[:body] || "Missing body in response_config"]]
  else
    warn "WebhookRecorder::Server: Missing response_config for path #{path}" if self.log_verbose
    [404, {}, ["WebhookRecorder::Server: Missing response_config for path #{path}"]]
  end
end
start() click to toggle source
# File lib/webhook_recorder/server.rb, line 37
def start
  Thread.new do
    options = {
      Port: @port,
      Logger: WEBrick::Log.new(self.log_verbose ? STDOUT : "/dev/null"),
      AccessLog: [],
      DoNotReverseLookup: true,
      StartCallback: -> { @started = true }
    }
    Rack::Handler::WEBrick.run(self, options) { |s| @server = s }
  end
end
stop() click to toggle source
# File lib/webhook_recorder/server.rb, line 67
def stop
  @server.shutdown if @server
end
wait() click to toggle source
# File lib/webhook_recorder/server.rb, line 50
def wait
  Timeout.timeout(10) { sleep 0.1 until @started }
end