C++ 分割 HTTP 链接为 主机名、路由和参数

前几日在更新自己的开源游戏引擎 EtherEngine 时编写了使用 C++ 对 HTTP/HTTPS 链接进行分割的算法,分享一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
ETHER_API splitLink(lua_State* L)
{
string link = luaL_checkstring(L, 1), domain, route, param;

if (!link.empty())
{
link.erase(0, link.find_first_not_of(" "));
link.erase(link.find_last_not_of(" ") + 1);
}

domain = link.substr(0, 5) == "http:" || link.substr(0, 6) == "https:" ?
link.substr(0, link.find_first_of("/", link.find_first_of("/") + 3))
: link.find_first_of("/") == string::npos ? link : link.substr(0, link.find_first_of("/"));

size_t index_quemark = link.find_first_of("?");

index_quemark == string::npos ?
(param = "", route = domain.size() == link.size() ? "/" : link.substr(domain.size()))
: (param = link.substr(index_quemark + 1), route = link.substr(domain.size(), index_quemark - domain.size()));

lua_pushstring(L, domain.c_str());
lua_pushstring(L, route.c_str());
lua_pushstring(L, param.c_str());

return 3;
}

由于上述代码是与 Lua 语言进行交互的 API,所以在下面给出通用的函数封装:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void splitLink(string link, string& domain, string& route, string& param)
{
if (!link.empty())
{
link.erase(0, link.find_first_not_of(" "));
link.erase(link.find_last_not_of(" ") + 1);
}

domain = link.substr(0, 5) == "http:" || link.substr(0, 6) == "https:" ?
link.substr(0, link.find_first_of("/", link.find_first_of("/") + 3))
: link.find_first_of("/") == string::npos ? link : link.substr(0, link.find_first_of("/"));

size_t index_quemark = link.find_first_of("?");

index_quemark == string::npos ?
(param = "", route = domain.size() == link.size() ? "/" : link.substr(domain.size()))
: (param = link.substr(index_quemark + 1), route = link.substr(domain.size(), index_quemark - domain.size()));
}

欢迎大家关注我的开源游戏引擎:https://github.com/VoidmatrixHeathcliff/EtherEngine

作者

Voidmatrix

发布于

2021-05-05

更新于

2021-05-05

许可协议

评论