void CRemoteCall::DownloadFinishedCallback(const SHttpDownloadResult& result) { CRemoteCall* pCall = (CRemoteCall*)result.pObj; if (!g_pClientGame->GetRemoteCalls()->CallExists(pCall)) return; CLuaArguments arguments; if (pCall->IsLegacy()) { if (result.bSuccess) { if (pCall->IsFetch()) { arguments.PushString(std::string(result.pData, result.dataSize)); arguments.PushNumber(0); } else arguments.ReadFromJSONString(result.pData); } else { arguments.PushString("ERROR"); arguments.PushNumber(result.iErrorCode); } } else { // Append response body arguments.PushString(std::string(result.pData, result.dataSize)); // Append info table CLuaArguments info; info.PushString("success"); info.PushBoolean(result.iErrorCode >= 200 && result.iErrorCode <= 299); info.PushString("statusCode"); info.PushNumber(result.iErrorCode); // Headers as a subtable CLuaArguments headers; for (auto iter : result.headers ) { headers.PushString(iter.first); headers.PushString(iter.second); } info.PushString("headers"); info.PushTable(&headers); arguments.PushTable(&info); } // Append stored arguments if (pCall->IsFetch()) for (uint i = 0; i < pCall->GetFetchArguments().Count(); i++ ) arguments.PushArgument(*(pCall->GetFetchArguments()[i])); arguments.Call(pCall->m_VM, pCall->m_iFunction); g_pClientGame->GetRemoteCalls()->Remove(pCall); }
int CLuaFunctionDefs::RequestBrowserDomains ( lua_State* luaVM ) { // bool requestBrowserDomains ( table domains, bool isURL [, function callback ] ) std::vector<SString> pages; bool bIsURL; CLuaFunctionRef callbackFunction; CScriptArgReader argStream ( luaVM ); argStream.ReadStringTable ( pages ); argStream.ReadBool ( bIsURL, false ); argStream.ReadFunction ( callbackFunction, LUA_REFNIL ); argStream.ReadFunctionComplete (); if ( !argStream.HasErrors () ) { // Convert to domains if we got a list of URLs if ( bIsURL ) { for ( auto& strURL : pages ) { strURL = g_pCore->GetWebCore ()->GetDomainFromURL ( strURL ); } } WebRequestCallback callback = [=]( bool bAllow, const std::vector<SString>& domains ) { // Test if luaVM is still available if ( m_pLuaManager->IsLuaVMValid ( luaVM ) && VERIFY_FUNCTION ( callbackFunction ) ) { CLuaMain* pLuaMain = m_pLuaManager->GetVirtualMachine ( luaVM ); if ( !pLuaMain ) return; CLuaArguments arguments; arguments.PushBoolean ( bAllow ); CLuaArguments LuaTable; int i = 0; for ( const auto& domain : domains ) { LuaTable.PushNumber ( ++i ); LuaTable.PushString ( domain ); } arguments.PushTable ( &LuaTable ); arguments.Call ( pLuaMain, callbackFunction ); } }; g_pCore->GetWebCore ()->RequestPages ( pages, VERIFY_FUNCTION ( callbackFunction ) ? &callback : nullptr ); lua_pushboolean ( luaVM, true ); return 1; } else m_pScriptDebugging->LogCustom ( luaVM, argStream.GetFullErrorMessage () ); lua_pushboolean ( luaVM, false ); return 1; }
ResponseCode CResourceHTMLItem::Request ( HttpRequest * ipoHttpRequest, HttpResponse * ipoHttpResponse, CAccount * account ) { if ( !m_pVM ) Start (); if ( m_bIsBeingRequested ) { ipoHttpResponse->SetBody ( "Busy!", strlen("Busy!") ); return HTTPRESPONSECODE_500_INTERNALSERVERERROR; } m_bIsBeingRequested = true; m_responseCode = HTTPRESPONSECODE_200_OK; if ( !m_bIsRaw ) { ipoHttpResponse->oResponseHeaders [ "content-type" ] = m_strMime; CLuaArguments formData; for ( FormValueMap::iterator iter = ipoHttpRequest->oFormValueMap.begin(); iter != ipoHttpRequest->oFormValueMap.end(); iter++ ) { formData.PushString ( (*iter).first.c_str() ); formData.PushString ( ((FormValue)(*iter).second).sBody.c_str() ); } CLuaArguments cookies; for ( CookieMap::iterator iter = ipoHttpRequest->oCookieMap.begin(); iter != ipoHttpRequest->oCookieMap.end(); iter++ ) { cookies.PushString ( (*iter).first.c_str() ); cookies.PushString ( (*iter).second.c_str() ); } CLuaArguments headers; for ( StringMap::iterator iter = ipoHttpRequest->oRequestHeaders.begin(); iter != ipoHttpRequest->oRequestHeaders.end(); iter++ ) { headers.PushString ( (*iter).first.c_str() ); headers.PushString ( (*iter).second.c_str() ); } m_currentResponse = ipoHttpResponse; CLuaArguments querystring ( formData ); CLuaArguments args; args.PushTable ( &headers ); // requestHeaders args.PushTable ( &formData ); // form args.PushTable ( &cookies ); // cookies args.PushString ( ipoHttpRequest->GetAddress().c_str() ); // hostname args.PushString ( ipoHttpRequest->sOriginalUri.c_str() ); // url args.PushTable ( &querystring ); // querystring args.PushAccount ( account ); // g_pGame->Lock(); // get the mutex (blocking) args.CallGlobal ( m_pVM, "renderPage" ); // g_pGame->Unlock(); // release the mutex ipoHttpResponse->SetBody ( m_strPageBuffer.c_str (), m_strPageBuffer.size () ); m_strPageBuffer.clear (); } else { // its a raw page FILE * file = fopen ( m_strResourceFileName.c_str (), "rb" ); if ( file ) { fseek ( file, 0, SEEK_END ); long lBufferLength = ftell ( file ); char* pBuffer = new char [ lBufferLength ]; rewind ( file ); fread ( pBuffer, 1, lBufferLength, file ); fclose ( file ); ipoHttpResponse->oResponseHeaders [ "content-type" ] = m_strMime; ipoHttpResponse->SetBody ( pBuffer, lBufferLength ); delete[] pBuffer; } else { ipoHttpResponse->SetBody ( "Can't read file!", strlen("Can't read file!") ); } } m_bIsBeingRequested = false; return m_responseCode; }
int CLuaFunctionDefs::SetBrowserAjaxHandler ( lua_State* luaVM ) { // bool setBrowserAjaxHandler ( browser browser, string URL[, function callback] ) CClientWebBrowser* pWebBrowser; SString strURL; CLuaFunctionRef callbackFunction; CScriptArgReader argStream ( luaVM ); argStream.ReadUserData ( pWebBrowser ); argStream.ReadString ( strURL ); if ( argStream.NextIsNil () || argStream.NextIsNone () ) { if ( !argStream.HasErrors () ) { lua_pushboolean ( luaVM, pWebBrowser->RemoveAjaxHandler ( strURL ) ); return 1; } else m_pScriptDebugging->LogCustom ( luaVM, argStream.GetFullErrorMessage () ); } else { argStream.ReadFunction ( callbackFunction ); argStream.ReadFunctionComplete (); if ( !argStream.HasErrors () ) { CLuaMain* pLuaMain = m_pLuaManager->GetVirtualMachine ( luaVM ); if ( pLuaMain && VERIFY_FUNCTION ( callbackFunction ) ) { CResource* pResource = pLuaMain->GetResource (); CResourceManager * pResourceManager = m_pResourceManager; auto netId = pResource->GetNetID (); bool bResult = pWebBrowser->AddAjaxHandler ( strURL, [=] ( std::vector<SString>& vecGet, std::vector<SString>& vecPost ) -> const SString { // Make sure the resource is still running if ( !pResourceManager->Exists ( pResource ) || pResource->GetNetID() != netId ) { return ""; } // Make sure the function is valid if ( VERIFY_FUNCTION ( callbackFunction ) ) { CLuaArguments arguments; CLuaArguments getArguments; CLuaArguments postArguments; for ( auto&& param : vecGet ) getArguments.PushString ( param ); for ( auto&& param : vecPost ) postArguments.PushString ( param ); arguments.PushTable ( &getArguments ); arguments.PushTable ( &postArguments ); CLuaArguments result; arguments.Call ( pLuaMain, callbackFunction, &result ); if ( result.Count () == 0 ) return ""; CLuaArgument* returnedValue = *result.IterBegin (); if ( returnedValue->GetType () == LUA_TSTRING ) return returnedValue->GetString (); else return ""; } else return ""; } ); lua_pushboolean ( luaVM, bResult ); return 1; } } else m_pScriptDebugging->LogCustom ( luaVM, argStream.GetFullErrorMessage () ); } lua_pushboolean ( luaVM, false ); return 1; }