Public Member Functions | Static Public Attributes | Protected Member Functions | Static Protected Attributes | Private Types | Private Attributes

ACE::INet::HeaderBase Class Reference

#include <HeaderBase.h>

Inheritance diagram for ACE::INet::HeaderBase:
Inheritance graph
[legend]
Collaboration diagram for ACE::INet::HeaderBase:
Collaboration graph
[legend]

List of all members.

Public Member Functions

 HeaderBase ()
 Constructor.
virtual ~HeaderBase ()
 Destructor.
virtual void set_content_length (int length)
virtual int get_content_length () const
virtual void set_content_type (const ACE_CString &mime_type)
virtual ACE_CString get_content_type () const
void clear ()
virtual void write (std::ostream &str) const
 Writes the headers to the given stream.
virtual bool read (std::istream &str)
void set (const ACE_CString &name, const ACE_CString &value)
 Sets header <name> to . Overwrites existing vaues.
void add (const ACE_CString &name, const ACE_CString &value)
 Adds header <name> with . Allows duplicates.
void remove (const ACE_CString &name)
 Removes header <name> (first found).
bool get (const ACE_CString &name, ACE_CString &value) const
 Retrieves value for header <name> into (first found).
bool has (const ACE_CString &name) const
 Returns true if a header <name> exists (1 or more), false otherwise.
void get_values (const ACE_CString &name, ACE_Array< ACE_CString > &values) const
 Retrieves values for all headers <name> into <values>.

Static Public Attributes

static const int UNKNOWN_CONTENT_LENGTH = -1
static const ACE_CString UNKNOWN_CONTENT_TYPE
static const ACE_CString CONTENT_LENGTH = "Content-Length"
static const ACE_CString CONTENT_TYPE = "Content-Type"
static const ACE_CString EMPTY

Protected Member Functions

int read_field (std::istream &str, ACE_CString &var, size_t maxlen, char delim)
int read_ws_field (std::istream &str, ACE_CString &var, size_t maxlen)

Static Protected Attributes

static const int eof_ = std::char_traits<char>::eof()

Private Types

enum  Limits { MAX_NAME_LENGTH = 256, MAX_VALUE_LENGTH = 4096 }
 

Limits for reading a header.

More...

Private Attributes

TNVMap header_values_

Detailed Description

Definition at line 73 of file HeaderBase.h.


Member Enumeration Documentation

Limits for reading a header.

Enumerator:
MAX_NAME_LENGTH 
MAX_VALUE_LENGTH 

Reimplemented in ACE::HTTP::Request, and ACE::HTTP::Response.

Definition at line 145 of file HeaderBase.h.

                {
                  MAX_NAME_LENGTH  = 256,
                  MAX_VALUE_LENGTH = 4096
                };


Constructor & Destructor Documentation

ACE::INet::HeaderBase::HeaderBase (  ) 

Constructor.

Definition at line 29 of file HeaderBase.cpp.

      {
      }

ACE::INet::HeaderBase::~HeaderBase (  )  [virtual]

Destructor.

Definition at line 33 of file HeaderBase.cpp.

      {
      }


Member Function Documentation

void ACE::INet::HeaderBase::add ( const ACE_CString name,
const ACE_CString value 
) [inline]

Adds header <name> with . Allows duplicates.

Definition at line 51 of file HeaderBase.inl.

      {
        this->header_values_.insert (NVPair (name, value));
      }

void ACE::INet::HeaderBase::clear ( void   )  [inline]

Definition at line 45 of file HeaderBase.inl.

      {
        this->header_values_.reset ();
      }

bool ACE::INet::HeaderBase::get ( const ACE_CString name,
ACE_CString value 
) const [inline]

Retrieves value for header <name> into (first found).

Definition at line 63 of file HeaderBase.inl.

      {
        TNVMap::ITERATOR it (const_cast<TNVMap&> (this->header_values_));
        if (this->header_values_.find (NVPair (name), it) == 0)
          {
            value = (*it).second ();
            return true;
          }
        return false;
      }

