Skip to content
This repository has been archived by the owner on Nov 1, 2024. It is now read-only.

Commit

Permalink
- Change classes location
Browse files Browse the repository at this point in the history
- CallURL helper
- Helper functions library
- Minor refactoring
  • Loading branch information
ufna committed Aug 2, 2016
1 parent a40bc5f commit 6fefd2f
Show file tree
Hide file tree
Showing 9 changed files with 222 additions and 90 deletions.
72 changes: 72 additions & 0 deletions Source/VaRestPlugin/Classes/VaRestLibrary.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
// Copyright 2016 Vladimir Alyamkin. All Rights Reserved.

#pragma once

#include "Kismet/BlueprintFunctionLibrary.h"

#include "VaRestTypes.h"
#include "VaRestLibrary.generated.h"

class UVaRestRequestJSON;
class UVaRestJsonObject;

DECLARE_DYNAMIC_DELEGATE_OneParam(FVaRestCallDelegate, UVaRestRequestJSON*, Request);

USTRUCT()
struct FVaRestCallResponse
{
GENERATED_USTRUCT_BODY()

UPROPERTY()
UVaRestRequestJSON* Request;

UPROPERTY()
UObject* WorldContextObject;

UPROPERTY()
FVaRestCallDelegate Callback;

FDelegateHandle CompleteDelegateHandle;
FDelegateHandle FailDelegateHandle;

FVaRestCallResponse()
: Request(nullptr)
, WorldContextObject(nullptr)
{
}

};

/**
* Usefull tools for REST communications
*/
UCLASS()
class UVaRestLibrary : public UBlueprintFunctionLibrary
{
GENERATED_BODY()


//////////////////////////////////////////////////////////////////////////
// Helpers

public:
/** Applies percent-encoding to text */
UFUNCTION(BlueprintCallable, Category = "VaRest|Utility")
static FString PercentEncode(const FString& Text);


//////////////////////////////////////////////////////////////////////////
// Easy URL processing

public:
/** Easy way to process http requests */
UFUNCTION(BlueprintCallable, Category = "VaRest|Library", meta = (WorldContext = "WorldContextObject"))
static void CallURL(UObject* WorldContextObject, const FString& URL, ERequestVerb Verb, ERequestContentType ContentType, UVaRestJsonObject* VaRestJson, const FVaRestCallDelegate& Callback);

/** Called when URL is processed (one for both success/unsuccess events)*/
static void OnCallComplete(UVaRestRequestJSON* Request);

private:
static TMap<UVaRestRequestJSON*, FVaRestCallResponse> RequestMap;

};
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

#pragma once

#include "VaRestTypes.h"
#include "VaRestRequestJSON.generated.h"

/**
Expand Down Expand Up @@ -57,46 +58,17 @@ template <class T> class FVaRestLatentAction : public FPendingLatentAction
const int32 OutputLink;
const FWeakObjectPtr CallbackTarget;
T &Result;

};

/** Verb (GET, PUT, POST) used by the request */
UENUM(BlueprintType)
enum class ERequestVerb : uint8
template <class T> void FVaRestLatentAction<T>::Cancel()
{
GET,
POST,
PUT,
DEL UMETA(DisplayName="DELETE"),
/** Set CUSTOM verb by SetCustomVerb() function */
CUSTOM
};
UObject *Obj = Request.Get();
if (Obj != nullptr)
{
((UVaRestRequestJSON*)Obj)->Cancel();
}
}

/** Content type (json, urlencoded, etc.) used by the request */
UENUM(BlueprintType)
enum class ERequestContentType : uint8
{
x_www_form_urlencoded_url UMETA(DisplayName = "x-www-form-urlencoded (URL)"),
x_www_form_urlencoded_body UMETA(DisplayName = "x-www-form-urlencoded (Request Body)"),
json,
binary
};

/** Enumerates the current state of an Http request */
UENUM(BlueprintType)
enum class ERequestStatus : uint8
{
/** Has not been started via ProcessRequest() */
NotStarted,
/** Currently being ticked and processed */
Processing,
/** Finished but failed */
Failed,
/** Failed because it was unable to connect (safe to retry) */
Failed_ConnectionError,
/** Finished and was successful */
Succeeded
};

/** Generate a delegates for callback events */
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnRequestComplete, class UVaRestRequestJSON*, Request);
Expand All @@ -105,6 +77,7 @@ DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnRequestFail, class UVaRestRequest
DECLARE_MULTICAST_DELEGATE_OneParam(FOnStaticRequestComplete, class UVaRestRequestJSON*);
DECLARE_MULTICAST_DELEGATE_OneParam(FOnStaticRequestFail, class UVaRestRequestJSON*);


/**
* General helper class http requests via blueprints
*/
Expand Down Expand Up @@ -151,14 +124,6 @@ class VARESTPLUGIN_API UVaRestRequestJSON : public UObject
void SetHeader(const FString& HeaderName, const FString& HeaderValue);


//////////////////////////////////////////////////////////////////////////
// Helpers

