Class: AppEngine::Rack::DeferredDispatcher

Inherits:
Object
  • Object
show all
Defined in:
lib/appengine-rack.rb

Overview

Split loading requests into 3 parts

deferred_dispatcher = AppEngine::Rack::DeferredDispatcher.new(

:require => File.expand_path('../config/environment', __FILE__),
:dispatch => 'ActionController::Dispatcher')

map ‘/admin’ do

use AppEngine::Rack::AdminRequired
run deferred_dispatcher

end

map ‘/’ do

use AppEngine::Rack::LoginRequired
run deferred_dispatcher

end

Instance Method Summary collapse

Constructor Details

#initialize(args) ⇒ DeferredDispatcher

Returns a new instance of DeferredDispatcher.



128
129
130
# File 'lib/appengine-rack.rb', line 128

def initialize args
  @args = args
end

Instance Method Details

#call(env) ⇒ Object



132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
# File 'lib/appengine-rack.rb', line 132

def call env
  if @runtime.nil?
    @runtime = true
    # 1: redirect with runtime and jruby-rack loaded
    redirect_or_error(env)
  elsif @rack_app.nil?
    require @args[:require]
    @rack_app = Object.module_eval(@args[:dispatch]).new
    # 2: redirect with framework required & dispatched
    redirect_or_error(env)
  else
    # 3: process all other requests
    @rack_app.call(env)
  end
end

#redirect_or_error(env) ⇒ Object



148
149
150
151
152
153
154
155
156
157
158
# File 'lib/appengine-rack.rb', line 148

def redirect_or_error(env)
  if env['REQUEST_METHOD'].eql?('GET')
    redir_url = env['REQUEST_URI'] +
        (env['QUERY_STRING'].eql?('') ? '?' : '&') + Time.now.to_i.to_s
    res = ::Rack::Response.new('*', 302)
    res['Location'] = redir_url
    res.finish
  else
    ::Rack::Response.new('Service Unavailable', 503).finish
  end
end