Files
UnrealEngine/Engine/Source/Developer/Zen/Private/ZenCbPackageReceiver.cpp
2025-05-18 13:04:45 +08:00

85 lines
1.7 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "ZenCbPackageReceiver.h"
#if UE_WITH_ZEN
#include "Experimental/ZenServerInterface.h"
#include "Serialization/CompactBinaryPackage.h"
#include "Serialization/MemoryReader.h"
#include "ZenSerialization.h"
namespace UE::Zen
{
FCbPackageReceiver::FCbPackageReceiver(FCbPackage& OutPackage, IHttpReceiver* InNext)
: Package(OutPackage)
, Next(InNext)
{
}
void FCbPackageReceiver::Reset()
{
BodyArray.Reset();
}
const FMemoryView FCbPackageReceiver::Body() const
{
return MakeMemoryView(BodyArray);
}
bool FCbPackageReceiver::ShouldRecoverAndRetry(Zen::FZenServiceInstance& ZenServiceInstance, IHttpResponse& LocalResponse)
{
if (!ZenServiceInstance.IsServiceRunningLocally())
{
return false;
}
if ((LocalResponse.GetErrorCode() == EHttpErrorCode::Connect) ||
(LocalResponse.GetErrorCode() == EHttpErrorCode::TlsConnect) ||
(LocalResponse.GetErrorCode() == EHttpErrorCode::TimedOut))
{
return true;
}
return false;
}
IHttpReceiver* FCbPackageReceiver::OnCreate(IHttpResponse& Response)
{
return &BodyReceiver;
}
IHttpReceiver* FCbPackageReceiver::OnComplete(IHttpResponse& Response)
{
if (Response.GetErrorCode() == EHttpErrorCode::None)
{
EHttpMediaType ContentType = Response.GetContentType();
switch (ContentType)
{
case EHttpMediaType::CbPackage:
{
const FMemoryView MemoryView = Body();
{
FMemoryReaderView Ar(MemoryView);
if (Zen::Http::TryLoadCbPackage(Package, Ar))
{
BodyArray.Reset();
return Next;
}
}
FMemoryReaderView Ar(MemoryView);
if (Package.TryLoad(Ar))
{
BodyArray.Reset();
}
}
break;
}
}
return Next;
}
}
#endif // UE_WITH_ZEN