Skip to content

Instantly share code, notes, and snippets.

@tenderlove
Created May 23, 2011 23:55
Show Gist options
  • Save tenderlove/987895 to your computer and use it in GitHub Desktop.
Save tenderlove/987895 to your computer and use it in GitHub Desktop.
class Application
def call(request, response)
response.write(request, "hello", 200, {})
10.times do |body|
response.write(request, body)
end
response.close
end
end
class Filter
def initialize(filter)
@filter = filter
end
def write(request, body, status = nil, headers = nil)
p "FILTERING: #{body}"
@filter.write(request, body, status, headers)
end
def close
@filter.close
end
end
class Context
def initialize(app, filters, callbacks)
@app = app
@callbacks = callbacks
@chain = filters.reverse.inject(self) do |filter, klass|
klass.new(filter)
end
end
def serve(request)
@callbacks.each { |cb| cb.before(request) }
@app.call(request, @chain)
@callbacks.reverse_each { |cb| cb.after(request) }
end
def write(request, body, status, headers)
p "OUTPUTTING #{body}"
end
def close; end
end
class Handler
def before(request)
p "before: hi"
end
def after(request)
p "after: bye"
end
end
ctx = Context.new(Application.new, [Filter, Filter], [Handler.new])
ctx.serve({})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment