Basic offline steamhttp emulation.

This commit is contained in:
Mr_Goldberg
2022-01-25 15:51:00 -05:00
parent 120aa968b2
commit f147638f99
3 changed files with 45 additions and 7 deletions

View File

@ -39,9 +39,32 @@ Steam_Http_Request *Steam_HTTP::get_request(HTTPRequestHandle hRequest)
HTTPRequestHandle Steam_HTTP::CreateHTTPRequest( EHTTPMethod eHTTPRequestMethod, const char *pchAbsoluteURL )
{
PRINT_DEBUG("CreateHTTPRequest %i %s\n", eHTTPRequestMethod, pchAbsoluteURL);
if (!pchAbsoluteURL) return INVALID_HTTPREQUEST_HANDLE;
std::string url = pchAbsoluteURL;
unsigned url_index = 0;
if (url.rfind("https://", 0) == 0) {
url_index = sizeof("https://") - 1;
} else if (url.rfind("http://", 0) == 0) {
url_index = sizeof("http://") - 1;
}
struct Steam_Http_Request request;
if (url_index) {
if (url[url.size() - 1] == '/') url += "index.html";
std::string file_path = Local_Storage::get_game_settings_path() + "http/" + url.substr(url_index);
unsigned long long file_size = file_size_(file_path);
if (file_size) {
request.response.resize(file_size);
long long read = Local_Storage::get_file_data(file_path, (char *)request.response.data(), file_size, 0);
if (read < 0) read = 0;
if (read != file_size) request.response.resize(read);
}
}
std::lock_guard<std::recursive_mutex> lock(global_mutex);
static HTTPRequestHandle h;
++h;
struct Steam_Http_Request request;
request.handle = h;
request.context_value = 0;
@ -84,7 +107,7 @@ bool Steam_HTTP::SetHTTPRequestNetworkActivityTimeout( HTTPRequestHandle hReques
// return false if the handle is invalid or the request is already sent.
bool Steam_HTTP::SetHTTPRequestHeaderValue( HTTPRequestHandle hRequest, const char *pchHeaderName, const char *pchHeaderValue )
{
PRINT_DEBUG("SetHTTPRequestHeaderValue\n");
PRINT_DEBUG("SetHTTPRequestHeaderValue %s %s\n", pchHeaderName, pchHeaderValue);
Steam_Http_Request *request = get_request(hRequest);
if (!request) {
return false;
@ -122,12 +145,18 @@ bool Steam_HTTP::SendHTTPRequest( HTTPRequestHandle hRequest, SteamAPICall_t *pC
return false;
}
struct HTTPRequestCompleted_t data;
struct HTTPRequestCompleted_t data = {};
data.m_hRequest = request->handle;
data.m_ulContextValue = request->context_value;
data.m_bRequestSuccessful = false;
data.m_eStatusCode = k_EHTTPStatusCode404NotFound;
data.m_unBodySize = request->response.size();
if (request->response.size() == 0) {
data.m_bRequestSuccessful = false;
data.m_eStatusCode = k_EHTTPStatusCode404NotFound;
data.m_unBodySize = request->response.size();
} else {
data.m_bRequestSuccessful = true;
data.m_eStatusCode = k_EHTTPStatusCode200OK;
data.m_unBodySize = request->response.size();
}
if (pCallHandle) {
*pCallHandle = callback_results->addCallResult(data.k_iCallback, &data, sizeof(data), 0.1);
@ -245,6 +274,7 @@ bool Steam_HTTP::GetHTTPStreamingResponseBodyData( HTTPRequestHandle hRequest, u
bool Steam_HTTP::ReleaseHTTPRequest( HTTPRequestHandle hRequest )
{
PRINT_DEBUG("ReleaseHTTPRequest\n");
std::lock_guard<std::recursive_mutex> lock(global_mutex);
auto c = std::begin(requests);
while (c != std::end(requests)) {
@ -275,7 +305,7 @@ bool Steam_HTTP::GetHTTPDownloadProgressPct( HTTPRequestHandle hRequest, float *
// parameter will set the content-type header for the request so the server may know how to interpret the body.
bool Steam_HTTP::SetHTTPRequestRawPostBody( HTTPRequestHandle hRequest, const char *pchContentType, uint8 *pubBody, uint32 unBodyLen )
{
PRINT_DEBUG("SetHTTPRequestRawPostBody\n");
PRINT_DEBUG("SetHTTPRequestRawPostBody %s\n", pchContentType);
Steam_Http_Request *request = get_request(hRequest);
if (!request) {
return false;