#
# $Id: httpresponse.icn,v 1.2 2006-07-10 13:43:32 rparlett Exp $
#
# This file is in the public domain.
#
# Author: Robert Parlett (parlett@dial.pipex.com)
#

package http

import util
import lang

#
# This class encapsulates an HTTP response.
#
class HttpResponse : Object(url, status, headers, data, data_file)
   #
   # Set the url
   #
   method set_url(url)
      self.url := url
   end

   #
   # Return the status of the page
   # @return  The status eg "HTTP/1.1 200 OK"
   #
   method get_status()
      return status
   end

   #
   # Set the status
   #
   method set_status(s)
      return status := s
   end

   #
   # Succeed iff the status was an HTTP OK status.
   #
   method status_okay()
      return ::find("200", status)
   end

   #
   # Add a response header with the given key, after any existing ones
   # with the same key
   #
   method add_header(key, val)
      if headers.member(key) then
         ::put(headers.get(key), val)
      else
         headers.insert(key, [val])
   end

   #
   # A convenience function to get the first header matching the given key, or fail
   #
   method get_first_header(key)
      return get_headers(key)[1]
   end

   #
   # Get all the headers for the key, or fail if the key has no headers
   # @return a list of all the headers for the key.  This will always be
   # @       a non-empty list.
   # @fail if no headers for the key have been defined
   #
   method get_headers(key)
      return \headers.get(key)
   end

   #
   # Set the data of the response.
   #
   method set_data(s)
      return data :=s
   end

   #
   # Return the data.
   # @return  A string representing the data (which may be binary data).
   #
   method get_data()
      return data
   end

   #
   # Set the data file for responses that save the data in a file,
   # rather than as part of this object.
   # @param s the filename.
   #
   method set_data_file(s)
      return data_file := s
   end

   #
   # Return the data file for this response, or null if there is no
   # such file.
   # @return The filename
   #
   method get_data_file()
      return data_file
   end

   #
   # Return a list of strings, created by converting the data into a list of
   # newline separated strings.
   # @return   A list of strings.
   #
   method get_string_list()
      local res, s
      res := []
      data ? {
         while s := ::tab(::upto('\n')) do {
            ::put(res, s)
            ::move(1)
         }
         if not(::pos(0)) then
            ::put(res, ::tab(0))
      }
      return res
   end

   initially
      headers := ClTable()
end
