diff --git a/Docs/Luadoc/Lua.xml b/Docs/Luadoc/Lua.xml index 65dcfc468d..7e02d47905 100644 --- a/Docs/Luadoc/Lua.xml +++ b/Docs/Luadoc/Lua.xml @@ -1110,6 +1110,8 @@ + + diff --git a/Docs/Luadoc/LuaDocumentation.xml b/Docs/Luadoc/LuaDocumentation.xml index a7be9c3084..0deea3d979 100644 --- a/Docs/Luadoc/LuaDocumentation.xml +++ b/Docs/Luadoc/LuaDocumentation.xml @@ -3603,6 +3603,12 @@ NETWORK:HttpRequest{ } + + Returns the URL encoded representation of value. + + + Returns the query encoded as a query string. Keys and values are automatically URL encoded. + diff --git a/src/NetworkManager.cpp b/src/NetworkManager.cpp index 07a1609a37..565ef8e175 100644 --- a/src/NetworkManager.cpp +++ b/src/NetworkManager.cpp @@ -10,6 +10,7 @@ #include #include +#include #include @@ -115,6 +116,16 @@ void NetworkManager::HttpRequest(const HttpRequestArgs& args) this->httpClient.performRequest(req, args.onResponse); } +std::string NetworkManager::UrlEncode(const std::string& value) +{ + return this->httpClient.urlEncode(value); +} + +std::string NetworkManager::EncodeQueryParameters(const std::unordered_map& query) +{ + return this->httpClient.serializeHttpParameters(query); +} + // lua start #include "LuaBinding.h" @@ -306,10 +317,60 @@ public: return 1; } + static int UrlEncode(T* p, lua_State *L) + { + std::string url = SArg(1); + + std::string encoded = p->UrlEncode(url); + + lua_pushstring(L, encoded.c_str()); + return 1; + } + + static int EncodeQueryParameters(T* p, lua_State *L) + { + std::unordered_map query; + + if (lua_istable(L, 1)) + { + lua_pushnil(L); + while(lua_next(L, -2) != 0) + { + if (!lua_isstring(L, -2)) + { + luaL_error(L, "parameter keys must be strings"); + } + + if (!lua_isstring(L, -1)) + { + luaL_error(L, "parameter values must be strings"); + } + + std::string key = lua_tostring(L, -2); + std::string value = lua_tostring(L, -1); + + query[key] = value; + + lua_pop(L, 1); + } + } + else + { + luaL_error(L, "query must be a table"); + } + + std::string encoded = p->EncodeQueryParameters(query); + + lua_pushstring(L, encoded.c_str()); + return 1; + } + LunaNetworkManager() { ADD_METHOD(IsUrlAllowed); ADD_METHOD(HttpRequest); + ADD_METHOD(UrlEncode); + ADD_METHOD(EncodeQueryParameters); } private: diff --git a/src/NetworkManager.h b/src/NetworkManager.h index be83c83085..93b96c2381 100644 --- a/src/NetworkManager.h +++ b/src/NetworkManager.h @@ -5,8 +5,8 @@ #include "StdString.h" #include -#include #include +#include #include #include @@ -50,7 +50,7 @@ struct HttpRequestArgs std::string method = ix::HttpClient::kGet; std::string body; std::string multipartBoundary; - std::map headers; + std::unordered_map headers; int connectTimeout = -1; int transferTimeout = -1; std::function onResponse = [](const ix::HttpResponsePtr& response) {}; @@ -64,6 +64,8 @@ public: bool IsUrlAllowed(const std::string& url); void HttpRequest(const HttpRequestArgs& args); + std::string UrlEncode(const std::string& value); + std::string EncodeQueryParameters(const std::unordered_map& query); // Lua void PushSelf(lua_State *L);