What have you found for these years?

2009-12-09

Rails middleware

目前要試的是 hack rails session id, 跑:
~/p/r/photo *master> rake middleware
可以看出 2.3.5 確實是 rack based
(in /Users/godfat/project/roodo/photo)
use Rack::Lock
use ActionController::Failsafe
use ActionController::Session::MemCacheStore,
#<Proc:0x00000100e81e38@(eval):8 (lambda)>
use Rack::Facebook
use ActionController::ParamsParser
use Rack::MethodOverride
use Rack::Head
use ActionController::StringCoercion
use ActiveRecord::ConnectionAdapters::ConnectionManagement
use ActiveRecord::QueryCache
run ActionController::Dispatcher.new
(可是不要把 config.ru 藏起來好嗎?)
另一方面,調查:
actionpack-2.3.5/lib/action_controller/middlewares.rb
可以看到其實他是用特製的 application builder...
是 ActionController::MiddlewareStack::Middleware
actionpack-2.3.5/lib/action_controller/middleware_stack.rb
可以看出來他的 use 的用法變化之多,弄得非常複雜,
能吃 String, Class, 或 Proc (lambda)
這個 Middleware 也不是真的 Middleware,
他是 Middleware builder, call Middleware#build
才會產生真正的 middleware.
Middleware#klass 也跟 Middleware#@klass 完全不同...
Middleware#klass 會檢查 @klass 的型別,
而這個 #klass 來自外面的 use 的第一個 argument,
也就是 String, Class, or Proc.
但 Middleware#initialize 時又會把 @klass 洗掉......

超混亂的啦!
@klass 可能是 klass 也可能不是,不同時機下會不同。
在 initialize 之前可能不是,在之後則因為 initialize 而會是。
(這應該切成兩個 method 吧?共用很混亂)
Middleware.new 也被改寫,如果是自己則 do nothing,
不是自己則 allocate + initialize

其實這已經比之前的好了...
rails 之前其他程式更恐怖,這已經算單純的了。
我覺得 datamapper 用 assert_kind_of 還是比較好...
用錯了的話一下就知道了,而不是搞半天發現不知道到底哪個用法才是對的。

接下來可以看怎麼改 session id 了...

0 retries:

Post a Comment

All texts are licensed under CC Attribution 3.0