class RackOnLambda::Adapters::RestApi

Attributes

context[R]
event[R]

Public Class Methods

new(context:, event:) click to toggle source
# File lib/rack_on_lambda/adapters/rest_api.rb, line 8
def initialize(context:, event:)
  @context = context
  @event = event.deep_stringify_keys
end

Public Instance Methods

env() click to toggle source
# File lib/rack_on_lambda/adapters/rest_api.rb, line 13
def env
  @env ||= default_env.merge(env_request_metadata)
                      .merge(env_headers)
                      .merge(env_params)
                      .merge(env_body)
end
response(status, headers, body) click to toggle source
# File lib/rack_on_lambda/adapters/rest_api.rb, line 20
def response(status, headers, body)
  Responses::RestApiResponse.new(status, headers, body).as_json
end

Private Instance Methods

default_env() click to toggle source
# File lib/rack_on_lambda/adapters/rest_api.rb, line 26
def default_env
  {
    'SCRIPT_NAME' => '',
    'rack.version' => Rack::VERSION,
    'rack.errors' => $stderr,
    'rack.multithread' => true,
    'rack.multiprocess' => true,
    'rack.run_once' => false
  }
end
env_body() click to toggle source
# File lib/rack_on_lambda/adapters/rest_api.rb, line 37
def env_body
  result = event['body'] || ''
  result = Base64.decode64(result) if event['isBase64Encoded']

  {
    'rack.input' => StringIO.new(result).set_encoding(Encoding::BINARY),
    'CONTENT_LENGTH' => result.bytesize.to_s
  }
end
env_headers() click to toggle source
# File lib/rack_on_lambda/adapters/rest_api.rb, line 47
def env_headers
  result = {}
  http_headers.each_pair do |header, value|
    key = key_for_header(header)
    result[key] = value.to_s
  end
  result
end
env_params() click to toggle source
# File lib/rack_on_lambda/adapters/rest_api.rb, line 56
def env_params
  {
    'QUERY_STRING' => query_string
  }
end
env_request_metadata() click to toggle source
# File lib/rack_on_lambda/adapters/rest_api.rb, line 62
def env_request_metadata
  {
    'REQUEST_METHOD' => event['httpMethod'],
    'PATH_INFO' => path_info,
    'SERVER_NAME' => server_name,
    'SERVER_PORT' => server_port.to_s,
    'rack.url_scheme' => url_scheme
  }
end
http_headers() click to toggle source
# File lib/rack_on_lambda/adapters/rest_api.rb, line 72
def http_headers
  event['headers'] || {}
end
key_for_header(header) click to toggle source
# File lib/rack_on_lambda/adapters/rest_api.rb, line 76
def key_for_header(header)
  key = header.upcase.tr('-', '_')
  case key
  when 'CONTENT_LENGTH', 'CONTENT_TYPE' then key
  else "HTTP_#{key}"
  end
end
path_info() click to toggle source
# File lib/rack_on_lambda/adapters/rest_api.rb, line 84
def path_info
  event['path'] || ''
end
query_string() click to toggle source
# File lib/rack_on_lambda/adapters/rest_api.rb, line 88
def query_string
  return @query_string if defined?(@query_string)

  query = Query.new
  event['multiValueQueryStringParameters']&.each_pair do |key, value|
    query.add(key, value)
  end
  @query_string = query.to_s
end
server_name() click to toggle source
# File lib/rack_on_lambda/adapters/rest_api.rb, line 98
def server_name
  http_headers['Host'] || 'localhost'
end
server_port() click to toggle source
# File lib/rack_on_lambda/adapters/rest_api.rb, line 102
def server_port
  http_headers['X-Forwarded-Port'] || 443
end
url_scheme() click to toggle source
# File lib/rack_on_lambda/adapters/rest_api.rb, line 106
def url_scheme
  http_headers['CloudFront-Forwarded-Proto'] ||
    http_headers['X-Forwarded-Proto'] ||
    'https'
end