from Common import *
from Message import Message
from time import asctime, localtime


class Request(Message):
    """
    Request is a type of Message that offers the following:

        * A time stamp (indicating when the request was made)
        * An input stream. @@ 2000-04-30 ce: resolve this
        * Remote request information (address, name)
        * Local host information (address, name, port)
        * A security indicator

    Request is an abstract class; developers typically use HTTPRequest.

    FUTURE
        * Consider if the local host information should be moved up to Message.
        * Locales
        * Secure requests, authentication, etc.
    """

    ## Init ##
    
    def __init__(self):
        """ Subclasses are responsible for invoking super and initializing self._time. """
        Message.__init__(self)


    ## Access ##
    
    def time(self):
        return self._time
    
    def timeStamp(self):
        """ Returns time() as a human readable string, useful for logging and debugging. """
        return asctime(localtime(self.time()))


    ## Input ##

    def input(self):
        """ Returns a file-style object that the contents can be read from.
            # @@ 2000-05-03 ce: This is bogus. Disregard for now."""
        pass


    ## Remote info ##

    # @@ 2000-05-07 ce: Do remoteAddress() and remoteName() have to be implemented here or should it be a subclass responsibility?          
    
    def remoteAddress(self):
        """ Returns a string containing the Internet Protocol (IP) address of the client that sent the request. """
        raise NotImplementedError
    
    def remoteName(self):
        """ Returns the fully qualified name of the client that sent the request, or the IP address of the client if the name cannot be determined. """
        raise NotImplementedError

    
    ## Local info ##
        
    def localAddress(self):
        """ Returns a string containing the Internet Protocol (IP) address of the local host (e.g., the server) that received the request. """
        raise NotImplementedError
    
    def localName(self):
        """ Returns the fully qualified name of the local host (e.g., the server) that received the request. """
        return 'localhost'
    
    def localPort(self):
        """ Returns the port of the local host (e.g., the server) that received the request. """
        raise NotImplementedError


    ## Security ##
    
    def isSecure(self):
        """ Returns true if request was made using a secure channel, such as HTTPS. This currently always returns false, since secure channels are not yet supported. """
        return 0

    ## Cleanup ##
    def clearTransaction(self):
        del self._transaction