# 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 35
    def initialize(app)
      @app = app
    end

### Public Instance Methods

_call(env) click to toggle source

    # File lib/rack/recursive.rb, line 43
    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 39
    def call(env)
      dup._call(env)
    end

include(env, path) click to toggle source

    # File lib/rack/recursive.rb, line 50
    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