class Televideo::Server

Constants

CUSTOM_HEADERS
HEADER_CASSETTE_NAME
HEADER_PREFIX

Public Class Methods

new(cassette:, uri:, https: false, vcr_options: {}) click to toggle source
# File lib/televideo/server.rb, line 11
def initialize(cassette:, uri:, https: false, vcr_options: {})
  @cassette = cassette
  @uri = @uri.is_a?(URI) ? uri : URI(uri)
  @vcr_options = vcr_options
  @https = https
end

Public Instance Methods

call(env) click to toggle source
# File lib/televideo/server.rb, line 18
def call(env)
  name = cassette_name_from_env(env)
  res = VCR::use_cassette(name, @vcr_options) { run_request(env) }
  [
    res.code,
    headers_from_response(res),
    [res.body]
  ]
end

Private Instance Methods

cassette_name_from_env(env) click to toggle source
# File lib/televideo/server.rb, line 57
def cassette_name_from_env(env)
  "#{@cassette}/#{env[HEADER_CASSETTE_NAME] || default_cassette_name_from_env(env)}"
end
default_cassette_name_from_env(env) click to toggle source
# File lib/televideo/server.rb, line 61
def default_cassette_name_from_env(env)
  "#{env['REQUEST_METHOD']}_#{env['REQUEST_PATH'][1..-1].gsub('/', '-')}"
end
headers_from_response(res) click to toggle source
# File lib/televideo/server.rb, line 76
def headers_from_response(res)
  Rack::Utils::HeaderHash.new(reject_header_fields(res.to_hash))
end
headers_hash_from_env(env) click to toggle source
# File lib/televideo/server.rb, line 65
def headers_hash_from_env(env)
  env.select { |k, _| k.start_with?('HTTP_') }
    .map { |k, v| [normalize_header_field(k), v] }
    .reject { |(k, _)| CUSTOM_HEADERS.include?(k) }
    .to_h
end
normalize_header_field(k) click to toggle source
# File lib/televideo/server.rb, line 72
def normalize_header_field(k)
  k.gsub(/^HTTP_/, '').split('_').map(&:capitalize).join('-')
end
reject_header_fields(headers) click to toggle source
# File lib/televideo/server.rb, line 80
def reject_header_fields(headers)
  headers.reject do |k|
    [
      'connection',
      'keep-alive',
      'proxy-authenticate',
      'proxy-authorization',
      'te',
      'trailer',
      'transfer-encoding',
      'upgrade',
    ].include?(k.downcase)
  end
end
run_request(env) click to toggle source
# File lib/televideo/server.rb, line 30
def run_request(env)
  orig_req = Rack::Request.new(env)
  headers = headers_hash_from_env(env)

  http = Net::HTTP.new(@uri.host, @uri.port)

  if @https
    http.use_ssl = true
    http.verify_mode = OpenSSL::SSL::VERIFY_NONE
  end

  http.start do
    m = orig_req.request_method

    req = Net::HTTP.const_get(m.capitalize).new(orig_req.fullpath, headers)

    if orig_req.body
      req.body_stream = orig_req.body
      req.content_length = orig_req.content_length.to_i
      req.content_type = orig_req.content_type if orig_req.content_type
      req.body_stream.rewind
    end

    http.request(req)
  end
end