lamby 0.6.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +7 -0
- data/Gemfile.lock +2 -2
- data/lib/lamby.rb +1 -0
- data/lib/lamby/debug.rb +1 -1
- data/lib/lamby/handler.rb +5 -1
- data/lib/lamby/rack.rb +85 -0
- data/lib/lamby/rack_alb.rb +27 -44
- data/lib/lamby/rack_api.rb +4 -62
- data/lib/lamby/templates/application_load_balancer/template.yaml +5 -1
- data/lib/lamby/version.rb +1 -1
- metadata +3 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: cad37e588b82d16978294d8ae866bdb90f67dbd82f8da8ad04f74c04515043d7
         | 
| 4 | 
            +
              data.tar.gz: f2301b796dfcfcd32ea21dd8dee9666257887e28022266a9e662c17f2a5df204
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 0062a78076ce56c00ce31ba1813112f4e1341e24fd104df195131f4a5cde00142490d336ceacb91c6431facfaae3dc115feba6e0e9952c81c6e907f3bd32b3c9
         | 
| 7 | 
            +
              data.tar.gz: d728410d053304a4b6306972d63e054b1d33b45ca57ca8c9499467902c53990523164661399b1098fbd9b27d9cff1e11518250fee0d03c8bc0130bda6670eda4
         | 
    
        data/CHANGELOG.md
    CHANGED
    
    
    
        data/Gemfile.lock
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            PATH
         | 
| 2 2 | 
             
              remote: .
         | 
| 3 3 | 
             
              specs:
         | 
