From 0db0d2ad1dfb89d080440b1859383df22dce11ba Mon Sep 17 00:00:00 2001 From: Jamie Greunbaum Date: Mon, 3 Apr 2023 18:06:08 -0400 Subject: [PATCH] URLs are now built and validated using a special function. --- Source/Unrealzilla/Private/ServerAPI.cpp | 45 ++++++++++++++----- .../Unrealzilla/Private/ServerBugzillaAPI.cpp | 37 +++++++-------- Source/Unrealzilla/Private/ServerJiraAPI.cpp | 14 +++++- Source/Unrealzilla/Public/ServerAPI.h | 21 +++++---- Source/Unrealzilla/Public/ServerBugzillaAPI.h | 2 + Source/Unrealzilla/Public/ServerJiraAPI.h | 2 + 6 files changed, 80 insertions(+), 41 deletions(-) diff --git a/Source/Unrealzilla/Private/ServerAPI.cpp b/Source/Unrealzilla/Private/ServerAPI.cpp index 6c14cbf..6cefa79 100644 --- a/Source/Unrealzilla/Private/ServerAPI.cpp +++ b/Source/Unrealzilla/Private/ServerAPI.cpp @@ -10,18 +10,6 @@ #include "Kismet/GameplayStatics.h" -const FString GetGameVersion() -{ - FString GameVersion; - GConfig->GetString(TEXT("/Script/EngineSettings.GeneralProjectSettings"), TEXT("ProjectVersion"), GameVersion, GGameIni); - if (GameVersion.IsEmpty()) - { - GameVersion = "1.0.0.0"; - } - return GameVersion; -} - - void UServerAPI::ReturnListOfBugs() { this->BugDataResponse.Execute(TArray()); @@ -104,6 +92,17 @@ void UServerAPI::CreateError(const FString &ErrorMessage) } +const FString UServerAPI::GetGameVersion() +{ + FString GameVersion; + GConfig->GetString(TEXT("/Script/EngineSettings.GeneralProjectSettings"), TEXT("ProjectVersion"), GameVersion, GGameIni); + if (GameVersion.IsEmpty()) + { + GameVersion = "1.0.0.0"; + } + return GameVersion; +} + const FString UServerAPI::FormatQueryString(const TMap &QueryData) { TArray AssembledKeyValuePairs; @@ -116,3 +115,25 @@ const FString UServerAPI::FormatQueryString(const TMap &QueryD return FString::Join(AssembledKeyValuePairs, TEXT("&")); } + +const FString UServerAPI::URLBuilder(const FString &Server, const FString &Path) +{ + FString ServerValidated = Server; + FString PathValidated = Path; + + if (!Server.EndsWith("/")) + { + ServerValidated += "/"; + } + + if (!Path.EndsWith("/")) + { + PathValidated += "/"; + } + while (PathValidated.StartsWith("/")) + { + PathValidated = PathValidated.RightChop(1); + } + + return (ServerValidated + PathValidated); +} diff --git a/Source/Unrealzilla/Private/ServerBugzillaAPI.cpp b/Source/Unrealzilla/Private/ServerBugzillaAPI.cpp index d0e06d7..3ebc8f6 100644 --- a/Source/Unrealzilla/Private/ServerBugzillaAPI.cpp +++ b/Source/Unrealzilla/Private/ServerBugzillaAPI.cpp @@ -10,10 +10,17 @@ #include "Kismet/GameplayStatics.h" +UServerBugzillaAPI::UServerBugzillaAPI() +{ + this->FullURL = UServerAPI::URLBuilder( + GetDefault()->BugzillaSubmissionServer, + GetDefault()->BugzillaRESTURI + ); +} + + void UServerBugzillaAPI::ReturnListOfBugs() { - const FString FullURL = GetDefault()->BugzillaSubmissionServer + GetDefault()->BugzillaRESTURI; - TArray StatusQueries; if (GetDefault()->bShowUnresolvedBugs) { @@ -44,7 +51,7 @@ void UServerBugzillaAPI::ReturnListOfBugs() TSharedRef SeverityRequest = HttpModule.CreateRequest(); SeverityRequest->SetVerb(TEXT("GET")); SeverityRequest->SetHeader(TEXT("Content-Type"), TEXT("application/json")); - SeverityRequest->SetURL(FullURL + "bug" + "?" + QueryString); + SeverityRequest->SetURL(this->FullURL + "bug" + "?" + QueryString); SeverityRequest->OnProcessRequestComplete().BindUObject(this, &UServerBugzillaAPI::ListOfBugsResponse); SeverityRequest->ProcessRequest(); } @@ -88,8 +95,6 @@ void UServerBugzillaAPI::ListOfBugsResponse(FHttpRequestPtr Request, FHttpRespon void UServerBugzillaAPI::PrepareForm() { - const FString FullURL = GetDefault()->BugzillaSubmissionServer + GetDefault()->BugzillaRESTURI; - // Assemble query data into key:value pairs TMap QueryData; QueryData.Add("api_key", GetDefault()->BugzillaAPIKey); @@ -100,7 +105,7 @@ void UServerBugzillaAPI::PrepareForm() TSharedRef ProductRequest = HttpModule.CreateRequest(); ProductRequest->SetVerb(TEXT("GET")); ProductRequest->SetHeader(TEXT("Content-Type"), TEXT("application/json")); - ProductRequest->SetURL(FullURL + "product/" + GetDefault()->BugzillaProductName + "?" + QueryString); + ProductRequest->SetURL(this->FullURL + "product/" + GetDefault()->BugzillaProductName + "?" + QueryString); ProductRequest->OnProcessRequestComplete().BindUObject(this, &UServerBugzillaAPI::ServerProductInfoResponse); ProductRequest->ProcessRequest(); @@ -108,7 +113,7 @@ void UServerBugzillaAPI::PrepareForm() TSharedRef SeverityRequest = HttpModule.CreateRequest(); SeverityRequest->SetVerb(TEXT("GET")); SeverityRequest->SetHeader(TEXT("Content-Type"), TEXT("application/json")); - SeverityRequest->SetURL(FullURL + "field/bug/bug_severity" + "?" + QueryString); + SeverityRequest->SetURL(this->FullURL + "field/bug/bug_severity" + "?" + QueryString); SeverityRequest->OnProcessRequestComplete().BindUObject(this, &UServerBugzillaAPI::ServerSeverityInfoResponse); SeverityRequest->ProcessRequest(); @@ -116,7 +121,7 @@ void UServerBugzillaAPI::PrepareForm() TSharedRef PlatformsRequest = HttpModule.CreateRequest(); PlatformsRequest->SetVerb(TEXT("GET")); PlatformsRequest->SetHeader(TEXT("Content-Type"), TEXT("application/json")); - PlatformsRequest->SetURL(FullURL + "field/bug/rep_platform" + "?" + QueryString); + PlatformsRequest->SetURL(this->FullURL + "field/bug/rep_platform" + "?" + QueryString); PlatformsRequest->OnProcessRequestComplete().BindUObject(this, &UServerBugzillaAPI::ServerPlatformInfoResponse); PlatformsRequest->ProcessRequest(); @@ -124,16 +129,13 @@ void UServerBugzillaAPI::PrepareForm() TSharedRef OSRequest = HttpModule.CreateRequest(); OSRequest->SetVerb(TEXT("GET")); OSRequest->SetHeader(TEXT("Content-Type"), TEXT("application/json")); - OSRequest->SetURL(FullURL + "field/bug/op_sys" + "?" + QueryString); + OSRequest->SetURL(this->FullURL + "field/bug/op_sys" + "?" + QueryString); OSRequest->OnProcessRequestComplete().BindUObject(this, &UServerBugzillaAPI::ServerOSInfoResponse); OSRequest->ProcessRequest(); } void UServerBugzillaAPI::SendFormData(const FUnrealzillaPostData &PostData) { - const FString FullURL = GetDefault()->BugzillaSubmissionServer + GetDefault()->BugzillaRESTURI; - const FString RequestURL = "bug"; - // Assemble query data into key:value pairs TMap QueryData; QueryData.Add("api_key", GetDefault()->BugzillaAPIKey); @@ -189,7 +191,7 @@ void UServerBugzillaAPI::SendFormData(const FUnrealzillaPostData &PostData) TSharedRef Request = HttpModule.CreateRequest(); Request->SetVerb(TEXT("POST")); Request->SetHeader(TEXT("Content-Type"), TEXT("application/json")); - Request->SetURL(FullURL + RequestURL + "?" + UServerAPI::FormatQueryString(QueryData)); + Request->SetURL(this->FullURL + "bug" + "?" + UServerAPI::FormatQueryString(QueryData)); Request->SetContentAsString(PostJsonString); Request->OnProcessRequestComplete().BindUObject(this, &UServerBugzillaAPI::ServerPOSTResponse); Request->ProcessRequest(); @@ -212,8 +214,6 @@ void UServerBugzillaAPI::ServerPOSTResponse(FHttpRequestPtr Request, FHttpRespon { // Use the response's bug ID to get the info from the newly filed bug report and update its marker - const FString FullURL = GetDefault()->BugzillaSubmissionServer + GetDefault()->BugzillaRESTURI; - TArray StatusQueries; StatusQueries.Add("id=" + FString::FromInt(ResponseData.id)); if (GetDefault()->bShowUnresolvedBugs) @@ -245,7 +245,7 @@ void UServerBugzillaAPI::ServerPOSTResponse(FHttpRequestPtr Request, FHttpRespon TSharedRef SeverityRequest = HttpModule.CreateRequest(); SeverityRequest->SetVerb(TEXT("GET")); SeverityRequest->SetHeader(TEXT("Content-Type"), TEXT("application/json")); - SeverityRequest->SetURL(FullURL + "/bug" + "?" + QueryString); + SeverityRequest->SetURL(this->FullURL + "bug" + "?" + QueryString); SeverityRequest->OnProcessRequestComplete().BindUObject(this, &UServerBugzillaAPI::ServerPOSTUpdateMarkerResponse); SeverityRequest->ProcessRequest(); } @@ -454,9 +454,10 @@ void UServerBugzillaAPI::CheckIfAllFormResponsesAreIn() Data.OSList = this->OSList; // Find a default version number to use if possible - if (this->VersionsList.Contains(GetGameVersion())) + const FString GameVersion = UServerAPI::GetGameVersion(); + if (this->VersionsList.Contains(GameVersion)) { - Data.DetectedVersion = GetGameVersion(); + Data.DetectedVersion = GameVersion; } else if (this->VersionsList.Contains("unspecified")) { diff --git a/Source/Unrealzilla/Private/ServerJiraAPI.cpp b/Source/Unrealzilla/Private/ServerJiraAPI.cpp index 9cd7b4c..5fdcdcc 100644 --- a/Source/Unrealzilla/Private/ServerJiraAPI.cpp +++ b/Source/Unrealzilla/Private/ServerJiraAPI.cpp @@ -10,6 +10,15 @@ #include "Kismet/GameplayStatics.h" +UServerJiraAPI::UServerJiraAPI() +{ + this->FullURL = UServerAPI::URLBuilder( + GetDefault()->JiraSubmissionServer, + GetDefault()->JiraRESTURI + ); +} + + void UServerJiraAPI::ReturnListOfBugs() { const FString FullURL = GetDefault()->JiraSubmissionServer + "/rest"; @@ -454,9 +463,10 @@ void UServerJiraAPI::CheckIfAllFormResponsesAreIn() Data.OSList = this->OSList; // Find a default version number to use if possible - if (this->VersionsList.Contains(GetGameVersion())) + const FString GameVersion = UServerAPI::GetGameVersion(); + if (this->VersionsList.Contains(GameVersion)) { - Data.DetectedVersion = GetGameVersion(); + Data.DetectedVersion = GameVersion; } else if (this->VersionsList.Contains("unspecified")) { diff --git a/Source/Unrealzilla/Public/ServerAPI.h b/Source/Unrealzilla/Public/ServerAPI.h index 9a17719..a4fb779 100644 --- a/Source/Unrealzilla/Public/ServerAPI.h +++ b/Source/Unrealzilla/Public/ServerAPI.h @@ -25,21 +25,20 @@ public: virtual void PrepareForm(); virtual void SendFormData(const FUnrealzillaPostData &PostData); - DECLARE_DELEGATE_OneParam(FBugListResponseDelegate, const TArray&); - FBugListResponseDelegate BugDataResponse; - - DECLARE_DELEGATE_OneParam(FFormResponseDelegate, const FUnrealzillaFormPrepData&); - FFormResponseDelegate FormDataResponse; - - DECLARE_DELEGATE_OneParam(FServerErrorResponseDelegate, const FUnrealzillaErrorData &) - FServerErrorResponseDelegate ErrorResponse; - TArray GetComponentsList() const { return this->ComponentsList; } TArray GetSeverityList() const { return this->SeverityList; } TArray GetVersionsList() const { return this->VersionsList; } TArray GetPlatformsList() const { return this->PlatformsList; } TArray GetOSList() const { return this->OSList; } + DECLARE_DELEGATE_OneParam(FBugListResponseDelegate, const TArray&); + DECLARE_DELEGATE_OneParam(FFormResponseDelegate, const FUnrealzillaFormPrepData&); + DECLARE_DELEGATE_OneParam(FServerErrorResponseDelegate, const FUnrealzillaErrorData &); + + FBugListResponseDelegate BugDataResponse; + FFormResponseDelegate FormDataResponse; + FServerErrorResponseDelegate ErrorResponse; + protected: void ServerConnectionError(const EHttpRequestStatus::Type Status); @@ -49,11 +48,15 @@ protected: void CreateError(const EErrorVerb &Verb, const FBugzillaJSONBugResponse &Data); void CreateError(const FString &ErrorMessage); + static const FString URLBuilder(const FString &Server, const FString &Path); static const FString FormatQueryString(const TMap &QueryData); + static const FString GetGameVersion(); TArray ComponentsList; TArray SeverityList; TArray VersionsList; TArray PlatformsList; TArray OSList; + + FString FullURL; }; diff --git a/Source/Unrealzilla/Public/ServerBugzillaAPI.h b/Source/Unrealzilla/Public/ServerBugzillaAPI.h index 0a353c6..d881706 100644 --- a/Source/Unrealzilla/Public/ServerBugzillaAPI.h +++ b/Source/Unrealzilla/Public/ServerBugzillaAPI.h @@ -16,6 +16,8 @@ class UNREALZILLA_API UServerBugzillaAPI : public UServerAPI GENERATED_BODY() public: + UServerBugzillaAPI(); + virtual void ReturnListOfBugs() override; virtual void PrepareForm() override; virtual void SendFormData(const FUnrealzillaPostData &PostData) override; diff --git a/Source/Unrealzilla/Public/ServerJiraAPI.h b/Source/Unrealzilla/Public/ServerJiraAPI.h index a782016..b182552 100644 --- a/Source/Unrealzilla/Public/ServerJiraAPI.h +++ b/Source/Unrealzilla/Public/ServerJiraAPI.h @@ -16,6 +16,8 @@ class UNREALZILLA_API UServerJiraAPI : public UServerAPI GENERATED_BODY() public: + UServerJiraAPI(); + virtual void ReturnListOfBugs() override; virtual void PrepareForm() override; virtual void SendFormData(const FUnrealzillaPostData &PostData) override;