Go to the documentation of this file.00001
00002
00003 #include "ace/INet/HeaderBase.h"
00004 #include "ace/OS_NS_stdlib.h"
00005
00006 #if !defined (__ACE_INLINE__)
00007 #include "ace/INet/HeaderBase.inl"
00008 #endif
00009
00010 #include "ace/INet/INet_Log.h"
00011
00012 ACE_RCSID(NET_CLIENT,ACE_INet_HeaderBase,"$Id: HeaderBase.cpp 90891 2010-06-28 09:55:39Z mcorino $")
00013
00014 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00015
00016 namespace ACE
00017 {
00018 namespace INet
00019 {
00020
00021 const int HeaderBase::UNKNOWN_CONTENT_LENGTH = -1;
00022 const ACE_CString HeaderBase::UNKNOWN_CONTENT_TYPE;
00023 const ACE_CString HeaderBase::CONTENT_LENGTH = "Content-Length";
00024 const ACE_CString HeaderBase::CONTENT_TYPE = "Content-Type";
00025 const ACE_CString HeaderBase::EMPTY;
00026
00027 const int HeaderBase::eof_ = std::char_traits<char>::eof();
00028
00029 HeaderBase::HeaderBase()
00030 {
00031 }
00032
00033 HeaderBase::~HeaderBase()
00034 {
00035 }
00036
00037 void HeaderBase::set_content_length(int length)
00038 {
00039 if (length == UNKNOWN_CONTENT_LENGTH)
00040 {
00041 this->remove (CONTENT_LENGTH);
00042 }
00043 else
00044 {
00045 char buf[32];
00046 this->set (CONTENT_LENGTH,
00047 ACE_OS::itoa (length, buf, 10));
00048 }
00049 }
00050
00051 void HeaderBase::write(std::ostream& str) const
00052 {
00053 TNVMap::ITERATOR it (const_cast<TNVMap&> (this->header_values_));
00054 for (it.first (); !it.done () ;it.advance ())
00055 {
00056 str << (*it).first ().c_str () << ": " << (*it).second ().c_str () << "\r\n";
00057
00058 INET_DEBUG (9, (LM_DEBUG, DLINFO
00059 ACE_TEXT ("ACE_INet_HTTP: +-> %C: %C\n"),
00060 (*it).first ().c_str (),
00061 (*it).second ().c_str ()));
00062 }
00063 }
00064
00065 bool HeaderBase::read(std::istream& str)
00066 {
00067
00068 ACE_CString name (64, '\0');
00069 ACE_CString value (128, '\0');
00070 int ch = str.peek ();
00071 while (ch != eof_ && ch != '\r' && ch != '\n')
00072 {
00073 name.fast_clear ();
00074 value.fast_clear ();
00075
00076 ch = this->read_field (str, name, MAX_NAME_LENGTH, ':');
00077 if (ch == '\n')
00078 {
00079 ch = str.get ();
00080 continue;
00081 }
00082 if (ch != ':')
00083 {
00084 return false;
00085 }
00086
00087
00088 while (ACE_OS::ace_isspace (str.peek ()))
00089 {
00090 ch = str.get ();
00091 }
00092
00093
00094 ch = this->read_field (str, value, MAX_VALUE_LENGTH, '\r');
00095 if (ch == '\r')
00096 ch = str.get ();
00097 if (ch != '\n')
00098 return false;
00099
00100
00101
00102 ch = str.peek ();
00103 while (ch == ' ' || ch == '\t')
00104 {
00105 ch = this->read_field (str, value, MAX_VALUE_LENGTH, '\r');
00106 if (ch == '\r')
00107 ch = str.get ();
00108 if (ch != '\n')
00109 return false;
00110
00111 ch = str.peek ();
00112 }
00113
00114 this->add (name, value);
00115
00116 INET_DEBUG (9, (LM_DEBUG, DLINFO
00117 ACE_TEXT ("ACE_INet_HTTP: <-+ %C: %C\n"),
00118 name.c_str (),
00119 value.c_str ()));
00120 }
00121 return true;
00122 }
00123
00124
00125 void HeaderBase::set (const ACE_CString& name, const ACE_CString& value)
00126 {
00127 TNVMap::ITERATOR it (this->header_values_);
00128 if (this->header_values_.find (NVPair (name), it) == 0)
00129 {
00130 (*it).second (value);
00131 }
00132 else
00133 {
00134 this->header_values_.insert (NVPair (name, value));
00135 }
00136 }
00137
00138 void HeaderBase::get_values(const ACE_CString& name, ACE_Array<ACE_CString> & values) const
00139 {
00140 TNVMap::ITERATOR it (const_cast<TNVMap&> (this->header_values_));
00141 if (this->header_values_.find (name, it) == 0)
00142 {
00143 for (; !it.done () && ((*it).second () == name) ;it.advance ())
00144 {
00145 if (values.size (values.size ()+1) == 0)
00146 {
00147 values.set ((*it).second (), values.size ()-1);
00148 }
00149 }
00150 }
00151 }
00152
00153
00154 NVPair::NVPair () {}
00155
00156 NVPair::NVPair (const ACE_CString& first)
00157 : first_ (first)
00158 {
00159 }
00160
00161 NVPair::NVPair (const ACE_CString& first, const ACE_CString& second)
00162 : first_ (first), second_ (second)
00163 {
00164 }
00165
00166 NVPair::NVPair (const NVPair& pair)
00167 {
00168 *this = pair;
00169 }
00170
00171 NVPair::~NVPair () {}
00172
00173 }
00174 }
00175
00176 ACE_END_VERSIONED_NAMESPACE_DECL