boost spirit的简单使用

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: 尝试通过cpp-netlib来做http服务器,但是这个库只能简单的解析http结构,像cookie等结构,都要自己解析,了解到spirit可以通过类似bnf范式格式定义字符串格式并解析。 boost本身有个类似的例子,解析的是通过分号或者&符号分割的键值对字符串,并放到对应的map中去。具体代码

尝试通过cpp-netlib来做http服务器,但是这个库只能简单的解析http结构,像cookie等结构,都要自己解析,了解到spirit可以通过类似bnf范式格式定义字符串格式并解析。

boost本身有个类似的例子,解析的是通过分号或者&符号分割的键值对字符串,并放到对应的map中去。具体代码可以参照这里。所以基于这个代码,简单的进行修改之后,就能解析http cookie了。

首先,http cookie的格式,定义在rfc6265上。这里定义了服务器发送给浏览器的Set-Cookie头格式,和浏览器发给服务器的Cookie头的BNF范式。这里定义的太复杂,解析的时候没有考虑到这么多字符(特别是排除一些控制字符),大致的代码:

[cce lang=”cpp”]
namespace parser
{
namespace qi = boost::spirit::qi;
typedef std::map<std::string, std::string> pairs_type;
template <typename Iterator>
struct cooke_sequence : qi::grammar<Iterator, pairs_type()> {
qi::rule<Iterator, pairs_type()> query;
qi::rule<Iterator, std::pair<std::string, std::string>()> pair;
qi::rule<Iterator, std::string()> key, value;
cooke_sequence() : cooke_sequence::base_type(query) {
query = pair >> *(qi::lit(';') >> pair);
pair = *qi::lit(' ') >> key >> *qi::lit(' ') >> -('=' >> *qi::lit(' ') >> value >> *qi::lit(' '));
key = qi::char_("a-zA-Z_%") >> *qi::char_("a-zA-Z_0-9%");
value = +(qi::char_ – ';');
}
};
}
[/cce]


这里简化了key和value,特别是value,只要是非分号的,都能解析到value中。使用也非常简单:

[cce lang=”cpp”]
namespace qi = boost::spirit::qi;
parser::cooke_sequence<std::string::const_iterator> p;
parser::pairs_type value;
if(qi::parse(c.begin(), c.end(), p, value)) {
for(auto &entry : value) {
cookies.insert(std::make_pair(entry.first, entry.second));
}
}
[/cce]


直接实例化cooe_sequence,将cookie字符串传入,就可以解析成map,然后再放入到自己的结构体中。这里直接抄了示例中的代码,所以直接使用了map,一般cookie没必要排序,可以直接使用unordered_map,通过hash表存放。


转载自:https://coolex.info/blog/421.html

目录
相关文章
|
7月前
|
C++ Python
【boost】boost1.71安装以及VS2019调用boost.Python
【boost】boost1.71安装以及VS2019调用boost.Python
|
7月前
|
存储
boost 入门
boost 入门
79 0
|
7月前
|
存储 C++ 容器
boost C++知识点(四)
boost C++知识点(四)
|
7月前
|
存储 安全 C++
boost C++知识点(一)
boost C++知识点(一)
|
7月前
|
存储 Unix Linux
boost C++知识点(六)
boost C++知识点(六)
|
7月前
|
域名解析 网络协议 编译器
boost C++知识点(五)
boost C++知识点(五)
|
7月前
|
算法 C++
boost C++知识点(三)
boost C++知识点(三)
|
容器 编译器 C++
|
存储 自然语言处理 安全