Анализ пары "Заголовок-Значение"
После получения заголовка ALL_HTTP из функции GetServerVariable (см. листинг 5.4) для отображения содержимого в XML необходимо реализовать обработку строки. Заголовки разделяются символами новой строки и возврата каретки. Двоеточие (":") разделяет имя заголовка и его значение. GetHeaderValuePair инициализирует поиск в указанной позиции и возвращает имя и соответствующее ему значение для данного заголовка, а также позицию, в которой прерван поиск заголовков. GetHeaderValuePair единовременно осуществляет поиск одного значения заголовка.
Как видно из листинга 5.6 функция GetHeaderValuePair осуществляет поиск символа ":" в HTTP-заголовке, начиная с позиции nStart в строке sHeader. Значение nStart – это счетчик (начинается с нуля). Если символ ":" не найден, функция завершает работу с возвращением значения "ложь". При обнаружении символа ":" (т.е. заголовок существует) в sHeader продолжается поиск новой строки, начиная с позиции, в которой обнаружен данный символ. При поиске используется функция find строки Standard Template Library (STL) с символом новой строки \n в качестве аргумента и с указанием в качестве начальной позиции символа ":". Позиция новой строки становится конечной позицией, возвращаемой указателем pnEnd, посредством чего вызывающей функции становится известно, в каком месте остановлен поиск. С помощью всех параметров позиции, выявленных в процессе вызовов функции поиска строки sHeader, имя заголовка и значение извлекаются в место расположения памяти, связанное с указателями psName и psValue.
Листинг 5.6. Source Code for Function GetHeaderValuePair (html, txt)
Returns data about the search parameters if found or not. /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ bool GetHeaderValuePair(const string &sHeader, const int &nStart, string *psName, string *psValue, int *pnEnd) { const string sColon(":");
//determine if header is a post header string::size_type idxColonPosition = nStart;
//start looking at beginning idxColonPosition = sHeader.find(sColon, idxColonPosition);
if (idxColonPosition == string::npos)//no more headers found return false;//this is failure
//get the name psName->assign(sHeader.substr (nStart, idxColonPosition - nStart));
//find next newline string::size_type idxNewLine; idxNewLine = sHeader.find('\n', idxColonPosition);
//get the end even if it means not found *pnEnd = idxNewLine;
if (idxNewLine == string::npos) //a newline was not found return true;//not a failure - might be the last header
//get the value //adjust colon position so we do not assign colon in value idxColonPosition = idxColonPosition +1; psValue->assign(sHeader.substr(idxColonPosition, idxNewLine - idxColonPosition));
return true;
Листинг 5.6. Source Code for Function GetHeaderValuePair