Rails源代码分析(4):Request/Response

本文介绍了Rails中处理HTTP请求和响应的方式,重点讲解了CgiRequest和CgiResponse类的作用及其实现细节,包括会话选项配置和响应输出过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1)Rails定义了两个抽象类:AbstractRequest和AbstractResponse代码不贴了,先看看Response。


2)主要负责ctgi_process.rb具体负责实现主要接口方法的实现
  1.   class CgiRequest < AbstractRequest #:nodoc:
  2.     attr_accessor :cgi:session_options
  3.     class SessionFixationAttempt < StandardError #:nodoc:
  4.     end
  5.     DEFAULT_SESSION_OPTIONS = {
  6.       :database_manager => CGI::Session::CookieStore, # store data in cookie
  7.       :prefix           => "ruby_sess.",    # prefix session file names
  8.       :session_path     => "/",             # available to all paths in app
  9.       :session_key      => "_session_id",
  10.       :cookie_only      => true
  11.     } unless const_defined?(:DEFAULT_SESSION_OPTIONS)
  12.     def initialize(cgi, session_options = {})
  13.       @cgi = cgi
  14.       @session_options = session_options
  15.       @env = @cgi.send!(:env_table)
  16.       super()
  17.     end
  18.     
  19.     。。。。。。。。。。。

  20.   end

  1.   class CgiResponse < AbstractResponse #:nodoc:
  2.     def initialize(cgi)
  3.       @cgi = cgi
  4.       super()
  5.     end
  6.     def out(output = $stdout)
  7.       output.binmode      if output.respond_to?(:binmode)
  8.       output.sync = false if output.respond_to?(:sync=)
  9.       begin
  10.         output.write(@cgi.header(@headers))
  11.         if @cgi.send!(:env_table)['REQUEST_METHOD'] == 'HEAD'
  12.           return
  13.         elsif @body.respond_to?(:call)
  14.           # Flush the output now in case the @body Proc uses
  15.           # #syswrite.
  16.           output.flush if output.respond_to?(:flush)
  17.           @body.call(self, output)
  18.         else
  19.           output.write(@body)
  20.         end
  21.         output.flush if output.respond_to?(:flush)
  22.       rescue Errno::EPIPE, Errno::ECONNRESET
  23.         # lost connection to parent process, ignore output
  24.       end
  25.     end
  26.   end
3) output传入的实际上就是$stdout 是全局定义变量,@controller.process(@request@response).out(@output)

为了具体了解下$stdout,google了相关的东西:
全局变量$stdout,它是所有Kernel方法的输出目的地。该变量被(间接地)初始化为STDOUT的值,因此,所有这些输出都写入到标准输出。随时可对变量$stdout重新赋值,使其指向其他IO对象。
diskfile = File.new("foofile","w")
puts "Hello..."       # prints to stdout
$stdout = diskfile
puts "Goodbye!"       # prints to "foofile"
diskfile.close
$stdout = STDOUT      # reassign to default
puts "That's all."    # prints to stdout











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值