読者です 読者をやめる 読者になる 読者になる

Railsで学ぶフレームワーク作り - Dispatcher編 その1

フレームワーク作りの参考にRailsのコードを読んでみる事にしました。
Rails使ってたのは1.0のころなので、もうすっかり忘れてますが。

actionpack/lib/action_controller/dispatcher.rb がいかにもって感じなので、そこから読んでみることに。

確かRailsもRack対応なんですよね、ってことで読んでみるとcallメソッドがありますね。callがRackの入り口ですね。Rackのrequest, response作ってdispatchすると。

    def call(env)
      @request = RackRequest.new(env)
      @response = RackResponse.new(@request)
      dispatch
    end

dispatch部分は、一応マルチスレッド対応のコードがあるようだけど、
ここはパスして、dispatch_unlockedに。

    def dispatch
      if ActionController::Base.allow_concurrency
        dispatch_unlocked
      else
        @@guard.synchronize do
          dispatch_unlocked
        end
      end
    end

dispatch前後にcallbackを用意してますね。何に使うのかはまだわからないですが、これはまたあとで。handle_requestで、request処理をと。

    def dispatch_unlocked
      begin
        run_callbacks :before_dispatch
        handle_request
      rescue Exception => exception
        failsafe_rescue exception
      ensure
        run_callbacks :after_dispatch, :enumerator => :reverse_each
      end
    end

handle_requestを見ると、Routing::RoutesがDispatcherになってるみたいですね。
Routes系っぽく、Controllerを見つけて、見つけたControllerに処理委譲してみたいですね。このRequestがResponseが

    protected
      def handle_request
        @controller = Routing::Routes.recognize(@request)
        @controller.process(@request, @response).out(@output)
      end 

なんだか、HTTP::Engineでそのまま処理できそうな気がしてきますよねー。
では次は、いかにもDispatcherなRouting::Routesみていきます。
これがHTTP::Routerが参考にしてるDispatcherってことでしょうね、多分。