Sha256: 337a428c1d479d95ce2bb605524558a23635f34070d4d00a68004f00674b1e17

Contents?: true

Size: 1.34 KB

Versions: 7

Compression:

Stored size: 1.34 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)
        return [400, {}, []] unless payload = _extract_payload(env)

        @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

7 entries across 7 versions & 1 rubygems

Version Path
routemaster-client-1.2.3 routemaster/receiver.rb
routemaster-client-1.2.2 routemaster/receiver.rb
routemaster-client-1.2.1 routemaster/receiver.rb
routemaster-client-1.2.0 routemaster/receiver.rb
routemaster-client-1.1.0 routemaster/receiver.rb
routemaster-client-1.0.0 routemaster/receiver.rb
routemaster-client-0.0.3 routemaster/receiver.rb