トップ «前の日記(2005-02-17) 最新 次の日記(2005-02-20)» 編集

3 日坊主日記


2005-02-19 [長年日記]

_ [Delphi] Delphi 2005(2)

届きました。やけに大きな箱やなー。3.1のときみたいに本が入ってたらうれしいけどなあ。開けてみると、案の定、過剰包装でした。

くしゃくしゃの模造紙が占拠する中、製品は底のはしに置いてあり、衝撃は全く緩和されなさそうな配置です。

パッケージも、かっこいいのは認めてもいいけど、過剰です。

これはうちのノートでは動きそうもないので、会社で試そう。

_ [Rails] session_id を Cookie ではなく query parameter として渡す

Rails の session は CGI::Cookie を用いるため、i-mode など Cookie が使えない端末では session が維持されません。 session_id を Cookie ではなく query parameter として渡せば、Cookie がなくても session を使えるだろう、ということで試してみました。

Routes によりもっと良い方法が使えるようになると思いますが、とりあえず現状で試してうまくいった方法を紹介します。

注意: 認証に session を用いるなら、外部への referer に session_id を残さないように構築してください。


Controller で、次のように default_url_options を書き換える。

 def default_url_options(options)
   { :action_prefix => @session.session_id }
 end

これにより、url_for が作る URL に session_id が付加される。

url_for は form_tag, link_to などの helper メソッドが URL を作る際に使われるので、 helper メソッドが作る URL には session_id が付加されることになる。

あとは、これに合わせて dispatch と Rewrite ルールを修正すればよい。 以下の例では、i_controller (controller_name = 'i') のとき session_id を query parameter で渡すようにした。

  • dispatch.rb.patch:
 --- ..\rubima\public\dispatch.rb	2005-02-02 20:02:41.171699200 +0900
 +++ public\dispatch.rb	2005-02-19 17:34:29.659251200 +0900
 @@ -7,4 +7,11 @@
  require "dispatcher"

  ADDITIONAL_LOAD_PATHS.reverse.each { |dir| $:.unshift(dir) if File.directory?(dir) } if defined?(Apache::RubyRun)
 -Dispatcher.dispatch
 \ No newline at end of file
 +cgi = CGI.new
 +params_controller = cgi.params["controller"]
 +if params_controller && params_controller[0] == 'i'
 +  params_session_id = cgi.params["session_id"]
 +  Dispatcher.dispatch cgi, :session_id => params_session_id ? params_session_id[0] : nil
 +else
 +  Dispatcher.dispatch cgi
 +end
  • dot.htaccess.patch:
 --- ..\rubima\public\.htaccess	2005-02-19 16:49:45.659849600 +0900
 +++ public\.htaccess	2005-02-19 05:09:16.940004800 +0900
 @@ -47,6 +47,11 @@
  # Add missing slash
  RewriteRule ^([-_a-zA-Z0-9]+)$                                            /$1/ [R]

 +# for mobile
 +RewriteRule ^i/([a-f0-9]{32})/([-_a-zA-Z0-9]+)/([0-9]+)$                  ?session_id=$1&controller=i&action=$2&id=$3 [QSA,L]
 +RewriteRule ^i/([a-f0-9]{32})/([-_a-zA-Z0-9]+)$                           ?session_id=$1&controller=i&action=$2 [QSA,L]
 +RewriteRule ^i/([a-f0-9]{32})/$                                           ?session_id=$1&controller=i&action=index [QSA,L]
 +
  # Default rewriting rules.
  RewriteRule ^([-_a-zA-Z0-9]+)/([-_a-zA-Z0-9]+)/([0-9]+)$                  ?controller=$1&action=$2&id=$3 [QSA,L]
  RewriteRule ^([-_a-zA-Z0-9]+)/([-_a-zA-Z0-9]+)$                           ?controller=$1&action=$2 [QSA,L]

script/server に対しては、Rails の lib/webrick_server.rb を vendor/ に cp して、次のように書き換えればよい。

  • webrick_server.rb.patch:
 --- c:\usr\lib\ruby\gems\1.8\gems\rails-0.9.5\lib\webrick_server.rb	2005-01-28 00:25:17.376188800 +0900
 +++ vendor\webrick_server.rb	2005-02-19 16:48:15.580321600 +0900
 @@ -1,5 +1,5 @@
  # Donated by Florian Gross
 -
 +puts "loading vendor webrick_server."
  require 'webrick'
  require 'cgi'
  require 'stringio'
 @@ -123,8 +123,16 @@

    def self.parse_uri(path)
      component, id = /([-_a-zA-Z0-9]+)/, /([0-9]+)/
 +    session_id = /([a-f0-9]{32})/

      case path.sub(%r{^/(?:fcgi|mruby|cgi)/}, "/")
 +      when %r{^/i/#{session_id}$} then
 +        { :session_id => $1, :controller => 'i', :action => "index" }
 +      when %r{^/i/#{session_id}/#{component}$} then
 +        { :session_id => $1, :controller => 'i', :action => $2 }
 +      when %r{^/i/#{session_id}/#{component}/#{id}$} then
 +        { :session_id => $1, :controller => 'i', :action => $2, :id => $3 }
 +
        when %r{^/#{component}/?$} then
          { :controller => $1, :action => "index" }
        when %r{^/#{component}/#{component}$} then

そして、vendor/webrick_server.rb を使うように script/server を修正する。

  • script-server.patch:
 --- ..\rubima\script\server	2005-02-02 20:02:41.251814400 +0900
 +++ script\server	2005-02-19 04:58:24.662075200 +0900
 @@ -43,7 +43,7 @@

  ENV["RAILS_ENV"] = OPTIONS[:environment]
  require File.dirname(__FILE__) + "/../config/environment"
 -require 'webrick_server'
 +require File.dirname(__FILE__) + '/../vendor/webrick_server'

  puts "=> Rails application started on http://#{OPTIONS[:ip]}:#{OPTIONS[:port]}"
  DispatchServlet.dispatch(OPTIONS)
 \ No newline at end of file
[]