/** Applies percent-encoding to text */
UFUNCTION(BlueprintCallable, Category = "VaRest|Utility")
static FString PercentEncode(const FString& Text);


//////////////////////////////////////////////////////////////////////////
// Destruction and reset

Expand Down Expand Up @@ -275,7 +240,7 @@ class VARESTPLUGIN_API UVaRestRequestJSON : public UObject

protected:
/** Latent action helper */
FVaRestLatentAction <UVaRestJsonObject*> *ContinueAction;
FVaRestLatentAction<UVaRestJsonObject*>* ContinueAction;

/** Internal request data stored as JSON */
UPROPERTY()
Expand Down
41 changes: 41 additions & 0 deletions Source/VaRestPlugin/Classes/VaRestTypes.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
// Copyright 2016 Vladimir Alyamkin. All Rights Reserved.

#pragma once

/** Verb (GET, PUT, POST) used by the request */
UENUM(BlueprintType)
enum class ERequestVerb : uint8
{
GET,
POST,
PUT,
DEL UMETA(DisplayName = "DELETE"),
/** Set CUSTOM verb by SetCustomVerb() function */
CUSTOM
};

/** Content type (json, urlencoded, etc.) used by the request */
UENUM(BlueprintType)
enum class ERequestContentType : uint8
{
x_www_form_urlencoded_url UMETA(DisplayName = "x-www-form-urlencoded (URL)"),
x_www_form_urlencoded_body UMETA(DisplayName = "x-www-form-urlencoded (Request Body)"),
json,
binary
};

/** Enumerates the current state of an Http request */
UENUM(BlueprintType)
enum class ERequestStatus : uint8
{
/** Has not been started via ProcessRequest() */
NotStarted,
/** Currently being ticked and processed */
Processing,
/** Finished but failed */
Failed,
/** Failed because it was unable to connect (safe to retry) */
Failed_ConnectionError,
/** Finished and was successful */
Succeeded
};
97 changes: 97 additions & 0 deletions Source/VaRestPlugin/Private/VaRestLibrary.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
// Copyright 2016 Vladimir Alyamkin. All Rights Reserved.

#include "VaRestPluginPrivatePCH.h"


//////////////////////////////////////////////////////////////////////////
// Helpers

FString UVaRestLibrary::PercentEncode(const FString& Text)
{
FString OutText = Text;

OutText = OutText.Replace(TEXT(" "), TEXT("%20"));
OutText = OutText.Replace(TEXT("!"), TEXT("%21"));
OutText = OutText.Replace(TEXT("\""), TEXT("%22"));
OutText = OutText.Replace(TEXT("#"), TEXT("%23"));
OutText = OutText.Replace(TEXT("$"), TEXT("%24"));
OutText = OutText.Replace(TEXT("&"), TEXT("%26"));
OutText = OutText.Replace(TEXT("'"), TEXT("%27"));
OutText = OutText.Replace(TEXT("("), TEXT("%28"));
OutText = OutText.Replace(TEXT(")"), TEXT("%29"));
OutText = OutText.Replace(TEXT("*"), TEXT("%2A"));
OutText = OutText.Replace(TEXT("+"), TEXT("%2B"));
OutText = OutText.Replace(TEXT(","), TEXT("%2C"));
OutText = OutText.Replace(TEXT("/"), TEXT("%2F"));
OutText = OutText.Replace(TEXT(":"), TEXT("%3A"));
OutText = OutText.Replace(TEXT(";"), TEXT("%3B"));
OutText = OutText.Replace(TEXT("="), TEXT("%3D"));
OutText = OutText.Replace(TEXT("?"), TEXT("%3F"));
OutText = OutText.Replace(TEXT("@"), TEXT("%40"));
OutText = OutText.Replace(TEXT("["), TEXT("%5B"));
OutText = OutText.Replace(TEXT("]"), TEXT("%5D"));
OutText = OutText.Replace(TEXT("{"), TEXT("%7B"));
OutText = OutText.Replace(TEXT("}"), TEXT("%7D"));

return OutText;
}


//////////////////////////////////////////////////////////////////////////
// Easy URL processing

TMap<UVaRestRequestJSON*, FVaRestCallResponse> UVaRestLibrary::RequestMap;

void UVaRestLibrary::CallURL(UObject* WorldContextObject, const FString& URL, ERequestVerb Verb, ERequestContentType ContentType, UVaRestJsonObject* VaRestJson, const FVaRestCallDelegate& Callback)
{
UWorld* World = GEngine->GetWorldFromContextObject(WorldContextObject);
if (World == nullptr)
{
UE_LOG(LogVaRest, Error, TEXT("UVaRestLibrary: Wrong world context"))
return;
}

// Check we have valid data json
if (VaRestJson == nullptr)
{
VaRestJson = UVaRestJsonObject::ConstructJsonObject(WorldContextObject);
}

UVaRestRequestJSON* Request = NewObject<UVaRestRequestJSON>();

Request->SetVerb(Verb);
Request->SetContentType(ContentType);
Request->SetRequestObject(VaRestJson);

FVaRestCallResponse Response;
Response.Request = Request;
Response.WorldContextObject = WorldContextObject;
Response.Callback = Callback;

Response.CompleteDelegateHandle = Request->OnStaticRequestComplete.AddStatic(&UVaRestLibrary::OnCallComplete);
Response.FailDelegateHandle = Request->OnStaticRequestFail.AddStatic(&UVaRestLibrary::OnCallComplete);

RequestMap.Add(Request, Response);

Request->ResetResponseData();
Request->ProcessURL(URL);
}

