DN/Source/Extra/dn_net.cpp
2025-11-08 18:02:13 +11:00

100 lines
3.6 KiB
C++

#define DN_NET_CURL_CPP
#include "../dn_base_inc.h"
#include "../dn_os_inc.h"
DN_NETRequestInternal *DN_NET_RequestFromHandle(DN_NETRequest request)
{
DN_NETRequestInternal *ptr = DN_Cast(DN_NETRequestInternal *) request.handle;
DN_NETRequestInternal *result = nullptr;
if (ptr && ptr->gen == request.gen)
result = ptr;
return result;
}
DN_NETRequest DN_NET_HandleFromRequest(DN_NETRequestInternal *request)
{
DN_NETRequest result = {};
if (request) {
result.handle = DN_Cast(DN_UPtr) request;
result.gen = request->gen;
}
return result;
}
DN_NETResponse DN_NET_MakeResponseFromFinishedRequest_(DN_NETRequest request, DN_Arena *arena)
{
DN_NETResponse result = {};
DN_NETRequestInternal *request_ptr = DN_Cast(DN_NETRequestInternal *) request.handle;
if (request_ptr && request_ptr->gen == request.gen) {
DN_NETResponseInternal const *response = &request_ptr->response;
// NOTE: Construct the response from the request
result.request = request;
result.state = response->state;
result.http_status = response->http_status;
result.body = DN_Str8BuilderBuild(&response->body, arena);
if (response->error_str8.size)
result.error_str8 = DN_Str8FromStr8Arena(arena, response->error_str8);
}
return result;
}
void DN_NET_EndFinishedRequest_(DN_NETRequestInternal *request)
{
// NOTE: Deallocate the memory used in the request and reset the string builder
DN_ArenaPopTo(&request->arena, request->start_response_arena_pos);
request->response.body = DN_Str8BuilderFromArena(&request->arena);
// NOTE: Check that the request is completely detached
DN_Assert(request->next == nullptr);
}
void DN_NET_BaseInit_(DN_NETCore *net, char *base, DN_U64 base_size)
{
net->base = base;
net->base_size = base_size;
net->arena = DN_ArenaFromBuffer(net->base, net->base_size, DN_ArenaFlags_Nil);
net->completion_sem = DN_OS_SemaphoreInit(0);
}
DN_NETRequest DN_NET_SetupRequest_(DN_NETRequestInternal *request, DN_Str8 url, DN_Str8 method, DN_NETDoHTTPArgs const *args, DN_NETRequestType type)
{
// NOTE: Setup request
DN_Assert(request);
DN_NETRequest result = {};
if (request) {
if (!request->arena.curr)
request->arena = DN_ArenaFromVMem(DN_Megabytes(1), DN_Kilobytes(1), DN_ArenaFlags_Nil);
request->type = type;
request->gen = DN_Max(request->gen + 1, 1);
request->url = DN_Str8FromStr8Arena(&request->arena, url);
request->method = DN_Str8FromStr8Arena(&request->arena, DN_Str8TrimWhitespaceAround(method));
if (args) {
request->args.flags = args->flags;
request->args.username = DN_Str8FromStr8Arena(&request->arena, args->username);
request->args.password = DN_Str8FromStr8Arena(&request->arena, args->password);
if (type == DN_NETRequestType_HTTP)
request->args.payload = DN_Str8FromStr8Arena(&request->arena, args->payload);
request->args.headers = DN_ArenaNewArray(&request->arena, DN_Str8, args->headers_size, DN_ZMem_No);
DN_Assert(request->args.headers);
if (request->args.headers) {
for (DN_ForItSize(it, DN_Str8, args->headers, args->headers_size))
request->args.headers[it.index] = DN_Str8FromStr8Arena(&request->arena, *it.data);
request->args.headers_size = args->headers_size;
}
}
request->response.body = DN_Str8BuilderFromArena(&request->arena);
request->completion_sem = DN_OS_SemaphoreInit(0);
request->start_response_arena_pos = DN_ArenaPos(&request->arena);
result.handle = DN_Cast(DN_UPtr) request;
result.gen = request->gen;
}
return result;
}