class Rack::Recursive - rack-1.6.4 Documentation

# class Rack::Recursive

Rack::Recursive allows applications called down the chain to include data from other applications (by using `rack['rack.recursive.include'][...]` or raise a ForwardRequest to redirect internally.

### Public Class Methods

new(app) click to toggle source

    # File lib/rack/recursive.rb, line 33
    def initialize(app)
      @app = app
    end

### Public Instance Methods

_call(env) click to toggle source

    # File lib/rack/recursive.rb, line 41
    def _call(env)
      @script_name = env[SCRIPT_NAME]
      @app.call(env.merge('rack.recursive.include' => method(:include)))
    rescue ForwardRequest => req
      call(env.merge(req.env))
    end

call(env) click to toggle source

    # File lib/rack/recursive.rb, line 37
    def call(env)
      dup._call(env)
    end

include(env, path) click to toggle source

    # File lib/rack/recursive.rb, line 48
    def include(env, path)
      unless path.index(@script_name) == 0 && (path[@script_name.size] == ?/ ||
                                               path[@script_name.size].nil?)
        raise ArgumentError, "can only include below #{@script_name}, not #{path}"
      end

      env = env.merge(PATH_INFO => path,
                      SCRIPT_NAME => @script_name,
                      REQUEST_METHOD => "GET",
                      "CONTENT_LENGTH" => "0", "CONTENT_TYPE" => "",
                      "rack.input" => StringIO.new(""))
      @app.call(env)
    end