int ACE::INet::HeaderBase::get_content_length (  )  const [inline, virtual]

Returns the content length for this message. Returns UNKNOWN_CONTENT_LENGTH if no Content-Length header is present.

Definition at line 13 of file HeaderBase.inl.

      {
        ACE_CString lenstr;
        if (this->get (CONTENT_LENGTH, lenstr))
          {
            return ACE_OS::atoi (lenstr.c_str ());
          }
        return UNKNOWN_CONTENT_LENGTH;
      }

ACE_CString ACE::INet::HeaderBase::get_content_type (  )  const [inline, virtual]

Returns the content type for this message. Returns UNKNOWN_CONTENT_TYPE if no Content-Type header is present.

Definition at line 37 of file HeaderBase.inl.

      {
        ACE_CString val = UNKNOWN_CONTENT_TYPE;
        this->get (CONTENT_TYPE, val);
        return val;
      }

void ACE::INet::HeaderBase::get_values ( const ACE_CString name,
ACE_Array< ACE_CString > &  values 
) const

Retrieves values for all headers <name> into <values>.

Definition at line 138 of file HeaderBase.cpp.

      {
        TNVMap::ITERATOR it (const_cast<TNVMap&> (this->header_values_));
        if (this->header_values_.find (name, it) == 0)
          {
            for (; !it.done () && ((*it).second () == name) ;it.advance ())
              {
                if (values.size (values.size ()+1) == 0)
                  {
                    values.set ((*it).second (), values.size ()-1);
                  }
              }
          }
      }

bool ACE::INet::HeaderBase::has ( const ACE_CString name  )  const [inline]

Returns true if a header <name> exists (1 or more), false otherwise.

Definition at line 75 of file HeaderBase.inl.

      {
        TNVMap::ITERATOR it (const_cast<TNVMap&> (this->header_values_));
        if (this->header_values_.find (NVPair (name), it) == 0)
          {
            return true;
          }
        return false;
      }

bool ACE::INet::HeaderBase::read ( std::istream &  str  )  [virtual]

Reads the headers from the given stream.

Reimplemented in ACE::HTTP::Request, and ACE::HTTP::Response.

Definition at line 65 of file HeaderBase.cpp.

      {

        ACE_CString name (64, '\0');
        ACE_CString value (128, '\0');
        int ch = str.peek ();
        while (ch != eof_ && ch != '\r' && ch != '\n')
          {
            name.fast_clear ();
            value.fast_clear ();
            // parse name
            ch = this->read_field (str, name, MAX_NAME_LENGTH, ':');
            if (ch == '\n')
              {
                ch = str.get ();
                continue; // ignore invalid headers
              }
            if (ch != ':')
              {
                return false; // name too long/missing colon; cannot continue
              }

            // skip leading whitespace before next field
            while (ACE_OS::ace_isspace (str.peek ()))
              {
                ch = str.get ();
              }

            // parse value
            ch = this->read_field (str, value, MAX_VALUE_LENGTH, '\r');
            if (ch == '\r')
              ch = str.get (); // get lf
            if (ch != '\n')
              return false; // value too long/no crlf found; cannot continue

            // followup lines starting with ws are continuations of the value
            // and must be appended
            ch = str.peek ();
            while (ch == ' ' || ch == '\t')
            {
              ch = this->read_field (str, value, MAX_VALUE_LENGTH, '\r');
              if (ch == '\r')
                ch = str.get (); // get lf
              if (ch != '\n')
                return false; // multiline value too long/no crlf; cannot continue

              ch = str.peek ();
            }

            this->add (name, value);

            INET_DEBUG (9, (LM_DEBUG, DLINFO
                            ACE_TEXT ("ACE_INet_HTTP: <-+ %C: %C\n"),
                            name.c_str (),
                            value.c_str ()));
          }
        return true;
      }

int ACE::INet::HeaderBase::read_field ( std::istream &  str,
ACE_CString var,
size_t  maxlen,
char  delim 
) [inline, protected]

