Sha256: b0698330fb2dc43be8bb2e07b86ef1c49ab2b3bd6532cb44c11cd24319d5b1c3

Contents?: true

Size: 984 Bytes

Versions: 2

Compression:

Stored size: 984 Bytes

Contents

module Net
  class HTTP
    module Middleware
      class Chain
        attr_accessor :stack

        def initialize(&block)
          @stack = []
          instance_eval(&block) if block_given?
        end

        def use(middleware, *args)
          stack << [middleware, args]
        end

        def call(request, body = nil, &on_finish)
          build_call_chain(stack.dup, on_finish).call(request, body)
        end

        private def build_call_chain(stack, on_finish)
          stack.reverse.reduce(FinalizeMiddleware.new(on_finish)) do |chain, current_middleware|
            klass, args = current_middleware
            klass.new(chain, *args)
          end
        end

        # Final middleware which will execute orig_request
        class FinalizeMiddleware
          def initialize(on_finish)
            @on_finish = on_finish
          end

          def call(_req, _body = nil)
            @on_finish.call
          end
        end
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
net-http-middleware-0.2.0 lib/net/http/middleware/chain.rb
net-http-middleware-0.1.0 lib/net/http/middleware/chain.rb