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