lib/ftw/http/message.rb in ftw-0.0.4 vs lib/ftw/http/message.rb in ftw-0.0.5

- old
+ new

@@ -1,54 +1,68 @@ require "ftw/namespace" require "ftw/http/headers" require "ftw/crlf" # HTTP Message, RFC2616 +# For specification, see RFC2616 section 4: <http://tools.ietf.org/html/rfc2616#section-4> +# +# You probably won't use this class much. Instead, check out {FTW::Request} and {FTW::Response} module FTW::HTTP::Message include FTW::CRLF - # The HTTP headers. See FTW::HTTP::Headers + # The HTTP headers - See {FTW::HTTP::Headers}. # RFC2616 5.3 - <http://tools.ietf.org/html/rfc2616#section-5.3> attr_reader :headers - # The HTTP version. See VALID_VERSIONS for valid versions. + # The HTTP version. See {VALID_VERSIONS} for valid versions. # This will always be a Numeric object. # Both Request and Responses have version, so put it in the parent class. attr_accessor :version + + # HTTP Versions that are valid. VALID_VERSIONS = [1.0, 1.1] - # A new HTTP Message. You probably won't use this class much. - # See RFC2616 section 4: <http://tools.ietf.org/html/rfc2616#section-4> - # See Request and Response. - public + private + + # A new HTTP message. def initialize @headers = FTW::HTTP::Headers.new @body = nil end # def initialize - # get a header value - public - def [](header) + # Get a header value by field name. + # + # @param [String] the name of the field. (case insensitive) + def [](field) return @headers[header] end # def [] - public - def []=(header, value) - @headers[header] = header + # Set a header field + # + # @param [String] the name of the field. (case insensitive) + # @param [String] the value to set for this field + def []=(field, value) + @headers[field] = header end # def []= + # Set the body of this message + # + # The 'message_body' can be an IO-like object, Enumerable, or String. + # # See RFC2616 section 4.3: <http://tools.ietf.org/html/rfc2616#section-4.3> - public def body=(message_body) # TODO(sissel): if message_body is a string, set Content-Length header # TODO(sissel): if it's an IO object, set Transfer-Encoding to chunked # TODO(sissel): if it responds to each or appears to be Enumerable, then # set Transfer-Encoding to chunked. @body = message_body end # def body= - public + # Get the body of this message + # + # Returns an Enumerable, IO-like object, or String, depending on how this + # message was built. def body # TODO(sissel): verification todos follow... # TODO(sissel): RFC2616 section 4.3 - if there is a message body # then one of "Transfer-Encoding" *or* "Content-Length" MUST be present. # otherwise, if neither header is present, no body is present. @@ -56,26 +70,25 @@ # or 304 MUST NOT have a body. All other requests have a message body, # even if that body is of zero length. return @body end # def body - # Does this message have a message body / content? - public + # Should this message have a content? + # + # In HTTP 1.1, there is a body if response sets Content-Length *or* + # Transfer-Encoding, it has a body. Otherwise, there is no body. def content? - # In HTTP 1.1, there is a body if response sets Content-Length *or* - # Transfer-Encoding, it has a body. Otherwise, there is no body. return (headers.include?("Content-Length") and headers["Content-Length"].to_i > 0) \ || headers.include?("Transfer-Encoding") end # def content? - public + # Does this message have a body? def body? return @body.nil? end # def body? # Set the HTTP version. Must be a valid version. See VALID_VERSIONS. - public def version=(ver) # Accept string "1.0" or simply "1", etc. ver = ver.to_f if !ver.is_a?(Float) if !VALID_VERSIONS.include?(ver) @@ -91,10 +104,12 @@ # generic-message = start-line # *(message-header CRLF) # CRLF # [ message-body ] # Thus, the CRLF between header and body is not part of the header. - public def to_s return [start_line, @headers].join(CRLF) end + + public(:initialize, :headers, :version, :version=, :[], :[]=, :body=, :body, + :content?, :body?, :to_s) end # class FTW::HTTP::Message