1)Rails定义了两个抽象类:AbstractRequest和AbstractResponse代码不贴了,先看看Response。
3) output传入的实际上就是$stdout 是全局定义变量,@controller.process(@request, @response).out(@output)
2)主要负责ctgi_process.rb具体负责实现主要接口方法的实现
- class CgiRequest < AbstractRequest #:nodoc:
- attr_accessor :cgi, :session_options
- class SessionFixationAttempt < StandardError #:nodoc:
- end
- DEFAULT_SESSION_OPTIONS = {
- :database_manager => CGI::Session::CookieStore, # store data in cookie
- :prefix => "ruby_sess.", # prefix session file names
- :session_path => "/", # available to all paths in app
- :session_key => "_session_id",
- :cookie_only => true
- } unless const_defined?(:DEFAULT_SESSION_OPTIONS)
- def initialize(cgi, session_options = {})
- @cgi = cgi
- @session_options = session_options
- @env = @cgi.send!(:env_table)
- super()
- end
- 。。。。。。。。。。。
- end
- class CgiResponse < AbstractResponse #:nodoc:
- def initialize(cgi)
- @cgi = cgi
- super()
- end
- def out(output = $stdout)
- output.binmode if output.respond_to?(:binmode)
- output.sync = false if output.respond_to?(:sync=)
- begin
- output.write(@cgi.header(@headers))
- if @cgi.send!(:env_table)['REQUEST_METHOD'] == 'HEAD'
- return
- elsif @body.respond_to?(:call)
- # Flush the output now in case the @body Proc uses
- # #syswrite.
- output.flush if output.respond_to?(:flush)
- @body.call(self, output)
- else
- output.write(@body)
- end
- output.flush if output.respond_to?(:flush)
- rescue Errno::EPIPE, Errno::ECONNRESET
- # lost connection to parent process, ignore output
- end
- end
- end
为了具体了解下$stdout,google了相关的东西:
全局变量$stdout,它是所有Kernel方法的输出目的地。该变量被(间接地)初始化为STDOUT的值,因此,所有这些输出都写入到标准输出。随时可对变量$stdout重新赋值,使其指向其他IO对象。
diskfile = File.new("foofile","w") |