Sha256: 74a1fa889ba3b5ea1c21b05b673c6e79c86c33bce9e40030aced4a51a8ba17d4

Contents?: true

Size: 1.92 KB

Versions: 2

Compression:

Stored size: 1.92 KB

Contents

module Lamby
  class Handler

    class << self

      def call(app, event, context, options = {})
        new(app, event, context, options).call.response
      end

    end

    def initialize(app, event, context, options = {})
      @app = app
      @event = event
      @context = context
      @options = options
      @called = false
    end

    def response
      { statusCode: status,
        headers: headers,
        body: body }.merge(rack_response)
    end

    def status
      @status
    end

    def headers
      @headers
    end

    def set_cookies
      return @set_cookies if defined?(@set_cookies)
      @set_cookies = if @headers && @headers['Set-Cookie']
        @headers.delete('Set-Cookie').split("\n")
      end
    end

    def body
      @rbody ||= ''.tap do |rbody|
        @body.each { |part| rbody << part if part }
      end
    end

    def call
      return self if @called
      @status, @headers, @body = call_app
      set_cookies
      @called = true
      self
    end

    def base64_encodeable?(hdrs = @headers)
      hdrs && (
        hdrs['Content-Transfer-Encoding'] == 'binary' ||
        content_encoding_compressed?(hdrs) ||
        hdrs['X-Lamby-Base64'] == '1'
      )
    end

    def body64
      Base64.strict_encode64(body)
    end

    private

    def rack
      @rack ||= case @options[:rack]
      when :rest, :api
        Lamby::RackRest.new @event, @context
      when :alb
        Lamby::RackAlb.new @event, @context
      else
        Lamby::RackHttp.new @event, @context
      end
    end

    def rack_response
      rack.response(self)
    end

    def call_app
      if Debug.on?(@event)
        Debug.call @event, @context, rack.env
      else
        @app.call rack.env
      end
    end

    def content_encoding_compressed?(hdrs)
      content_encoding_header = hdrs['Content-Encoding'] || ''
      content_encoding_header.split(', ').any? { |h| ['br', 'gzip'].include?(h) }
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
lamby-2.6.3 lib/lamby/handler.rb
lamby-2.6.2 lib/lamby/handler.rb