diff options
author | George Hazan <george.hazan@gmail.com> | 2024-01-05 15:54:03 +0300 |
---|---|---|
committer | George Hazan <george.hazan@gmail.com> | 2024-01-05 15:54:03 +0300 |
commit | 14c4e44a0a91e1ad701d4ae3c58185d25118e64e (patch) | |
tree | 50f36035466f355c74373e757bc00b6610ce6267 /plugins/MirLua/src | |
parent | 94667140aeb3886d22e4c1301423fe99aaf3fba4 (diff) |
Netlib:
- NETLIBHTTPHEADER & NETLIBHTTPREQUEST obsoleted;
- NETLIBHTTPREQUEST divided into MHttpRequest & MHttpResponse;
- MHttpHeaders now manager headers both for MHttpRequest & MHttpResponse;
Diffstat (limited to 'plugins/MirLua/src')
-rw-r--r-- | plugins/MirLua/src/Modules/m_http.cpp | 272 |
1 files changed, 65 insertions, 207 deletions
diff --git a/plugins/MirLua/src/Modules/m_http.cpp b/plugins/MirLua/src/Modules/m_http.cpp index 7526b29612..fcc0365078 100644 --- a/plugins/MirLua/src/Modules/m_http.cpp +++ b/plugins/MirLua/src/Modules/m_http.cpp @@ -2,154 +2,22 @@ #define MT_NETLIBHTTPHEADERS "NETLIBHTTPHEADERS" -static NETLIBHTTPREQUEST* CreateRequest() +static MHttpRequest* CreateRequest() { - NETLIBHTTPREQUEST *request = (NETLIBHTTPREQUEST*)mir_calloc(sizeof(NETLIBHTTPREQUEST)); + MHttpRequest *request = new MHttpRequest(); request->flags = NLHRF_HTTP11 | NLHRF_NODUMP; return request; } -static void SetUrl(NETLIBHTTPREQUEST *request, const char *url) +static void SetUrl(MHttpRequest *request, const char *url) { - request->szUrl = mir_strdup(url); - if (mir_strncmpi(request->szUrl, "https", 5) == 0) + request->m_szUrl = url; + if (mir_strncmpi(request->m_szUrl, "https", 5) == 0) request->flags |= NLHRF_SSL; else request->flags &= ~(NLHRF_SSL); } -static void SetHeader(NETLIBHTTPREQUEST *request, const char *name, const char *value) -{ - for (int i = 0; i < request->headersCount; i++) { - if (mir_strcmp(request->headers[i].szName, name) == 0) { - mir_free(request->headers[i].szValue); - request->headers[i].szValue = mir_strdup(value); - return; - } - } - - request->headers = (NETLIBHTTPHEADER*)mir_realloc(request->headers, - sizeof(NETLIBHTTPHEADER)*(request->headersCount + 1)); - NETLIBHTTPHEADER &header = request->headers[request->headersCount]; - header.szName = mir_strdup(name); - header.szValue = mir_strdup(value); - request->headersCount++; -} - -static void DropHeader(NETLIBHTTPREQUEST *request, const char *name) -{ - for (int i = 0; i < request->headersCount - 1; i++) { - if (mir_strcmp(request->headers[i].szName, name) == 0) { - mir_free(request->headers[i].szName); - mir_free(request->headers[i].szValue); - request->headersCount--; - request->headers[i].szName = request->headers[request->headersCount].szName; - request->headers[i].szValue = request->headers[request->headersCount].szValue; - } - } - request->headers = (NETLIBHTTPHEADER*)mir_realloc(request->headers, - sizeof(NETLIBHTTPHEADER)*(request->headersCount + 1)); -} - -static void ClearHeaders(NETLIBHTTPREQUEST *request) -{ - for (int i = 0; i < request->headersCount; i++) { - mir_free(request->headers[i].szName); - mir_free(request->headers[i].szValue); - } - request->headersCount = 0; - request->headers = (NETLIBHTTPHEADER*)mir_realloc(request->headers, - sizeof(NETLIBHTTPHEADER)*(request->headersCount + 1)); -} - -static void SetContent(NETLIBHTTPREQUEST *request, const char *data, size_t length) -{ - if (request->pData != nullptr) - mir_free(request->pData); - request->pData = mir_strdup(data); - request->dataLength = (int)length; -} - -/***********************************************/ - -struct NETLIBHTTPHEADERS -{ - const NETLIBHTTPHEADER *headers; - int count; -}; - -static int headers_Iterator(lua_State *L) -{ - NETLIBHTTPHEADER *headers = (NETLIBHTTPHEADER*)lua_touserdata(L, lua_upvalueindex(1)); - int count = lua_tointeger(L, lua_upvalueindex(2)); - int idx = lua_tointeger(L, lua_upvalueindex(3)); - - if (idx < count) { - lua_pushstring(L, headers[idx].szName); - lua_pushstring(L, headers[idx].szValue); - lua_pushinteger(L, idx + 1); - lua_replace(L, lua_upvalueindex(3)); - return 2; - } - - lua_pushnil(L); - - return 1; -} - -static int headers__pairs(lua_State *L) -{ - NETLIBHTTPHEADERS *headers = (NETLIBHTTPHEADERS*)luaL_checkudata(L, 1, MT_NETLIBHTTPHEADERS); - - lua_pushlightuserdata(L, (void*)headers->headers); - lua_pushinteger(L, headers->count); - lua_pushinteger(L, 0); - lua_pushcclosure(L, headers_Iterator, 3); - - return 1; -} - -static int headers__index(lua_State *L) -{ - NETLIBHTTPHEADERS *headers = (NETLIBHTTPHEADERS*)luaL_checkudata(L, 1, MT_NETLIBHTTPHEADERS); - - if (lua_isinteger(L, 2)) { - int idx = lua_tointeger(L, 2); - if (idx > 0 && idx <= headers->count) { - lua_pushstring(L, headers->headers[idx - 1].szValue); - return 1; - } - } - - const char *key = lua_tostring(L, 2); - for (int i = 0; i < headers->count; i++) { - if (mir_strcmp(headers->headers[i].szName, key) == 0) { - lua_pushstring(L, headers->headers[i].szValue); - return 1; - } - } - - lua_pushnil(L); - - return 1; -} - -static int headers__len(lua_State *L) -{ - NETLIBHTTPHEADERS *headers = (NETLIBHTTPHEADERS*)luaL_checkudata(L, 1, MT_NETLIBHTTPHEADERS); - lua_pushinteger(L, headers->count); - return 1; -} - -static const luaL_Reg headersApi[] = -{ - { "__pairs", headers__pairs }, - { "__index", headers__index }, - { "__len", headers__len }, - - { nullptr, nullptr } -}; - /***********************************************/ #define MT_NETLIBHTTPCONTENT "NETLIBHTTPCONTENT" @@ -202,10 +70,10 @@ static const luaL_Reg contentApi[] = #define MT_NETLIBHTTPRESPONSE "NETLIBHTTPRESPONSE" -static NETLIBHTTPREQUEST* response_Create(lua_State *L, NETLIBHTTPREQUEST *request) +static MHttpResponse* response_Create(lua_State *L, MHttpRequest *request) { - NETLIBHTTPREQUEST *response = Netlib_HttpTransaction(g_plugin.hNetlib, request); - NETLIBHTTPREQUEST **udata = (NETLIBHTTPREQUEST**)lua_newuserdata(L, sizeof(NETLIBHTTPREQUEST*)); + auto *response = Netlib_HttpTransaction(g_plugin.hNetlib, request); + MHttpResponse **udata = (MHttpResponse **)lua_newuserdata(L, sizeof(MHttpResponse *)); *udata = response; luaL_setmetatable(L, MT_NETLIBHTTPRESPONSE); return response; @@ -213,7 +81,7 @@ static NETLIBHTTPREQUEST* response_Create(lua_State *L, NETLIBHTTPREQUEST *reque static int response__index(lua_State *L) { - NETLIBHTTPREQUEST *response = *(NETLIBHTTPREQUEST**)luaL_checkudata(L, 1, MT_NETLIBHTTPRESPONSE); + MHttpResponse *response = *(MHttpResponse **)luaL_checkudata(L, 1, MT_NETLIBHTTPRESPONSE); const char *key = lua_tostring(L, 2); if (mir_strcmpi(key, "IsSuccess") == 0) { @@ -226,16 +94,16 @@ static int response__index(lua_State *L) } if (mir_strcmpi(key, "StatusCode") == 0) lua_pushinteger(L, response->resultCode); - else if (mir_strcmpi(key, "Headers") == 0) { + /*else if (mir_strcmpi(key, "Headers") == 0) { NETLIBHTTPHEADERS *headers = (NETLIBHTTPHEADERS*)lua_newuserdata(L, sizeof(NETLIBHTTPHEADERS)); headers->headers = response->headers; headers->count = response->headersCount; luaL_setmetatable(L, MT_NETLIBHTTPHEADERS); - } + }*/ else if (mir_strcmpi(key, "Content") == 0) { NETLIBHTTPCONTENT *content = (NETLIBHTTPCONTENT*)lua_newuserdata(L, sizeof(NETLIBHTTPCONTENT)); - content->data = response->pData; - content->length = response->dataLength; + content->data = response->body.GetBuffer(); + content->length = response->body.GetLength(); luaL_setmetatable(L, MT_NETLIBHTTPCONTENT); } else @@ -246,7 +114,7 @@ static int response__index(lua_State *L) static int response__gc(lua_State *L) { - NETLIBHTTPREQUEST **response = (NETLIBHTTPREQUEST**)luaL_checkudata(L, 1, MT_NETLIBHTTPRESPONSE); + MHttpResponse **response = (MHttpResponse **)luaL_checkudata(L, 1, MT_NETLIBHTTPRESPONSE); Netlib_FreeHttpRequest(*response); return 0; } @@ -267,7 +135,7 @@ struct HttpRequestParam int threadRef; int callbackRef; - NETLIBHTTPREQUEST *request; + MHttpRequest *request; }; static void __cdecl SendHttpRequestThread(HttpRequestParam *param) @@ -280,11 +148,11 @@ static void __cdecl SendHttpRequestThread(HttpRequestParam *param) luaL_unref(param->L, LUA_REGISTRYINDEX, param->callbackRef); luaL_unref(param->L, LUA_REGISTRYINDEX, param->threadRef); - Netlib_FreeHttpRequest(param->request); + delete param->request; delete param; } -static void SendRequestAsync(lua_State *L, int idx, NETLIBHTTPREQUEST *request) +static void SendRequestAsync(lua_State *L, int idx, MHttpRequest *request) { HttpRequestParam *param = new HttpRequestParam(); param->request = request; @@ -297,13 +165,13 @@ static void SendRequestAsync(lua_State *L, int idx, NETLIBHTTPREQUEST *request) /***********************************************/ -#define MT_NETLIBHTTPREQUEST "NETLIBHTTPREQUEST" +#define MT_NETLIBHTTPREQUEST "MHttpRequest" static const char *httpMethods[] = { "GET", "POST", "PUT", "DELETE", nullptr }; static int request_SetMethod(lua_State *L) { - NETLIBHTTPREQUEST *request = *(NETLIBHTTPREQUEST**)luaL_checkudata(L, 1, MT_NETLIBHTTPREQUEST); + MHttpRequest *request = *(MHttpRequest**)luaL_checkudata(L, 1, MT_NETLIBHTTPREQUEST); request->requestType = (1 << (luaL_checkoption(L, 2, nullptr, httpMethods))); lua_pushvalue(L, 1); return 1; @@ -311,7 +179,7 @@ static int request_SetMethod(lua_State *L) static int request_SetUrl(lua_State *L) { - NETLIBHTTPREQUEST *request = *(NETLIBHTTPREQUEST**)luaL_checkudata(L, 1, MT_NETLIBHTTPREQUEST); + MHttpRequest *request = *(MHttpRequest**)luaL_checkudata(L, 1, MT_NETLIBHTTPREQUEST); const char *url = luaL_checkstring(L, 2); SetUrl(request, url); @@ -322,14 +190,14 @@ static int request_SetUrl(lua_State *L) static int request_SetHeaders(lua_State *L) { - NETLIBHTTPREQUEST *request = *(NETLIBHTTPREQUEST**)luaL_checkudata(L, 1, MT_NETLIBHTTPREQUEST); + MHttpRequest *request = *(MHttpRequest**)luaL_checkudata(L, 1, MT_NETLIBHTTPREQUEST); luaL_checktype(L, 2, LUA_TTABLE); - ClearHeaders(request); + request->destroy(); for (lua_pushnil(L); lua_next(L, 2); lua_pop(L, 1)) { const char *name = lua_tostring(L, -2); const char *value = lua_tostring(L, -1); - SetHeader(request, name, value); + request->AddHeader(name, value); } lua_pushvalue(L, 1); @@ -338,34 +206,34 @@ static int request_SetHeaders(lua_State *L) static int request_SetContent(lua_State *L) { - NETLIBHTTPREQUEST *request = *(NETLIBHTTPREQUEST**)luaL_checkudata(L, 1, MT_NETLIBHTTPREQUEST); + MHttpRequest *request = *(MHttpRequest**)luaL_checkudata(L, 1, MT_NETLIBHTTPREQUEST); switch (lua_type(L, 2)) { case LUA_TNONE: case LUA_TNIL: - SetContent(request, nullptr, 0); - DropHeader(request, "Content-Type"); + request->SetData(nullptr, 0); + request->DeleteHeader("Content-Type"); break; case LUA_TSTRING: - { - const char *data = lua_tostring(L, 2); - SetContent(request, data, mir_strlen(data)); - SetHeader(request, "Content-Type", "text/plain"); + { + const char *data = lua_tostring(L, 2); + request->SetData(data, mir_strlen(data)); + request->AddHeader("Content-Type", "text/plain"); + } break; - } case LUA_TTABLE: - { - CMStringA formData; - for (lua_pushnil(L); lua_next(L, 2); lua_pop(L, 1)) { - const char *name = lua_tostring(L, -2); - const char *value = lua_tostring(L, -1); - formData.AppendFormat("&%s=%s", name, value); + { + CMStringA formData; + for (lua_pushnil(L); lua_next(L, 2); lua_pop(L, 1)) { + const char *name = lua_tostring(L, -2); + const char *value = lua_tostring(L, -1); + formData.AppendFormat("&%s=%s", name, value); + } + formData.Delete(0); + request->SetData(formData.GetString(), formData.GetLength()); + request->AddHeader("Content-Type", "application/x-www-form-urlencoded"); } - formData.Delete(0); - SetContent(request, formData.GetString(), formData.GetLength()); - SetHeader(request, "Content-Type", "application/x-www-form-urlencoded"); break; - } default: luaL_argerror(L, 2, luaL_typename(L, 2)); } @@ -376,14 +244,14 @@ static int request_SetContent(lua_State *L) static int request_SetContentType(lua_State *L) { - NETLIBHTTPREQUEST *request = *(NETLIBHTTPREQUEST**)luaL_checkudata(L, 1, MT_NETLIBHTTPREQUEST); + MHttpRequest *request = *(MHttpRequest**)luaL_checkudata(L, 1, MT_NETLIBHTTPREQUEST); if (!lua_isstring(L, 2)) { lua_pushvalue(L, 1); return 1; } const char *type = lua_tostring(L, 2); - SetHeader(request, "Content-Type", type); + request->AddHeader("Content-Type", type); lua_pushvalue(L, 1); return 1; @@ -391,7 +259,7 @@ static int request_SetContentType(lua_State *L) static int request_SetTimeout(lua_State *L) { - NETLIBHTTPREQUEST *request = *(NETLIBHTTPREQUEST**)luaL_checkudata(L, 1, MT_NETLIBHTTPREQUEST); + MHttpRequest *request = *(MHttpRequest**)luaL_checkudata(L, 1, MT_NETLIBHTTPREQUEST); request->timeout = luaL_optinteger(L, -1, 0); lua_pushvalue(L, 1); return 1; @@ -399,22 +267,16 @@ static int request_SetTimeout(lua_State *L) static int request_Send(lua_State *L) { - NETLIBHTTPREQUEST *request = *(NETLIBHTTPREQUEST**)luaL_checkudata(L, 1, MT_NETLIBHTTPREQUEST); + MHttpRequest *request = *(MHttpRequest**)luaL_checkudata(L, 1, MT_NETLIBHTTPREQUEST); - NETLIBHTTPREQUEST *newRequest = (NETLIBHTTPREQUEST*)mir_calloc(sizeof(NETLIBHTTPREQUEST)); + MHttpRequest *newRequest = new MHttpRequest(); newRequest->flags = request->flags; newRequest->requestType = request->requestType; - newRequest->szUrl = mir_strdup(request->szUrl); - newRequest->headersCount = request->headersCount; - newRequest->headers = (NETLIBHTTPHEADER*)mir_calloc(sizeof(NETLIBHTTPHEADER)*(request->headersCount + 1)); - for (int i = 0; i < request->headersCount; i++) { - newRequest->headers[i].szName = mir_strdup(request->headers[i].szName); - newRequest->headers[i].szValue = mir_strdup(request->headers[i].szValue); - } - newRequest->dataLength = request->dataLength; - newRequest->pData = (char*)mir_calloc(request->dataLength + 1); - memcpy(newRequest->pData, request->pData, request->dataLength); + newRequest->m_szUrl = request->m_szUrl; + newRequest->m_szParam = request->m_szParam; newRequest->timeout = request->timeout; + for (auto &it : *request) + newRequest->AddHeader(it->szName, it->szValue); if (lua_isfunction(L, 2)) { SendRequestAsync(L, 2, newRequest); @@ -422,8 +284,7 @@ static int request_Send(lua_State *L) } response_Create(L, newRequest); - Netlib_FreeHttpRequest(newRequest); - + delete newRequest; return 1; } @@ -454,8 +315,8 @@ static int request__index(lua_State *L) static int request__gc(lua_State *L) { - NETLIBHTTPREQUEST *request = *(NETLIBHTTPREQUEST**)luaL_checkudata(L, 1, MT_NETLIBHTTPREQUEST); - Netlib_FreeHttpRequest(request); + MHttpRequest *request = *(MHttpRequest**)luaL_checkudata(L, 1, MT_NETLIBHTTPREQUEST); + delete request; return 0; } @@ -471,8 +332,8 @@ static const luaL_Reg requestApi[] = static int http_Request(lua_State *L) { - NETLIBHTTPREQUEST *request = CreateRequest(); - NETLIBHTTPREQUEST **udata = (NETLIBHTTPREQUEST**)lua_newuserdata(L, sizeof(NETLIBHTTPREQUEST*)); + MHttpRequest *request = CreateRequest(); + MHttpRequest **udata = (MHttpRequest**)lua_newuserdata(L, sizeof(MHttpRequest*)); *udata = request; request->requestType = (1 << (luaL_checkoption(L, 1, nullptr, httpMethods))); SetUrl(request, luaL_checkstring(L, 2)); @@ -483,7 +344,7 @@ static int http_Request(lua_State *L) static int http_Get(lua_State *L) { - NETLIBHTTPREQUEST *request = CreateRequest(); + MHttpRequest *request = CreateRequest(); request->requestType = REQUEST_GET; const char *url = luaL_checkstring(L, 1); @@ -495,14 +356,13 @@ static int http_Get(lua_State *L) } response_Create(L, request); - Netlib_FreeHttpRequest(request); - + delete request; return 1; } static int http_Post(lua_State *L) { - NETLIBHTTPREQUEST *request = CreateRequest(); + MHttpRequest *request = CreateRequest(); request->requestType = REQUEST_POST; const char *url = luaL_checkstring(L, 1); @@ -524,14 +384,13 @@ static int http_Post(lua_State *L) } response_Create(L, request); - Netlib_FreeHttpRequest(request); - + delete request; return 1; } static int http_Put(lua_State *L) { - NETLIBHTTPREQUEST *request = CreateRequest(); + MHttpRequest *request = CreateRequest(); request->requestType = REQUEST_PUT; const char *url = luaL_checkstring(L, 1); @@ -553,14 +412,13 @@ static int http_Put(lua_State *L) } response_Create(L, request); - Netlib_FreeHttpRequest(request); - + delete request; return 1; } static int http_Delete(lua_State *L) { - NETLIBHTTPREQUEST *request = CreateRequest(); + MHttpRequest *request = CreateRequest(); request->requestType = REQUEST_DELETE; const char *url = luaL_checkstring(L, 1); @@ -609,9 +467,9 @@ LUAMOD_API int luaopen_m_http(lua_State *L) luaL_setfuncs(L, responseApi, 0); lua_pop(L, 1); - luaL_newmetatable(L, MT_NETLIBHTTPHEADERS); - luaL_setfuncs(L, headersApi, 0); - lua_pop(L, 1); + // luaL_newmetatable(L, MT_NETLIBHTTPHEADERS); + // luaL_setfuncs(L, headersApi, 0); + // lua_pop(L, 1); luaL_newmetatable(L, MT_NETLIBHTTPCONTENT); luaL_setfuncs(L, contentApi, 0); |