Merge pull request #11 from VoiDeD/big-booty-buffers-stdio

Implement WriteHTTPResponseBodyToFile via stdio.
This commit is contained in:
Kyle Sanderson
2014-06-02 19:06:53 -07:00
2 changed files with 59 additions and 0 deletions
+57
View File
@@ -19,6 +19,8 @@
#include "swhttprequest.h" #include "swhttprequest.h"
#include <cstdio>
static ISteamHTTP *GetHTTPPointer(void) static ISteamHTTP *GetHTTPPointer(void)
{ {
return g_SteamWorks.pSWGameServer->GetHTTP(); return g_SteamWorks.pSWGameServer->GetHTTP();
@@ -606,6 +608,60 @@ static cell_t sm_GetHTTPResponseBodyCallback(IPluginContext *pContext, const cel
return 1; 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<uint8_t *>(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[] = { static sp_nativeinfo_t httpnatives[] = {
{"SteamWorks_CreateHTTPRequest", sm_CreateHTTPRequest}, {"SteamWorks_CreateHTTPRequest", sm_CreateHTTPRequest},
{"SteamWorks_SetHTTPRequestContextValue", sm_SetHTTPRequestContextValue}, {"SteamWorks_SetHTTPRequestContextValue", sm_SetHTTPRequestContextValue},
@@ -623,6 +679,7 @@ static sp_nativeinfo_t httpnatives[] = {
{"SteamWorks_GetHTTPDownloadProgressPct", sm_GetHTTPDownloadProgressPct}, {"SteamWorks_GetHTTPDownloadProgressPct", sm_GetHTTPDownloadProgressPct},
{"SteamWorks_SetHTTPRequestRawPostBody", sm_SetHTTPRequestRawPostBody}, {"SteamWorks_SetHTTPRequestRawPostBody", sm_SetHTTPRequestRawPostBody},
{"SteamWorks_GetHTTPResponseBodyCallback", sm_GetHTTPResponseBodyCallback}, {"SteamWorks_GetHTTPResponseBodyCallback", sm_GetHTTPResponseBodyCallback},
{"SteamWorks_WriteHTTPResponseBodyToFile", sm_WriteHTTPResponseBodyToFile},
{NULL, NULL} {NULL, NULL}
}; };
+2
View File
@@ -238,6 +238,7 @@ funcenum SteamWorksHTTPBodyCallback
}; };
native bool:SteamWorks_GetHTTPResponseBodyCallback(Handle:hRequest, SteamWorksHTTPBodyCallback:fCallback, any:data = 0, Handle:hPlugin = INVALID_HANDLE); 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 SW_OnValidateClient(ownerauthid, authid);
forward SteamWorks_OnValidateClient(ownerauthid, authid); forward SteamWorks_OnValidateClient(ownerauthid, authid);
@@ -305,5 +306,6 @@ public __ext_SteamWorks_SetNTVOptional()
MarkNativeAsOptional("SteamWorks_SetHTTPRequestRawPostBody"); MarkNativeAsOptional("SteamWorks_SetHTTPRequestRawPostBody");
MarkNativeAsOptional("SteamWorks_GetHTTPResponseBodyCallback"); MarkNativeAsOptional("SteamWorks_GetHTTPResponseBodyCallback");
MarkNativeAsOptional("SteamWorks_WriteHTTPResponseBodyToFile");
} }
#endif #endif