前几日在更新自己的开源游戏引擎 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