void UVaRestLibrary::OnCallComplete(UVaRestRequestJSON* Request)
{
if (!RequestMap.Contains(Request))
{
return;
}

FVaRestCallResponse* Response = RequestMap.Find(Request);

Request->OnStaticRequestComplete.Remove(Response->CompleteDelegateHandle);
Request->OnStaticRequestFail.Remove(Response->FailDelegateHandle);

Response->Callback.ExecuteIfBound(Request);

Response->WorldContextObject = nullptr;
Response->Request = nullptr;
RequestMap.Remove(Request);
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,6 @@
#include "VaRestPluginPrivatePCH.h"
#include "CoreMisc.h"

template <class T> void FVaRestLatentAction<T>::Cancel()
{
UObject *Obj = Request.Get();
if (Obj != nullptr)
{
((UVaRestRequestJSON*)Obj)->Cancel();
}
}

UVaRestRequestJSON::UVaRestRequestJSON(const class FObjectInitializer& PCIP)
: Super(PCIP),
BinaryContentType(TEXT("application/octet-stream"))
Expand Down Expand Up @@ -71,40 +62,6 @@ void UVaRestRequestJSON::SetHeader(const FString& HeaderName, const FString& Hea
}


//////////////////////////////////////////////////////////////////////////
// Helpers

FString UVaRestRequestJSON::PercentEncode(const FString& Text)
{
FString OutText = Text;

OutText = OutText.Replace(TEXT(" "), TEXT("%20"));
OutText = OutText.Replace(TEXT("!"), TEXT("%21"));
OutText = OutText.Replace(TEXT("\""), TEXT("%22"));
OutText = OutText.Replace(TEXT("#"), TEXT("%23"));
OutText = OutText.Replace(TEXT("$"), TEXT("%24"));
OutText = OutText.Replace(TEXT("&"), TEXT("%26"));
OutText = OutText.Replace(TEXT("'"), TEXT("%27"));
OutText = OutText.Replace(TEXT("("), TEXT("%28"));
OutText = OutText.Replace(TEXT(")"), TEXT("%29"));
OutText = OutText.Replace(TEXT("*"), TEXT("%2A"));
OutText = OutText.Replace(TEXT("+"), TEXT("%2B"));
OutText = OutText.Replace(TEXT(","), TEXT("%2C"));
OutText = OutText.Replace(TEXT("/"), TEXT("%2F"));
OutText = OutText.Replace(TEXT(":"), TEXT("%3A"));
OutText = OutText.Replace(TEXT(";"), TEXT("%3B"));
OutText = OutText.Replace(TEXT("="), TEXT("%3D"));
OutText = OutText.Replace(TEXT("?"), TEXT("%3F"));
OutText = OutText.Replace(TEXT("@"), TEXT("%40"));
OutText = OutText.Replace(TEXT("["), TEXT("%5B"));
OutText = OutText.Replace(TEXT("]"), TEXT("%5D"));
OutText = OutText.Replace(TEXT("{"), TEXT("%7B"));
OutText = OutText.Replace(TEXT("}"), TEXT("%7D"));

return OutText;
}


//////////////////////////////////////////////////////////////////////////
// Destruction and reset

Expand Down Expand Up @@ -299,7 +256,7 @@ void UVaRestRequestJSON::ProcessRequest()
if (!Key.IsEmpty() && !Value.IsEmpty())
{
UrlParams += ParamIdx == 0 ? "?" : "&";
UrlParams += UVaRestRequestJSON::PercentEncode(Key) + "=" + UVaRestRequestJSON::PercentEncode(Value);
UrlParams += UVaRestLibrary::PercentEncode(Key) + "=" + UVaRestLibrary::PercentEncode(Value);
}

ParamIdx++;
Expand Down Expand Up @@ -328,7 +285,7 @@ void UVaRestRequestJSON::ProcessRequest()
if (!Key.IsEmpty() && !Value.IsEmpty())
{
UrlParams += ParamIdx == 0 ? "" : "&";
UrlParams += UVaRestRequestJSON::PercentEncode(Key) + "=" + UVaRestRequestJSON::PercentEncode(Value);
UrlParams += UVaRestLibrary::PercentEncode(Key) + "=" + UVaRestLibrary::PercentEncode(Value);
}

ParamIdx++;
Expand Down

0 comments on commit 6fefd2f

Please sign in to comment.