class Camo::Server

Constants

ALLOWED_REMOTE_HEADERS

Attributes

key[R]
request[R]

Public Class Methods

new(key) click to toggle source
# File lib/camo/server.rb, line 21
def initialize(key)
  @key = String(key)
  raise Errors::UndefinedKeyError if @key.empty?
end

Public Instance Methods

call(env) click to toggle source
# File lib/camo/server.rb, line 26
def call(env)
  build_request(env)

  return [404, default_response_headers, []] unless request.method == "GET"

  unless request.valid_digest?
    logger.error("Invalid digest")
    return [401, default_response_headers, ["Invalid digest"]]
  end

  unless request.valid_request?
    logger.error(request.errors)
    return [422, default_response_headers, request.errors.join(", ")]
  end

  logger.debug "Request", {
    type: request.digest_type,
    url: request.url,
    headers: request.headers,
    destination: request.destination_url,
    digest: request.digest
  }

  status, headers, body = client.get(request.destination_url, request.headers)
  headers = build_response_headers(headers)
  logger.debug "Response", {status: status, headers: headers, body_bytesize: body.bytesize}

  [status, headers, [body]]
rescue Errors::ClientError => e
  logger.error(e.message)
  [422, default_response_headers, e.message]
end

Private Instance Methods

build_request(env) click to toggle source
# File lib/camo/server.rb, line 65
def build_request(env)
  @request ||= Request.new(env, key)
end
build_response_headers(headers) click to toggle source
# File lib/camo/server.rb, line 73
def build_response_headers(headers)
  headers
    .select { |k, _| ALLOWED_REMOTE_HEADERS.include?(k.downcase) }
    .merge(default_response_headers)
end
client() click to toggle source
# File lib/camo/server.rb, line 69
def client
  @client ||= Client.new
end
logger() click to toggle source
# File lib/camo/server.rb, line 61
def logger
  @logger ||= Logger.stdio
end