Sha256: 8aa510ff3fd6ebdd93a6ed2dd261f7ded59a915c86b2fc757d8fac3e124fc5ce

Contents?: true

Size: 1.36 KB

Versions: 4

Compression:

Stored size: 1.36 KB

Contents

require 'rack/auth/basic'
require 'base64'
require 'json'
require 'wisper'

module Routemaster
  class Receiver
    include Wisper::Publisher

    def initialize(app, options = {})
      @app     = app
      @path    = options[:path]
      @uuid    = options[:uuid]

      if options[:handler]
        warn 'the :handler option is deprecated, listen to the :events_received event instead'
        @handler = options[:handler]
      end
    end

    def call(env)
      catch :forward do
        throw :forward unless _intercept_endpoint?(env)
        return [401, {}, []] unless _has_auth?(env)
        return [403, {}, []] unless _valid_auth?(env)
        payload = _extract_payload(env)
        return [400, {}, []] unless payload

        @handler.on_events(payload) if @handler
        publish(:events_received, payload)
        return [204, {}, []]
      end
      @app.call(env)
    end

    private

    def _intercept_endpoint?(env)
      env['PATH_INFO'] == @path && env['REQUEST_METHOD'] == 'POST'
    end

    def _has_auth?(env)
      env.has_key?('HTTP_AUTHORIZATION')
    end

    def _valid_auth?(env)
      Base64.
        decode64(env['HTTP_AUTHORIZATION'].gsub(/^Basic /, '')).
        split(':').first == @uuid
    end

    def _extract_payload(env)
      return unless env['CONTENT_TYPE'] == 'application/json'
      JSON.parse(env['rack.input'].read)
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
routemaster-client-3.0.0 routemaster/receiver.rb
routemaster-client-2.1.0 routemaster/receiver.rb
routemaster-client-2.0.0 routemaster/receiver.rb
routemaster-client-1.3.1 routemaster/receiver.rb