#include <sstream>
#include <string>
#define BUFFER_SIZE 256
const char g_szHeader[] = "HTTP/1.1 200 OK\r\n"
"Connection: Keey-Live\r\n"
"Content-Type: text/xml\r\n\r\n";
// 响应报文头解析
bool HttpRespHeaderPrase(const std::string& strHeader)
{
if ( strHeader.empty() )
{
return false;
}
// 行缓冲区
char szLineBuf[BUFFER_SIZE] = {0};
// 通过流来提取报文头中内容
std::stringstream ssHeader(strHeader.c_str());
// 提取第一行内容
ssHeader.getline(szLineBuf, sizeof(szLineBuf), '\r');
// 获取HTTP版本
char szHttpVersion[BUFFER_SIZE] = {0};
sscanf(szLineBuf, "HTTP/%[^ ]", szHttpVersion);
// 获取状态码
strtok(szLineBuf," ");
int iStatusCode = atoi(strtok(NULL, " "));
// 逐行提取余下的报文参数名值对
std::string strParamName;
std::string strParamValue;
for (;;)
{
// 提取一行内容
ssHeader.getline(szLineBuf, sizeof(szLineBuf), '\r');
// 跳过参数名之前的无效字符
size_t count = strspn(szLineBuf, "\r\n ");
// 有效起始地址
char* start = szLineBuf + count;
// 解析完毕
if ( 0 == strlen(start) )
{
break;
}
// 查找冒号出现的位置
char* p = strchr(start, ':');
if ( p - start > 0 )
{
strParamName.assign(start, p - start);
}
else
{
// 解析出错
return false;
}
// 跳过无效字符
count = strspn(p, ": ");
strParamValue.assign(p + count);
}
return true;
}
int main(int argc, char* argv[])
{
HttpRespHeaderPrase(std::string(g_szHeader));
return 0;
}