# File webrick/httpresponse.rb, line 29
def initialize(config)
  @config = config
  @buffer_size = config[:OutputBufferSize]
  @logger = config[:Logger]
  @header = Hash.new
  @status = HTTPStatus::RC_OK
  @reason_phrase = nil
  @http_version = HTTPVersion::convert(@config[:HTTPVersion])
  @body = ''
  @keep_alive = true
  @cookies = []
  @request_method = nil
  @request_uri = nil
  @request_http_version = @http_version  # temporary
  @chunked = false
  @filename = nil
  @sent_size = 0
end
             
             
               # File webrick/httpresponse.rb, line 57
def [](field)
  @header[field.downcase]
end
             
             
               # File webrick/httpresponse.rb, line 61
def []=(field, value)
  @header[field.downcase] = value.to_s
end
             
             
               # File webrick/httpresponse.rb, line 91
def chunked=(val)
  @chunked = val ? true : false
end
             
             
               # File webrick/httpresponse.rb, line 65
def content_length
  if len = self['content-length']
    return Integer(len)
  end
end
             
             
               # File webrick/httpresponse.rb, line 71
def content_length=(len)
  self['content-length'] = len.to_s
end
             
             
               # File webrick/httpresponse.rb, line 75
def content_type
  self['content-type']
end
             
             
               # File webrick/httpresponse.rb, line 79
def content_type=(type)
  self['content-type'] = type
end
             
             
               # File webrick/httpresponse.rb, line 83
def each
  @header.each{|k, v|  yield(k, v) }
end
             
             
               # File webrick/httpresponse.rb, line 95
def keep_alive?
  @keep_alive
end
             
             
               # File webrick/httpresponse.rb, line 183
def send_body(socket)
  case @body
  when IO then send_body_io(socket)
  else send_body_string(socket)
  end
end
             
             
               # File webrick/httpresponse.rb, line 168
def send_header(socket)
  if @http_version.major > 0
    data = status_line()
    @header.each{|key, value|
      tmp = key.gsub(/\bwww|^te$|\b\w/){ $&.upcase }
      data << "#{tmp}: #{value}" << CRLF
    }
    @cookies.each{|cookie|
      data << "Set-Cookie: " << cookie.to_s << CRLF
    }
    data << CRLF
    _write_data(socket, data)
  end
end
             
             
               # File webrick/httpresponse.rb, line 99
def send_response(socket)
  begin
    setup_header()
    send_header(socket)
    send_body(socket)
  rescue Errno::EPIPE, Errno::ECONNRESET, Errno::ENOTCONN => ex
    @logger.debug(ex)
    @keep_alive = false
  rescue Exception => ex
    @logger.error(ex)
    @keep_alive = false
  end
end
             
             
               # File webrick/httpresponse.rb, line 202
    def set_error(ex, backtrace=false)
      case ex
      when HTTPStatus::Status 
        @keep_alive = false if HTTPStatus::error?(ex.code)
        self.status = ex.code
      else 
        @keep_alive = false
        self.status = HTTPStatus::RC_INTERNAL_SERVER_ERROR
      end
      @header['content-type'] = "text/html; charset=ISO-8859-1"
      if respond_to?(:create_error_page)
        create_error_page()
        return
      end
      if @request_uri
        host, port = @request_uri.host, @request_uri.port
      else
        host, port = @config[:ServerName], @config[:Port]
      end
      @body = ''
      @body << <<-_end_of_html_
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
<HTML>
  <HEAD><TITLE>#{HTMLUtils::escape(@reason_phrase)}</TITLE></HEAD>
  <BODY>
    <H1>#{HTMLUtils::escape(@reason_phrase)}</H1>
    #{HTMLUtils::escape(ex.message)}
    <HR>
      _end_of_html_
      if backtrace && $DEBUG
        @body << "backtrace of `#{HTMLUtils::escape(ex.class.to_s)}' "
        @body << "#{HTMLUtils::escape(ex.message)}"
        @body << "<PRE>"
        ex.backtrace.each{|line| @body << "\t#{line}\n"}
        @body << "</PRE><HR>"
      end
      @body << <<-_end_of_html_
    <ADDRESS>
     #{HTMLUtils::escape(@config[:ServerSoftware])} at
     #{host}:#{port}
    </ADDRESS>
  </BODY>
</HTML>
      _end_of_html_
    end
             
             
               # File webrick/httpresponse.rb, line 196
def set_redirect(status, url)
  @body = "<HTML><A HREF=\"#{url.to_s}\">#{url.to_s}</A>.</HTML>\n"
  @header['location'] = url.to_s
  raise status
end
             
             
               # File webrick/httpresponse.rb, line 113
def setup_header()
  @reason_phrase    ||= HTTPStatus::reason_phrase(@status)
  @header['server'] ||= @config[:ServerSoftware]
  @header['date']   ||= Time.now.httpdate
  # HTTP/0.9 features
  if @request_http_version < "1.0"
    @http_version = HTTPVersion.new("0.9")
    @keep_alive = false
  end
  # HTTP/1.0 features
  if @request_http_version < "1.1"
    if chunked?
      @chunked = false
      ver = @request_http_version.to_s
      msg = "chunked is set for an HTTP/#{ver} request. (ignored)"
      @logger.warn(msg)
    end
  end
  # Determine the message length (RFC2616 -- 4.4 Message Length)
  if @status == 304 || @status == 204 || HTTPStatus::info?(@status)
    @header.delete('content-length')
    @body = ""
  elsif chunked?
    @header["transfer-encoding"] = "chunked"
    @header.delete('content-length')
  elsif %r{^multipart/byteranges} =~ @header['content-type']
    @header.delete('content-length')
  elsif @header['content-length'].nil?
    unless @body.is_a?(IO)
      @header['content-length'] = @body ? @body.bytesize : 0
    end
  end
  # Keep-Alive connection.
  if @header['connection'] == "close"
     @keep_alive = false
  elsif keep_alive?
    if chunked? || @header['content-length']
      @header['connection'] = "Keep-Alive"
    end
  else
    @header['connection'] = "close"
  end
  # Location is a single absoluteURI.
  if location = @header['location']
    if @request_uri
      @header['location'] = @request_uri.merge(location)
    end
  end
end
             
             
               # File webrick/httpresponse.rb, line 52
def status=(status)
  @status = status
  @reason_phrase = HTTPStatus::reason_phrase(status)
end
             
            Commenting is here to help enhance the documentation. For example, code samples, or clarification of the documentation.
If you have questions about Ruby or the documentation, please post to one of the Ruby mailing lists. You will get better, faster, help that way.
If you wish to post a correction of the docs, please do so, but also file bug report so that it can be corrected for the next release. Thank you.
If you want to help improve the Ruby documentation, please visit Documenting-ruby.org.