您当前的位置: 首页 >  http

qianbo_insist

暂无认证

  • 1浏览

    0关注

    399博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

解析http头部和c++string的高级使用技巧

qianbo_insist 发布时间:2021-06-19 16:31:43 ,浏览量:1

需求

需求是解析upnp协议中的http 协议 和xml 中取得响应的内容,使用c++字符串的高级特性和http协议“\r\n”的特性匹配,使用std::istringstream来获取string 类中的每一行,分而治之,对每一行字符串再进行分解,达到我们解析头部的目的,事实上,没有完美无缺的技术,各个协议都是用的组合拳,把各类协议组合而得到一个完整的解决方案,upnp协议就是组播协议套上使用http 和 xml 以及soap 等来完成发现和控制。

http协议头部示例

HTTP/1.1 200 OK CACHE-CONTROL: max-age=300 DATE: Sat, 19 Jun 2021 08:10:55 GMT EXT: LOCATION: http://192.168.0.104:25826/description.xml OPT: “http://schemas.upnp.org/upnp/1/0/”; ns=0101-NLS: 1d14711e-d0b3-11eb-ba82-84a8e6833d02 SERVER: Linux/4.9.44_s5, UPnP/1.0, Portable SDK for UPnP devices/1.6.19 X-User-Agent: redsonic ST: urn:schemas-upnp-org:device:MediaRenderer:1 USN: uuid:bb5e-21ce-1111-11b2-f918-ec9c-3235-709a-::urn:schemas-upnp-org:device:MediaRenderer:1

我们需要拿到http 的版本和返回状态如 200 和 reason like “ok” 同时解析里面的每条内容,拿到每个header 的头部 行成 map的结构返回

定义数据结构
typedef struct s_res
{
	string httpver;
	int status;
	string reason;
}s_res;

事实上,对于以下 //GET /live/1001 HTTP/1.1 //HTTP/1.1 200 OK //POST /live/1001 HTTP/1.1 等我们都可以使用这种方法

下面开始解析,流程是

1 解析是否有HTTP 头部四字节

2 如果有,拿到HTTP头部后的返回状态status 和 reason

3 解析剩下的每一行,每一行都是 x :y 的结构,放入map

static s_res fetch_head_info(std::string &lines, map &hmap)
{
	s_res res = {"",-1,""};
	if (strncmp(lines.c_str(), "HTTP", 4) != 0)
	{
		//not support now
		return res;
	}
	std::istringstream s(lines);
	std::string request;
	std::getline(s, request);
	if (request[request.size() - 1] == '\r')
	{
		request.pop_back();
		//request.erase(request.end() - 1);//the same with pop_back
		//GET /live/1001 HTTP/1.1
		//HTTP/1.1 200 OK
		size_t i = 5;
		size_t lmax = request.size();
		while (request[++i] != ' ' && i             
关注
打赏
1663161521
查看更多评论
0.0477s