From 9e2de4a08bd8c615c1515b11df18376b56a64acb Mon Sep 17 00:00:00 2001 From: Ryan Stecker Date: Mon, 2 Jun 2014 20:14:31 -0500 Subject: [PATCH] Implement WriteHTTPResponseBodyToFile via stdio. --- Extension/swhttprequest.cpp | 57 ++++++++++++++++++++++++++++++++++++ Pawn/includes/SteamWorks.inc | 2 ++ 2 files changed, 59 insertions(+) diff --git a/Extension/swhttprequest.cpp b/Extension/swhttprequest.cpp index 3392f5f..2bcdaef 100644 --- a/Extension/swhttprequest.cpp +++ b/Extension/swhttprequest.cpp @@ -19,6 +19,8 @@ #include "swhttprequest.h" +#include + static ISteamHTTP *GetHTTPPointer(void) { return g_SteamWorks.pSWGameServer->GetHTTP(); @@ -606,6 +608,60 @@ static cell_t sm_GetHTTPResponseBodyCallback(IPluginContext *pContext, const cel return 1; } +static cell_t sm_WriteHTTPResponseBodyToFile(IPluginContext *pContext, const cell_t *params) +{ + ISteamHTTP *pHTTP = GetHTTPPointer(); + if (pHTTP == NULL) + { + return 0; + } + + HandleError err; + HandleSecurity sec(pContext->GetIdentity(), myself->GetIdentity()); + + SteamWorksHTTPRequest *pRequest; + if ((err = handlesys->ReadHandle(params[1], GetSteamHTTPHandle(), &sec, (void **)&pRequest)) + != HandleError_None) + { + return pContext->ThrowNativeError("Invalid Handle %x (error: %d)", params[1], err); + } + + uint32_t size; + if (pHTTP->GetHTTPResponseBodySize(pRequest->request, &size) == false) + { + return 0; + } + + char *pBuffer = new char[size]; + + if (pHTTP->GetHTTPResponseBodyData(pRequest->request, reinterpret_cast(pBuffer), size) == false) + { + delete [] pBuffer; + return 0; + } + + char *pFilePath; + pContext->LocalToString(params[2], &pFilePath); + + char szFinalPath[PLATFORM_MAX_PATH]; + g_pSM->BuildPath(Path_Game, szFinalPath, sizeof(szFinalPath), "%s", pFilePath); + + FILE *pOutputFile = fopen(szFinalPath, "wb"); + + if (!pOutputFile) + { + delete [] pBuffer; + return pContext->ThrowNativeError("Unable to open %s for writing. errno: %d", szFinalPath, errno); + } + + fwrite(pBuffer, sizeof(char), size, pOutputFile); + + delete [] pBuffer; + fclose(pOutputFile); + + return 1; +} + static sp_nativeinfo_t httpnatives[] = { {"SteamWorks_CreateHTTPRequest", sm_CreateHTTPRequest}, {"SteamWorks_SetHTTPRequestContextValue", sm_SetHTTPRequestContextValue}, @@ -623,6 +679,7 @@ static sp_nativeinfo_t httpnatives[] = { {"SteamWorks_GetHTTPDownloadProgressPct", sm_GetHTTPDownloadProgressPct}, {"SteamWorks_SetHTTPRequestRawPostBody", sm_SetHTTPRequestRawPostBody}, {"SteamWorks_GetHTTPResponseBodyCallback", sm_GetHTTPResponseBodyCallback}, + {"SteamWorks_WriteHTTPResponseBodyToFile", sm_WriteHTTPResponseBodyToFile}, {NULL, NULL} }; diff --git a/Pawn/includes/SteamWorks.inc b/Pawn/includes/SteamWorks.inc index 594c17b..02e69af 100644 --- a/Pawn/includes/SteamWorks.inc +++ b/Pawn/includes/SteamWorks.inc @@ -238,6 +238,7 @@ funcenum SteamWorksHTTPBodyCallback }; native bool:SteamWorks_GetHTTPResponseBodyCallback(Handle:hRequest, SteamWorksHTTPBodyCallback:fCallback, any:data = 0, Handle:hPlugin = INVALID_HANDLE); +native bool:SteamWorks_WriteHTTPResponseBodyToFile(Handle:hRequest, const String:sFileName[]); forward SW_OnValidateClient(ownerauthid, authid); forward SteamWorks_OnValidateClient(ownerauthid, authid); @@ -305,5 +306,6 @@ public __ext_SteamWorks_SetNTVOptional() MarkNativeAsOptional("SteamWorks_SetHTTPRequestRawPostBody"); MarkNativeAsOptional("SteamWorks_GetHTTPResponseBodyCallback"); + MarkNativeAsOptional("SteamWorks_WriteHTTPResponseBodyToFile"); } #endif