diff --git a/Source/PsWebServer/Private/PsWebServerHandlerImpl.cpp b/Source/PsWebServer/Private/PsWebServerHandlerImpl.cpp index ca7fad0..979b929 100644 --- a/Source/PsWebServer/Private/PsWebServerHandlerImpl.cpp +++ b/Source/PsWebServer/Private/PsWebServerHandlerImpl.cpp @@ -29,13 +29,44 @@ FPsWebServerHandlerImpl::FPsWebServerHandlerImpl() CachedResponseHeaders = PrintHeadersToString(ResponseHeaders); } +bool FPsWebServerHandlerImpl::handleGet(CivetServer* Server, mg_connection* RequestConnection) +{ + const FGuid RequestId = FGuid::NewGuid(); + + const auto Handler = OwnerHandler.Load(); + if (!Handler || Handler == nullptr) + { + const FString StatusCode = TEXT("503 Service Unavailable"); + const FString ResponseData = TEXT("Request handler is not valid"); + return SendResponse(RequestConnection, RequestId, StatusCode, ResponseData); + } + + // Create cancellation source + auto CancellationSource = FPsWebCancellationSource{}; + const auto CancellationToken = CancellationSource.GetToken(); + + FEvent* const RequestReadyEvent = CreateContext(RequestConnection, RequestId, MoveTemp(CancellationSource)); + FString PostData = PsWebServerUtils::GetPostData(RequestConnection); + + FString UeBuf(mg_get_request_info(RequestConnection)->query_string); + + // Set request processing on the game thread + DECLARE_DELEGATE(FTaskDelegate); + auto TaskDelegate = FTaskDelegate::CreateWeakLambda(Handler, [Handler, RequestId, PostData = MoveTemp(UeBuf), CancellationToken]() mutable { + Handler->SetRequestOnNextTick(RequestId, MoveTemp(PostData), CancellationToken); + }); + AsyncTask(ENamedThreads::GameThread, [TaskDelegate = MoveTemp(TaskDelegate)] { TaskDelegate.Execute(); }); + + return WaitForResponse(RequestConnection, RequestReadyEvent, RequestId); +} + bool FPsWebServerHandlerImpl::handlePost(CivetServer* Server, mg_connection* RequestConnection) { // Unique request id const FGuid RequestId = FGuid::NewGuid(); const auto Handler = OwnerHandler.Load(); - if (!Handler || Handler->IsPendingKill()) + if (!Handler || Handler == nullptr) { const FString StatusCode = TEXT("503 Service Unavailable"); const FString ResponseData = TEXT("Request handler is not valid"); @@ -166,7 +197,7 @@ FString FPsWebServerHandlerImpl::GetResponseData(const FGuid& RequestId, bool bT Context.CancellationSource.Cancel(); const auto Handler = OwnerHandler.Load(); - if (Handler && !Handler->IsPendingKill()) + if (Handler && Handler == nullptr) { return Handler->GetTimeoutResponse(); } diff --git a/Source/PsWebServer/Public/PsWebServerHandlerImpl.h b/Source/PsWebServer/Public/PsWebServerHandlerImpl.h index 2bb901e..3f3b0d7 100644 --- a/Source/PsWebServer/Public/PsWebServerHandlerImpl.h +++ b/Source/PsWebServer/Public/PsWebServerHandlerImpl.h @@ -27,6 +27,9 @@ class FPsWebServerHandlerImpl : public CivetHandler, public TSharedFromThis