| 4 | 
            -
                lamby (0. | 
| 4 | 
            +
                lamby (1.0.0)
         | 
| 5 5 | 
             
                  rack
         | 
| 6 6 | 
             
                  rails
         | 
| 7 7 |  | 
| @@ -87,7 +87,7 @@ GEM | |
| 87 87 | 
             
                minitest (5.11.3)
         | 
| 88 88 | 
             
                mocha (1.8.0)
         | 
| 89 89 | 
             
                  metaclass (~> 0.0.1)
         | 
| 90 | 
            -
                nio4r (2. | 
| 90 | 
            +
                nio4r (2.4.0)
         | 
| 91 91 | 
             
                nokogiri (1.10.3)
         | 
| 92 92 | 
             
                  mini_portile2 (~> 2.4.0)
         | 
| 93 93 | 
             
                pry (0.12.2)
         | 
    
        data/lib/lamby.rb
    CHANGED
    
    
    
        data/lib/lamby/debug.rb
    CHANGED
    
    | @@ -5,7 +5,7 @@ module Lamby | |
| 5 5 | 
             
                extend self
         | 
| 6 6 |  | 
| 7 7 | 
             
                def on?(event)
         | 
| 8 | 
            -
                  params = event['queryStringParameters']
         | 
| 8 | 
            +
                  params = event['multiValueQueryStringParameters'] || event['queryStringParameters']
         | 
| 9 9 | 
             
                  (Rails.env.development? || ENV['LAMBY_DEBUG']) && params && params['debug'] == '1'
         | 
| 10 10 | 
             
                end
         | 
| 11 11 |  | 
    
        data/lib/lamby/handler.rb
    CHANGED
    
    | @@ -20,7 +20,7 @@ module Lamby | |
| 20 20 | 
             
                def response
         | 
| 21 21 | 
             
                  { statusCode: status,
         | 
| 22 22 | 
             
                    headers: headers,
         | 
| 23 | 
            -
                    body: body }
         | 
| 23 | 
            +
                    body: body }.merge(rack_response)
         | 
| 24 24 | 
             
                end
         | 
| 25 25 |  | 
| 26 26 | 
             
                def status
         | 
| @@ -55,6 +55,10 @@ module Lamby | |
| 55 55 | 
             
                  end
         | 
| 56 56 | 
             
                end
         | 
| 57 57 |  | 
| 58 | 
            +
                def rack_response
         | 
| 59 | 
            +
                  rack.response(self)
         | 
| 60 | 
            +
                end
         | 
| 61 | 
            +
             | 
| 58 62 | 
             
                def call_app
         | 
| 59 63 | 
             
                  if Debug.on?(@event)
         | 
| 60 64 | 
             
                    Debug.call @event, @context, rack.env
         | 
    
        data/lib/lamby/rack.rb
    ADDED
    
    | @@ -0,0 +1,85 @@ | |
| 1 | 
            +
            module Lamby
         | 
| 2 | 
            +
              class Rack
         | 
| 3 | 
            +
             | 
| 4 | 
            +
                include SamHelpers
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                LAMBDA_EVENT = 'lambda.event'.freeze
         | 
| 7 | 
            +
                LAMBDA_CONTEXT = 'lambda.context'.freeze
         | 
| 8 | 
            +
                HTTP_X_REQUESTID = 'HTTP_X_REQUEST_ID'.freeze
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                attr_reader :event, :context
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                def initialize(event, context)
         | 
| 13 | 
            +
                  @event = event
         | 
| 14 | 
            +
                  @context = context
         | 
| 15 | 
            +
                end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                def env
         | 
| 18 | 
            +
                  @env ||= env_base.merge!(env_headers)
         | 
| 19 | 
            +
                end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                def response(_handler)
         | 
| 22 | 
            +
                  {}
         | 
| 23 | 
            +
                end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                def api?
         | 
| 26 | 
            +
                  false
         | 
| 27 | 
            +
                end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                def alb?
         | 
| 30 | 
            +
                  false
         | 
| 31 | 
            +
                end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                def multi_value?
         | 
| 34 | 
            +
                  false
         | 
| 35 | 
            +
                end
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                private
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                def env_base
         | 
| 40 | 
            +
                  raise NotImplementedError
         | 
| 41 | 
            +
                end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                def env_headers
         | 
| 44 | 
            +
                  headers.transform_keys do |key|
         | 
| 45 | 
            +
                    "HTTP_#{key.to_s.upcase.tr '-', '_'}"
         | 
| 46 | 
            +
                  end.tap do |hdrs|
         | 
| 47 | 
            +
                    hdrs[HTTP_X_REQUESTID] = request_id
         | 
| 48 | 
            +
                  end
         | 
| 49 | 
            +
                end
         | 
| 50 | 
            +
             | 
| 51 | 
            +
                def content_type
         | 
| 52 | 
            +
                  headers.delete('Content-Type') || headers.delete('content-type') || headers.delete('CONTENT_TYPE')
         | 
| 53 | 
            +
                end
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                def content_length
         | 
| 56 | 
            +
                  bytesize = body.bytesize.to_s if body
         | 
| 57 | 
            +
                  headers.delete('Content-Length') || headers.delete('content-length') || headers.delete('CONTENT_LENGTH') || bytesize
         | 
| 58 | 
            +
                end
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                def body
         | 
| 61 | 
            +
                  @body ||= if event['body'] && base64_encoded?
         | 
| 62 | 
            +
                    Base64.decode64 event['body']
         | 
| 63 | 
            +
                  else
         | 
| 64 | 
            +
                    event['body']
         | 
| 65 | 
            +
                  end
         | 
| 66 | 
            +
                end
         | 
| 67 | 
            +
             | 
| 68 | 
            +
                def headers
         | 
| 69 | 
            +
                  @headers ||= event['headers'] || {}
         | 
| 70 | 
            +
                end
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                def query_string
         | 
| 73 | 
            +
                  @query_string ||= event['queryStringParameters'].try(:to_query)
         | 
| 74 | 
            +
                end
         | 
| 75 | 
            +
             | 
| 76 | 
            +
                def base64_encoded?
         | 
| 77 | 
            +
                  event['isBase64Encoded']
         | 
| 78 | 
            +
                end
         | 
| 79 | 
            +
             | 
| 80 | 
            +
                def request_id
         | 
| 81 | 
            +
                  context.aws_request_id
         | 
| 82 | 
            +
                end
         | 
| 83 | 
            +
             | 
| 84 | 
            +
              end
         | 
| 85 | 
            +
            end
         | 
    
        data/lib/lamby/rack_alb.rb
    CHANGED
    
    | @@ -1,21 +1,24 @@ | |
| 1 1 | 
             
            module Lamby
         | 
| 2 | 
            -
              class RackAlb
         | 
| 2 | 
            +
              class RackAlb < Lamby::Rack
         | 
| 3 3 |  | 
| 4 | 
            -
                 | 
| 5 | 
            -
             | 
| 6 | 
            -
                 | 
| 7 | 
            -
                LAMBDA_CONTEXT = 'lambda.context'.freeze
         | 
| 8 | 
            -
                HTTP_X_REQUESTID = 'HTTP_X_REQUEST_ID'.freeze
         | 
| 9 | 
            -
             | 
| 10 | 
            -
                attr_reader :event, :context
         | 
| 4 | 
            +
                def alb?
         | 
| 5 | 
            +
                  true
         | 
| 6 | 
            +
                end
         | 
| 11 7 |  | 
| 12 | 
            -
                def  | 
| 13 | 
            -
                   | 
| 14 | 
            -
                  @context = context
         | 
| 8 | 
            +
                def multi_value?
         | 
| 9 | 
            +
                  event.key? 'multiValueHeaders'
         | 
| 15 10 | 
             
                end
         | 
| 16 11 |  | 
| 17 | 
            -
                def  | 
| 18 | 
            -
                   | 
| 12 | 
            +
                def response(handler)
         | 
| 13 | 
            +
                  hhdrs = handler.headers
         | 
| 14 | 
            +
                  multivalue_headers = hhdrs.transform_values { |v| Array.wrap(v) } if multi_value?
         | 
| 15 | 
            +
                  status_description = "#{handler.status} #{::Rack::Utils::HTTP_STATUS_CODES[handler.status]}"
         | 
| 16 | 
            +
                  base64_encode = hhdrs['Content-Transfer-Encoding'] == 'binary' || hhdrs['X-Lamby-Base64'] == '1'
         | 
| 17 | 
            +
                  body = Base64.strict_encode64(handler.body) if base64_encode
         | 
| 18 | 
            +
                  { multiValueHeaders: multivalue_headers,
         | 
| 19 | 
            +
                    statusDescription: status_description,
         | 
| 20 | 
            +
                    isBase64Encoded: base64_encode,
         | 
| 21 | 
            +
                    body: body }.compact
         | 
| 19 22 | 
             
                end
         | 
| 20 23 |  | 
| 21 24 | 
             
                private
         | 
| @@ -45,45 +48,25 @@ module Lamby | |
| 45 48 | 
             
                  end
         | 
| 46 49 | 
             
                end
         | 
| 47 50 |  | 
| 48 | 
            -
                def  | 
| 49 | 
            -
                  headers | 
| 50 | 
            -
                    "HTTP_#{key.to_s.upcase.tr '-', '_'}"
         | 
| 51 | 
            -
                  end.tap do |hdrs|
         | 
| 52 | 
            -
                    hdrs[HTTP_X_REQUESTID] = request_id
         | 
| 53 | 
            -
                  end
         | 
| 54 | 
            -
                end
         | 
| 55 | 
            -
             | 
| 56 | 
            -
                def content_type
         | 
| 57 | 
            -
                  headers.delete('Content-Type') || headers.delete('content-type') || headers.delete('CONTENT_TYPE')
         | 
| 58 | 
            -
                end
         | 
| 59 | 
            -
             | 
| 60 | 
            -
                def content_length
         | 
| 61 | 
            -
                  bytesize = body.bytesize.to_s if body
         | 
| 62 | 
            -
                  headers.delete('Content-Length') || headers.delete('content-length') || headers.delete('CONTENT_LENGTH') || bytesize
         | 
| 51 | 
            +
                def headers
         | 
| 52 | 
            +
                  @headers ||= multi_value? ? headers_multi : super
         | 
| 63 53 | 
             
                end
         | 
| 64 54 |  | 
| 65 | 
            -
                def  | 
| 66 | 
            -
                   | 
| 67 | 
            -
                     | 
| 68 | 
            -
                  else
         | 
| 69 | 
            -
                    event['body']
         | 
| 55 | 
            +
                def headers_multi
         | 
| 56 | 
            +
                  (event['multiValueHeaders'] || {}).transform_values do |v|
         | 
| 57 | 
            +
                    v.is_a?(Array) ? v.first : v
         | 
| 70 58 | 
             
                  end
         | 
| 71 59 | 
             
                end
         | 
| 72 60 |  | 
| 73 | 
            -
                def headers
         | 
| 74 | 
            -
                  event['headers'] || {}
         | 
| 75 | 
            -
                end
         | 
| 76 | 
            -
             | 
| 77 61 | 
             
                def query_string
         | 
| 78 | 
            -
                  @query_string ||=  | 
| 79 | 
            -
                end
         | 
| 80 | 
            -
             | 
| 81 | 
            -
                def base64_encoded?
         | 
| 82 | 
            -
                  event['isBase64Encoded']
         | 
| 62 | 
            +
                  @query_string ||= multi_value? ? query_string_multi : super
         | 
| 83 63 | 
             
                end
         | 
| 84 64 |  | 
| 85 | 
            -
                def  | 
| 86 | 
            -
                   | 
| 65 | 
            +
                def query_string_multi
         | 
| 66 | 
            +
                  query = event['multiValueQueryStringParameters'] || {}
         | 
| 67 | 
            +
                  string = query.map do |key, value|
         | 
| 68 | 
            +
                    value.map{ |v| "#{key}=#{v}" }.join('&')
         | 
| 69 | 
            +
                  end.flatten.join('&')
         | 
| 87 70 | 
             
                end
         | 
| 88 71 |  | 
| 89 72 | 
             
              end
         | 
    
        data/lib/lamby/rack_api.rb
    CHANGED
    
    | @@ -1,21 +1,8 @@ | |
| 1 1 | 
             
            module Lamby
         | 
| 2 | 
            -
              class RackApi
         | 
| 2 | 
            +
              class RackApi < Lamby::Rack
         | 
| 3 3 |  | 
| 4 | 
            -
                 | 
| 5 | 
            -
             | 
| 6 | 
            -
                LAMBDA_EVENT = 'lambda.event'.freeze
         | 
| 7 | 
            -
                LAMBDA_CONTEXT = 'lambda.context'.freeze
         | 
| 8 | 
            -
                HTTP_X_REQUESTID = 'HTTP_X_REQUEST_ID'.freeze
         | 
| 9 | 
            -
             | 
| 10 | 
            -
                attr_reader :event, :context
         | 
| 11 | 
            -
             | 
| 12 | 
            -
                def initialize(event, context)
         | 
| 13 | 
            -
                  @event = event
         | 
| 14 | 
            -
                  @context = context
         | 
| 15 | 
            -
                end
         | 
| 16 | 
            -
             | 
| 17 | 
            -
                def env
         | 
| 18 | 
            -
                  @env ||= env_base.merge!(env_headers)
         | 
| 4 | 
            +
                def api?
         | 
| 5 | 
            +
                  true
         | 
| 19 6 | 
             
                end
         | 
| 20 7 |  | 
| 21 8 | 
             
                private
         | 
| @@ -27,7 +14,7 @@ module Lamby | |
| 27 14 | 
             
                    ::Rack::QUERY_STRING => query_string,
         | 
| 28 15 | 
             
                    ::Rack::SERVER_NAME => headers['Host'],
         | 
| 29 16 | 
             
                    ::Rack::SERVER_PORT => headers['X-Forwarded-Port'],
         | 
| 30 | 
            -
                    ::Rack::SERVER_PROTOCOL =>  | 
| 17 | 
            +
                    ::Rack::SERVER_PROTOCOL => event.dig('requestContext', 'protocol') || 'HTTP/1.1',
         | 
| 31 18 | 
             
                    ::Rack::RACK_VERSION => ::Rack::VERSION,
         | 
| 32 19 | 
             
                    ::Rack::RACK_URL_SCHEME => 'https',
         | 
| 33 20 | 
             
                    ::Rack::RACK_INPUT => StringIO.new(body || ''),
         | 
| @@ -45,50 +32,5 @@ module Lamby | |
| 45 32 | 
             
                  end
         | 
| 46 33 | 
             
                end
         | 
| 47 34 |  | 
| 48 | 
            -
                def env_headers
         | 
| 49 | 
            -
                  headers.transform_keys do |key|
         | 
| 50 | 
            -
                    "HTTP_#{key.to_s.upcase.tr '-', '_'}"
         | 
| 51 | 
            -
                  end.tap do |hdrs|
         | 
| 52 | 
            -
                    hdrs[HTTP_X_REQUESTID] = request_id
         | 
| 53 | 
            -
                  end
         | 
| 54 | 
            -
                end
         | 
| 55 | 
            -
             | 
| 56 | 
            -
                def content_type
         | 
| 57 | 
            -
                  headers.delete('Content-Type') || headers.delete('content-type') || headers.delete('CONTENT_TYPE')
         | 
| 58 | 
            -
                end
         | 
| 59 | 
            -
             | 
| 60 | 
            -
                def content_length
         | 
| 61 | 
            -
                  bytesize = body.bytesize.to_s if body
         | 
| 62 | 
            -
                  headers.delete('Content-Length') || headers.delete('content-length') || headers.delete('CONTENT_LENGTH') || bytesize
         | 
| 63 | 
            -
                end
         | 
| 64 | 
            -
             | 
| 65 | 
            -
                def body
         | 
| 66 | 
            -
                  @body ||= if event['body'] && base64_encoded?
         | 
| 67 | 
            -
                    Base64.decode64 event['body']
         | 
| 68 | 
            -
                  else
         | 
| 69 | 
            -
                    event['body']
         | 
| 70 | 
            -
                  end
         | 
| 71 | 
            -
                end
         | 
| 72 | 
            -
             | 
| 73 | 
            -
                def headers
         | 
| 74 | 
            -
                  event['headers'] || {}
         | 
| 75 | 
            -
                end
         | 
| 76 | 
            -
             | 
| 77 | 
            -
                def query_string
         | 
| 78 | 
            -
                  @query_string ||= event['queryStringParameters'].try(:to_query)
         | 
| 79 | 
            -
                end
         | 
| 80 | 
            -
             | 
| 81 | 
            -
                def base64_encoded?
         | 
| 82 | 
            -
                  event['isBase64Encoded']
         | 
| 83 | 
            -
                end
         | 
| 84 | 
            -
             | 
| 85 | 
            -
                def server_protocol
         | 
| 86 | 
            -
                  event.dig('requestContext', 'protocol') || 'HTTP/1.1'
         | 
| 87 | 
            -
                end
         | 
| 88 | 
            -
             | 
| 89 | 
            -
                def request_id
         | 
| 90 | 
            -
                  context.aws_request_id
         | 
| 91 | 
            -
                end
         | 
| 92 | 
            -
             | 
| 93 35 | 
             
              end
         | 
| 94 36 | 
             
            end
         | 
| @@ -31,6 +31,9 @@ Resources: | |
| 31 31 | 
             
                DependsOn: RailsFunctionInvokePermission
         | 
| 32 32 | 
             
                Properties:
         | 
| 33 33 | 
             
                  TargetType: lambda
         | 
| 34 | 
            +
                  TargetGroupAttributes:
         | 
| 35 | 
            +
                    - Key: lambda.multi_value_headers.enabled
         | 
| 36 | 
            +
                      Value: true
         | 
| 34 37 | 
             
                  Targets:
         | 
| 35 38 | 
             
                    - Id: !GetAtt RailsFunction.Arn
         | 
| 36 39 |  | 
| @@ -79,7 +82,8 @@ Resources: | |
| 79 82 | 
             
            Outputs:
         | 
| 80 83 |  | 
| 81 84 | 
             
              RailsLoadBalancerDNSNAme:
         | 
| 82 | 
            -
             | 
| 85 | 
            +
                Description: Application Load Balancer DNS Name
         | 
| 86 | 
            +
                Value: !GetAtt RailsLoadBalancer.DNSName
         | 
| 83 87 |  | 
| 84 88 | 
             
              RailsFunctionArn:
         | 
| 85 89 | 
             
                Description: Lambda ARN
         | 
    
        data/lib/lamby/version.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: lamby
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 1.0.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Ken Collins
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: exe
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2019- | 
| 11 | 
            +
            date: 2019-07-08 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: rack
         | 
| @@ -167,6 +167,7 @@ files: | |
| 167 167 | 
             
            - lib/lamby/debug.rb
         | 
| 168 168 | 
             
            - lib/lamby/handler.rb
         | 
| 169 169 | 
             
            - lib/lamby/logger.rb
         | 
| 170 | 
            +
            - lib/lamby/rack.rb
         | 
| 170 171 | 
             
            - lib/lamby/rack_alb.rb
         | 
| 171 172 | 
             
            - lib/lamby/rack_api.rb
         | 
| 172 173 | 
             
            - lib/lamby/railtie.rb
         |