Sha256: 43c11a50b52d93c87270d156725525e780d04d781cb46cbc44b3dc5277b62e35

Contents?: true

Size: 1.61 KB

Versions: 1

Compression:

Stored size: 1.61 KB

Contents

module Circuit
  module Middleware
    # Raise if rewriting fails.
    class RewriteError < CircuitError ; end

    # Rewriter middleware
    # @example Use the middleware (in rackup)
    #   use Rewriter do |script_name, path_info|
    #         ["/pages", script_name+path_info]
    #       end
    # @example Use the middleware with Rack::Request object (in rackup)
    #   use Rewriter do |request|
    #         ["/site/#{request.site.id}"+request.script_name, request.path_info]
    #       end
    # @see http://rubydoc.info/gems/rack/Rack/Request Rack::Request documentation
    class Rewriter
      # @param [#call] app Rack app
      # @yield [script_name, path_info] `SCRIPT_NAME` and `PATH_INF`O values
      # @yield [Request] `Rack::Request` object
      # @yieldreturn [Array<String>] new `script_name` and `path_info`
      def initialize(app, &block)
        @app = app
        @block = block
      end

      # Executes the rewrite
      def call(env)
        begin
          request = ::Rack::Request.new(env)
          script_name, path_info, path = request.script_name, request.path_info, request.path
          env["SCRIPT_NAME"], env["PATH_INFO"] = @block.call(script_name, path_info)
          if script_name != env["SCRIPT_NAME"] or path_info != env["PATH_INFO"]
            ::Circuit.logger.info("[CIRCUIT] Rewriting: '#{path}'->'#{request.path}'")
          end
        rescue RewriteError => ex
          headline = "[CIRCUIT] Rewrite Error"
          ::Circuit.logger.error("%s: %s\n%s  %s"%[headline, ex.message, " "*headline.length, ex.backtrace.first])
        end
        @app.call(env)
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
circuit-0.2.0 lib/circuit/middleware/rewriter.rb