Definition at line 86 of file HeaderBase.inl.

      {
        int ch = str.get ();
        while (ch != eof_ && ch != delim && ch != '\n' && var.length () < maxlen)
          {
            var += ch;
            ch = str.get ();
          }
        return ch;
      }

int ACE::INet::HeaderBase::read_ws_field ( std::istream &  str,
ACE_CString var,
size_t  maxlen 
) [inline, protected]

Definition at line 98 of file HeaderBase.inl.

      {
        int ch = str.get ();
        while (!ACE_OS::ace_isspace (ch) && ch != eof_ && var.length () < maxlen)
          {
            var += ch;
            ch = str.get ();
          }
        return ch;
      }

void ACE::INet::HeaderBase::remove ( const ACE_CString name  )  [inline]

Removes header <name> (first found).

Definition at line 57 of file HeaderBase.inl.

      {
        this->header_values_.remove (NVPair (name, EMPTY));
      }

void ACE::INet::HeaderBase::set ( const ACE_CString name,
const ACE_CString value 
)

Sets header <name> to . Overwrites existing vaues.

Definition at line 125 of file HeaderBase.cpp.

      {
        TNVMap::ITERATOR it (this->header_values_);
        if (this->header_values_.find (NVPair (name), it) == 0)
          {
            (*it).second (value);
          }
        else
          {
            this->header_values_.insert (NVPair (name, value));
          }
      }

void ACE::INet::HeaderBase::set_content_length ( int  length  )  [virtual]

Sets the Content-Length header. Removes the Content-Length header if length is UNKNOWN_CONTENT_LENGTH.

Definition at line 37 of file HeaderBase.cpp.

      {
        if (length == UNKNOWN_CONTENT_LENGTH)
          {
            this->remove (CONTENT_LENGTH);
          }
        else
          {
            char buf[32];
            this->set (CONTENT_LENGTH,
                       ACE_OS::itoa (length, buf, 10));
          }
      }

void ACE::INet::HeaderBase::set_content_type ( const ACE_CString mime_type  )  [inline, virtual]

Sets the content type for this message. Removes the Content-Type header if UNKNOWN_CONTENT_TYPE is specified.

Definition at line 24 of file HeaderBase.inl.

      {
        if (mime_type == UNKNOWN_CONTENT_TYPE)
          {
            this->remove (CONTENT_TYPE);
          }
        else
          {
            this->set (CONTENT_TYPE, UNKNOWN_CONTENT_TYPE);
          }
      }

void ACE::INet::HeaderBase::write ( std::ostream &  str  )  const [virtual]

Writes the headers to the given stream.

Reimplemented in ACE::HTTP::Request, and ACE::HTTP::Response.

Definition at line 51 of file HeaderBase.cpp.

      {
        TNVMap::ITERATOR it (const_cast<TNVMap&> (this->header_values_));
        for (it.first (); !it.done () ;it.advance ())
        {
          str << (*it).first ().c_str () << ": " << (*it).second ().c_str () << "\r\n";

          INET_DEBUG (9, (LM_DEBUG, DLINFO
                          ACE_TEXT ("ACE_INet_HTTP: +-> %C: %C\n"),
                          (*it).first ().c_str (),
                          (*it).second ().c_str ()));
        }
      }


Member Data Documentation

const ACE_CString ACE::INet::HeaderBase::CONTENT_LENGTH = "Content-Length" [static]

Definition at line 114 of file HeaderBase.h.

const ACE_CString ACE::INet::HeaderBase::CONTENT_TYPE = "Content-Type" [static]

Definition at line 115 of file HeaderBase.h.

Definition at line 117 of file HeaderBase.h.

const int ACE::INet::HeaderBase::eof_ = std::char_traits<char>::eof() [static, protected]

Definition at line 141 of file HeaderBase.h.

Definition at line 151 of file HeaderBase.h.

Definition at line 111 of file HeaderBase.h.

Definition at line 112 of file HeaderBase.h.


The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines