首页 > C/C++, 开发 > 分享一段解析HTTP请求消息头的C++代码

分享一段解析HTTP请求消息头的C++代码

2017年10月16日
分类: C/C++, 开发 标签: ,
发表评论 阅读评论

Http请求消息说白了就是\r\n和:分割的一串字符,解析消息头部考察的是基本的字符串操作。当然实际应用中可以使用boost::splitl来辅助处理。

请求消息如下:

GET /suggest?word=http://t.&callback=suggest360&encodein=utf-8&encodeout=utf-8&_h=18.js&outfmt=json HTTP/1.1
Host: sug.so.360.cn:8188
Cache-Control: no-cache
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36 QIHU 360SE
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8
Accept: */*
Cookie: vjuids=a8f919aab.156c5a83b9b.0.3db0cfd7; shenhui12=w:1; gn12=w:1; sci12=w:1; UM_distinctid=15c7168d4207f-083dc20ce-4349052c-100200-15c7168d42346; sohutag=8HsmeSc5NSwmcyc5NSwmYjc5MSwmYSc5NywmZjc5NCwmZyc5NCwmbjc5NjwmaSc5NSwmdyc5NCwmaCc5NCwmYyc5NCwmZSc5NCwmbSc5NCwmdCc5NH0; _muid_=1501816572977065; _ga=GA1.2.1163329499.1503043055; beans_mz_userid=62mbb0GPSAy5; debug_test=sohu_third_cookie; lastpopup=2017-8-19; vjlast=1472194952.1505800087.21; IPLOC=CN1100; SUV=1608221725397504
Range: bytes=17276560-19912545
Referer: http://offp.download.icartoons.cn:8188/client_package/v_4125/7825

解析代码如下:

//存储请求行
string cmdLine="";  
//存储消息头各字段和值
map<string, string> kvs;  

size_t pos=0, posk=0, posv=0;
string k="", v="";
char c;
//http保存了上述GET请求
while(pos != http.size())  
{
    c=http.at(pos);
    if(c == ':')
    {
        //非请求行,且消息头名称未解析
        if(!cmdLine.empty() && k.empty())  
        {
            //存储消息头名称
            k = http.substr(posk, pos-posk);  
            //跳过冒号和空格
            posv = pos+2;  
        }
    }
    //行尾
    else if(c == '\r' || c=='\n')  
    {
        //尚未解析到消息头字段名称,且请求行也未解析过
        if(k.empty() && cmdLine.empty())  
        {
            //本行应是请求行,保存之
            cmdLine = http.substr(posk, pos-posk);  
        }
        else
        {
            //已解析了消息头字段名称,尚未解析字段值
            if(!k.empty() && v.empty())  
            {
                //存储字段值
                v = http.substr(posv, pos-posv);  
            }
        }
        posk=pos+1;
    }

    if(!k.empty() && !v.empty() && !cmdLine.empty())
    {
        //保存消息头字段名称和值
        kvs.insert(make_pair(k,v));  
        k="";
        v="";
    }
    ++pos;
}

需要注意的是:消息头各字段的值中也有可能出现冒号。

小赢理财-众安保险本息保障

零一积流|IT参考 原创文章,转载请注明出处: http://www.it-refer.com/2017/10/16/cplusplus-code-to-parse-http-request-header


您可能需要这些【参考资料】:
  1. 本文目前尚无任何评论.
您必须在 登录 后才能发布评论.