    from Common import *

    class Message(Object):
        """
        Message is the abstract, parent class for both Request and Response, and implements the behavior that is generic to both.

        Messages have:

            * A set of arguments.
            * A protocol.
            * A content type and length.

        FUTURE
            * Support for different types of encodings
        """

        ## Init ##

        def __init__(self):
            Object.__init__(self)
            self._args = {}

        ## Content ##

        def contentLength(self):
            """ Returns the length of the message body or -1 if not known. """
            return -1

        def contentType(self):
            """ Returns the MIME type of the message body or None if not known. """
            return None

        ## Protocol ##

        def protocol(self):
            """ Returns the name and version of the protocol the message uses in the form protocol/majorVersion.minorVersion, for example, HTTP/1.1. """
            # @@ 2000-04-09 ce: Move this down into HTTPSomething subclasses
            return 'HTTP/1.0'

        ## Arguments ##

        # @@ 2000-05-10 ce: Are arguments really used for anything?

        def arg(self, name, default=NoDefault):
            if default is NoDefault:
                return self._args[name]
            else:
                return self._args.get(name, default)

        def setArg(self, name, value):
            self._args[name] = value

        def hasArg(self, name):
            return self._args.has_key(name)

        def deleteArg(self, name):
            del self._args[name]

        def clearArgs(self):
            self._args.clear()

        def argNames(self):
            """ Returns a list of argument names. """
            return self._args.keys()

        ## Exception reports ##

        exceptionReportAttrNames = ['args']

        def writeExceptionReport(self, handler):
            handler.writeTitle(self.__class__.__name__)
            handler.writeAttrs(self, self.exceptionReportAttrNames)