URLs are now built and validated using a special function.

This commit is contained in:
Jamie Greunbaum 2023-04-03 18:06:08 -04:00
parent 7b608bb201
commit 0db0d2ad1d
6 changed files with 80 additions and 41 deletions

View File

@ -10,18 +10,6 @@
#include "Kismet/GameplayStatics.h" #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() void UServerAPI::ReturnListOfBugs()
{ {
this->BugDataResponse.Execute(TArray<FUnrealzillaBugData>()); this->BugDataResponse.Execute(TArray<FUnrealzillaBugData>());
@ -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<FString, FString> &QueryData) const FString UServerAPI::FormatQueryString(const TMap<FString, FString> &QueryData)
{ {
TArray<FString> AssembledKeyValuePairs; TArray<FString> AssembledKeyValuePairs;
@ -116,3 +115,25 @@ const FString UServerAPI::FormatQueryString(const TMap<FString, FString> &QueryD
return FString::Join(AssembledKeyValuePairs, TEXT("&")); 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);
}

View File

@ -10,10 +10,17 @@
#include "Kismet/GameplayStatics.h" #include "Kismet/GameplayStatics.h"
UServerBugzillaAPI::UServerBugzillaAPI()
{
this->FullURL = UServerAPI::URLBuilder(
GetDefault<UUnrealzillaGlobalSettings>()->BugzillaSubmissionServer,
GetDefault<UUnrealzillaGlobalSettings>()->BugzillaRESTURI
);
}
void UServerBugzillaAPI::ReturnListOfBugs() void UServerBugzillaAPI::ReturnListOfBugs()
{ {
const FString FullURL = GetDefault<UUnrealzillaGlobalSettings>()->BugzillaSubmissionServer + GetDefault<UUnrealzillaGlobalSettings>()->BugzillaRESTURI;
TArray<FString> StatusQueries; TArray<FString> StatusQueries;
if (GetDefault<UUnrealzillaGlobalSettings>()->bShowUnresolvedBugs) if (GetDefault<UUnrealzillaGlobalSettings>()->bShowUnresolvedBugs)
{ {
@ -44,7 +51,7 @@ void UServerBugzillaAPI::ReturnListOfBugs()
TSharedRef<IHttpRequest, ESPMode::ThreadSafe> SeverityRequest = HttpModule.CreateRequest(); TSharedRef<IHttpRequest, ESPMode::ThreadSafe> SeverityRequest = HttpModule.CreateRequest();
SeverityRequest->SetVerb(TEXT("GET")); SeverityRequest->SetVerb(TEXT("GET"));
SeverityRequest->SetHeader(TEXT("Content-Type"), TEXT("application/json")); 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->OnProcessRequestComplete().BindUObject(this, &UServerBugzillaAPI::ListOfBugsResponse);
SeverityRequest->ProcessRequest(); SeverityRequest->ProcessRequest();
} }
@ -88,8 +95,6 @@ void UServerBugzillaAPI::ListOfBugsResponse(FHttpRequestPtr Request, FHttpRespon
void UServerBugzillaAPI::PrepareForm() void UServerBugzillaAPI::PrepareForm()
{ {
const FString FullURL = GetDefault<UUnrealzillaGlobalSettings>()->BugzillaSubmissionServer + GetDefault<UUnrealzillaGlobalSettings>()->BugzillaRESTURI;
// Assemble query data into key:value pairs // Assemble query data into key:value pairs
TMap<FString, FString> QueryData; TMap<FString, FString> QueryData;
QueryData.Add("api_key", GetDefault<UUnrealzillaGlobalSettings>()->BugzillaAPIKey); QueryData.Add("api_key", GetDefault<UUnrealzillaGlobalSettings>()->BugzillaAPIKey);
@ -100,7 +105,7 @@ void UServerBugzillaAPI::PrepareForm()
TSharedRef<IHttpRequest, ESPMode::ThreadSafe> ProductRequest = HttpModule.CreateRequest(); TSharedRef<IHttpRequest, ESPMode::ThreadSafe> ProductRequest = HttpModule.CreateRequest();
ProductRequest->SetVerb(TEXT("GET")); ProductRequest->SetVerb(TEXT("GET"));
ProductRequest->SetHeader(TEXT("Content-Type"), TEXT("application/json")); ProductRequest->SetHeader(TEXT("Content-Type"), TEXT("application/json"));
ProductRequest->SetURL(FullURL + "product/" + GetDefault<UUnrealzillaGlobalSettings>()->BugzillaProductName + "?" + QueryString); ProductRequest->SetURL(this->FullURL + "product/" + GetDefault<UUnrealzillaGlobalSettings>()->BugzillaProductName + "?" + QueryString);
ProductRequest->OnProcessRequestComplete().BindUObject(this, &UServerBugzillaAPI::ServerProductInfoResponse); ProductRequest->OnProcessRequestComplete().BindUObject(this, &UServerBugzillaAPI::ServerProductInfoResponse);
ProductRequest->ProcessRequest(); ProductRequest->ProcessRequest();
@ -108,7 +113,7 @@ void UServerBugzillaAPI::PrepareForm()
TSharedRef<IHttpRequest, ESPMode::ThreadSafe> SeverityRequest = HttpModule.CreateRequest(); TSharedRef<IHttpRequest, ESPMode::ThreadSafe> SeverityRequest = HttpModule.CreateRequest();
SeverityRequest->SetVerb(TEXT("GET")); SeverityRequest->SetVerb(TEXT("GET"));
SeverityRequest->SetHeader(TEXT("Content-Type"), TEXT("application/json")); 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->OnProcessRequestComplete().BindUObject(this, &UServerBugzillaAPI::ServerSeverityInfoResponse);
SeverityRequest->ProcessRequest(); SeverityRequest->ProcessRequest();
@ -116,7 +121,7 @@ void UServerBugzillaAPI::PrepareForm()
TSharedRef<IHttpRequest, ESPMode::ThreadSafe> PlatformsRequest = HttpModule.CreateRequest(); TSharedRef<IHttpRequest, ESPMode::ThreadSafe> PlatformsRequest = HttpModule.CreateRequest();
PlatformsRequest->SetVerb(TEXT("GET")); PlatformsRequest->SetVerb(TEXT("GET"));
PlatformsRequest->SetHeader(TEXT("Content-Type"), TEXT("application/json")); 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->OnProcessRequestComplete().BindUObject(this, &UServerBugzillaAPI::ServerPlatformInfoResponse);
PlatformsRequest->ProcessRequest(); PlatformsRequest->ProcessRequest();
@ -124,16 +129,13 @@ void UServerBugzillaAPI::PrepareForm()
TSharedRef<IHttpRequest, ESPMode::ThreadSafe> OSRequest = HttpModule.CreateRequest(); TSharedRef<IHttpRequest, ESPMode::ThreadSafe> OSRequest = HttpModule.CreateRequest();
OSRequest->SetVerb(TEXT("GET")); OSRequest->SetVerb(TEXT("GET"));
OSRequest->SetHeader(TEXT("Content-Type"), TEXT("application/json")); 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->OnProcessRequestComplete().BindUObject(this, &UServerBugzillaAPI::ServerOSInfoResponse);
OSRequest->ProcessRequest(); OSRequest->ProcessRequest();
} }
void UServerBugzillaAPI::SendFormData(const FUnrealzillaPostData &PostData) void UServerBugzillaAPI::SendFormData(const FUnrealzillaPostData &PostData)
{ {
const FString FullURL = GetDefault<UUnrealzillaGlobalSettings>()->BugzillaSubmissionServer + GetDefault<UUnrealzillaGlobalSettings>()->BugzillaRESTURI;
const FString RequestURL = "bug";
// Assemble query data into key:value pairs // Assemble query data into key:value pairs
TMap<FString, FString> QueryData; TMap<FString, FString> QueryData;
QueryData.Add("api_key", GetDefault<UUnrealzillaGlobalSettings>()->BugzillaAPIKey); QueryData.Add("api_key", GetDefault<UUnrealzillaGlobalSettings>()->BugzillaAPIKey);
@ -189,7 +191,7 @@ void UServerBugzillaAPI::SendFormData(const FUnrealzillaPostData &PostData)
TSharedRef<IHttpRequest, ESPMode::ThreadSafe> Request = HttpModule.CreateRequest(); TSharedRef<IHttpRequest, ESPMode::ThreadSafe> Request = HttpModule.CreateRequest();
Request->SetVerb(TEXT("POST")); Request->SetVerb(TEXT("POST"));
Request->SetHeader(TEXT("Content-Type"), TEXT("application/json")); 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->SetContentAsString(PostJsonString);
Request->OnProcessRequestComplete().BindUObject(this, &UServerBugzillaAPI::ServerPOSTResponse); Request->OnProcessRequestComplete().BindUObject(this, &UServerBugzillaAPI::ServerPOSTResponse);
Request->ProcessRequest(); 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 // Use the response's bug ID to get the info from the newly filed bug report and update its marker
const FString FullURL = GetDefault<UUnrealzillaGlobalSettings>()->BugzillaSubmissionServer + GetDefault<UUnrealzillaGlobalSettings>()->BugzillaRESTURI;
TArray<FString> StatusQueries; TArray<FString> StatusQueries;
StatusQueries.Add("id=" + FString::FromInt(ResponseData.id)); StatusQueries.Add("id=" + FString::FromInt(ResponseData.id));
if (GetDefault<UUnrealzillaGlobalSettings>()->bShowUnresolvedBugs) if (GetDefault<UUnrealzillaGlobalSettings>()->bShowUnresolvedBugs)
@ -245,7 +245,7 @@ void UServerBugzillaAPI::ServerPOSTResponse(FHttpRequestPtr Request, FHttpRespon
TSharedRef<IHttpRequest, ESPMode::ThreadSafe> SeverityRequest = HttpModule.CreateRequest(); TSharedRef<IHttpRequest, ESPMode::ThreadSafe> SeverityRequest = HttpModule.CreateRequest();
SeverityRequest->SetVerb(TEXT("GET")); SeverityRequest->SetVerb(TEXT("GET"));
SeverityRequest->SetHeader(TEXT("Content-Type"), TEXT("application/json")); 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->OnProcessRequestComplete().BindUObject(this, &UServerBugzillaAPI::ServerPOSTUpdateMarkerResponse);
SeverityRequest->ProcessRequest(); SeverityRequest->ProcessRequest();
} }
@ -454,9 +454,10 @@ void UServerBugzillaAPI::CheckIfAllFormResponsesAreIn()
Data.OSList = this->OSList; Data.OSList = this->OSList;
// Find a default version number to use if possible // 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")) else if (this->VersionsList.Contains("unspecified"))
{ {

View File

@ -10,6 +10,15 @@
#include "Kismet/GameplayStatics.h" #include "Kismet/GameplayStatics.h"
UServerJiraAPI::UServerJiraAPI()
{
this->FullURL = UServerAPI::URLBuilder(
GetDefault<UUnrealzillaGlobalSettings>()->JiraSubmissionServer,
GetDefault<UUnrealzillaGlobalSettings>()->JiraRESTURI
);
}
void UServerJiraAPI::ReturnListOfBugs() void UServerJiraAPI::ReturnListOfBugs()
{ {
const FString FullURL = GetDefault<UUnrealzillaGlobalSettings>()->JiraSubmissionServer + "/rest"; const FString FullURL = GetDefault<UUnrealzillaGlobalSettings>()->JiraSubmissionServer + "/rest";
@ -454,9 +463,10 @@ void UServerJiraAPI::CheckIfAllFormResponsesAreIn()
Data.OSList = this->OSList; Data.OSList = this->OSList;
// Find a default version number to use if possible // 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")) else if (this->VersionsList.Contains("unspecified"))
{ {

View File

@ -25,21 +25,20 @@ public:
virtual void PrepareForm(); virtual void PrepareForm();
virtual void SendFormData(const FUnrealzillaPostData &PostData); virtual void SendFormData(const FUnrealzillaPostData &PostData);
DECLARE_DELEGATE_OneParam(FBugListResponseDelegate, const TArray<FUnrealzillaBugData>&);
FBugListResponseDelegate BugDataResponse;
DECLARE_DELEGATE_OneParam(FFormResponseDelegate, const FUnrealzillaFormPrepData&);
FFormResponseDelegate FormDataResponse;
DECLARE_DELEGATE_OneParam(FServerErrorResponseDelegate, const FUnrealzillaErrorData &)
FServerErrorResponseDelegate ErrorResponse;
TArray<FString> GetComponentsList() const { return this->ComponentsList; } TArray<FString> GetComponentsList() const { return this->ComponentsList; }
TArray<FString> GetSeverityList() const { return this->SeverityList; } TArray<FString> GetSeverityList() const { return this->SeverityList; }
TArray<FString> GetVersionsList() const { return this->VersionsList; } TArray<FString> GetVersionsList() const { return this->VersionsList; }
TArray<FString> GetPlatformsList() const { return this->PlatformsList; } TArray<FString> GetPlatformsList() const { return this->PlatformsList; }
TArray<FString> GetOSList() const { return this->OSList; } TArray<FString> GetOSList() const { return this->OSList; }
DECLARE_DELEGATE_OneParam(FBugListResponseDelegate, const TArray<FUnrealzillaBugData>&);
DECLARE_DELEGATE_OneParam(FFormResponseDelegate, const FUnrealzillaFormPrepData&);
DECLARE_DELEGATE_OneParam(FServerErrorResponseDelegate, const FUnrealzillaErrorData &);
FBugListResponseDelegate BugDataResponse;
FFormResponseDelegate FormDataResponse;
FServerErrorResponseDelegate ErrorResponse;
protected: protected:
void ServerConnectionError(const EHttpRequestStatus::Type Status); void ServerConnectionError(const EHttpRequestStatus::Type Status);
@ -49,11 +48,15 @@ protected:
void CreateError(const EErrorVerb &Verb, const FBugzillaJSONBugResponse &Data); void CreateError(const EErrorVerb &Verb, const FBugzillaJSONBugResponse &Data);
void CreateError(const FString &ErrorMessage); void CreateError(const FString &ErrorMessage);
static const FString URLBuilder(const FString &Server, const FString &Path);
static const FString FormatQueryString(const TMap<FString, FString> &QueryData); static const FString FormatQueryString(const TMap<FString, FString> &QueryData);
static const FString GetGameVersion();
TArray<FString> ComponentsList; TArray<FString> ComponentsList;
TArray<FString> SeverityList; TArray<FString> SeverityList;
TArray<FString> VersionsList; TArray<FString> VersionsList;
TArray<FString> PlatformsList; TArray<FString> PlatformsList;
TArray<FString> OSList; TArray<FString> OSList;
FString FullURL;
}; };

View File

@ -16,6 +16,8 @@ class UNREALZILLA_API UServerBugzillaAPI : public UServerAPI
GENERATED_BODY() GENERATED_BODY()
public: public:
UServerBugzillaAPI();
virtual void ReturnListOfBugs() override; virtual void ReturnListOfBugs() override;
virtual void PrepareForm() override; virtual void PrepareForm() override;
virtual void SendFormData(const FUnrealzillaPostData &PostData) override; virtual void SendFormData(const FUnrealzillaPostData &PostData) override;

View File

@ -16,6 +16,8 @@ class UNREALZILLA_API UServerJiraAPI : public UServerAPI
GENERATED_BODY() GENERATED_BODY()
public: public:
UServerJiraAPI();
virtual void ReturnListOfBugs() override; virtual void ReturnListOfBugs() override;
virtual void PrepareForm() override; virtual void PrepareForm() override;
virtual void SendFormData(const FUnrealzillaPostData &PostData) override; virtual void SendFormData(const FUnrealzillaPostData &PostData) override;