UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
Activity.inl
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5namespace UE::IoStore::HTTP
6{
7
8#if IAS_HTTP_WITH_PERF
9
11class FStopwatch
12{
13public:
14 uint64 GetInterval(uint32 i) const;
15 void SendStart() { Impl(0); }
16 void SendEnd() { Impl(1); }
17 void RecvStart() { Impl(2); }
18 void RecvEnd() { Impl(3); }
19
20private:
21 void Impl(uint32 Index);
22 uint64 Samples[4] = {};
23 uint32 Counts[2] = {};
24};
25
27uint64 FStopwatch::GetInterval(uint32 i) const
28{
29 if (i >= UE_ARRAY_COUNT(Samples) - 1)
30 {
31 return 0;
32 }
33 return Samples[i + 1] - Samples[i];
34}
35
37void FStopwatch::Impl(uint32 Index)
38{
39 if (uint64& Out = Samples[Index]; Out == 0)
40 {
42 }
43 Counts[Index >> 1] += !(Index & 1);
44}
45
46#endif // IAS_HTTP_WITH_PERF
47
48
49
51static void Trace(const struct FActivity*, ETrace, uint32);
52
53static FLaneEstate* GActivityTraceEstate = LaneEstate_New({
54 .Name = "Iax/Activity",
55 .Group = "Iax",
56 .Channel = GetIaxTraceChannel(),
57 .Weight = 11,
58});
59
60
61
64{
65 struct FParams
66 {
69 FHost* Host = nullptr;
70 char* Buffer = nullptr;
73 bool bIsKeepAlive = false;
74 bool bAllowChunked = true;
75 };
76
77 enum class EStage : int32
78 {
79 Build = -1,
80 Request = -2,
81 Response = -3,
82 Content = -4,
83 Done = -5,
84 Cancelled = -6,
85 Failed = -7,
86 };
87
88 FActivity(const FParams& Params);
90 FOutcome Tick(FHttpPeer& Peer, int32* MaxRecvSize=nullptr);
91 void SetSink(FTicketSink&& InSink, UPTRINT Param);
93 void Cancel();
94 void Done();
95 void Fail(const FOutcome& Outcome);
96 EStage GetStage() const;
98 const FTransactRef& GetTransaction() const;
100 FAnsiStringView GetPath() const;
101 FHost* GetHost() const;
103 UPTRINT GetSinkParam() const;
104 FIoBuffer& GetContent() const;
105 uint32 GetRemainingKiB() const;
106 FOutcome GetError() const;
107
108#if IAS_HTTP_WITH_PERF
109 const FStopwatch& GetStopwatch() const;
110#endif
111
112private:
113 enum class EState : uint8
114 {
115 Build,
116 Send,
117 RecvMessage,
118 RecvStream,
119 RecvContent,
120 RecvDone,
121 Completed,
122 Cancelled,
123 Failed,
124 _Num,
125 };
126
127 void CallSink();
128 void ChangeState(EState InState);
129 FOutcome Transact(FHttpPeer& Peer);
130 FOutcome Send(FHttpPeer& Peer);
131 FOutcome RecvMessage(FHttpPeer& Peer);
132 FOutcome RecvContent(FHttpPeer& Peer, int32& MaxRecvSize);
133 FOutcome RecvStream(FHttpPeer& Peer, int32& MaxRecvSize);
134 FOutcome Recv(FHttpPeer& Peer, int32& MaxRecvSize);
135
136 EState State = EState::Build;
137 uint8 bAllowChunked : 1;
138 uint8 _Unused : 3;
139 uint8 LengthScore : 4;
140 uint8 MethodOffset;
141 uint8 PathOffset;
142 uint16 PathLength;
143 uint16 HeaderCount = 0;
144 FTransactId TransactId = 0;
145#if IAS_HTTP_WITH_PERF
147#endif
148 union {
152 };
153 UPTRINT SinkParam;
154 FTicketSink Sink;
155 FTransactRef Transaction;
156 FBuffer Buffer;
157
158 struct FHeaderRecord
159 {
160 int16 Key;
161 uint16 ValueLength;
162 char Data[];
163 };
164
165 friend void Trace(const FActivity*, ETrace, uint32);
166
168};
169
172: bAllowChunked(Params.bAllowChunked)
173, Host(Params.Host)
174, Buffer(Params.Buffer, Params.BufferSize)
175{
176 check(Host != nullptr);
177
178 // Make a copy of data.
179 FAnsiStringView Path = Params.Path.IsEmpty() ? "/" : Params.Path;
180 check(Path[0] == '/');
181
182 auto Copy = [this] (FAnsiStringView Value)
183 {
184 uint32 Length = uint32(Value.Len());
185 char* Ptr = Buffer.Alloc<char>(Length);
186 std::memcpy(Ptr, Value.GetData(), Length);
187 uint32 Ret = uint32(ptrdiff_t(Ptr - Buffer.GetData()));
188 check(Ret <= 255);
189 return uint8(Ret);
190 };
191
192 MethodOffset = Copy(Params.Method);
193 PathOffset = Copy(Path);
194 PathLength = uint16(Path.Len());
195
196 // Calculate a length score.
197 uint32 ContentEstKiB = (Params.ContentSizeEst + 1023) >> 10;
198 uint32 Pow2 = FMath::FloorLog2(uint32(ContentEstKiB));
199 Pow2 = FMath::Min(Pow2, 15u);
200 LengthScore = uint8(Pow2);
201}
202
205{
206 check(State == EState::Build);
207
208 check(HeaderCount < 0xffff);
209 HeaderCount++;
210
211 static_assert(alignof(FHeaderRecord) == alignof(uint16));
212 uint32 Count = sizeof(FHeaderRecord) + Key.Len() + Value.Len();
213 Count = (Count + sizeof(uint16) - 1) / sizeof(uint16);
214 auto* Record = (FHeaderRecord*)(Buffer.Alloc<uint16>(Count));
215
216 Record->Key = int16(Key.Len());
217 Record->ValueLength = int16(Value.Len());
218
219 char* Cursor = Record->Data;
220 std::memcpy(Cursor, Key.GetData(), Key.Len());
221 std::memcpy(Cursor + Key.Len(), Value.GetData(), Value.Len());
222}
223
226{
227 Sink = MoveTemp(InSink);
228 SinkParam = Param;
229}
230
236
239{
240 if (State >= EState::Completed)
241 {
242 return;
243 }
244
245 ChangeState(EState::Cancelled);
246 CallSink();
247}
248
251{
252 ChangeState(EState::RecvDone);
253 CallSink();
254 ChangeState(EState::Completed);
255}
256
259{
260 if (State == EState::Failed)
261 {
262 return;
263 }
264
265 static_assert(sizeof(Outcome) == sizeof(Error));
266 std::memcpy(&Error, &Outcome, sizeof(Error));
267
268 ChangeState(EState::Failed);
269 CallSink();
270}
271
273void FActivity::ChangeState(EState InState)
274{
276
277 check(State != InState);
278 State = InState;
279}
280
282void FActivity::CallSink()
283{
284 static uint32 Scope = LaneTrace_NewScope("Iax/Sink");
285 FLaneTrace* Lane = LaneEstate_Lookup(GActivityTraceEstate, this);
286 FLaneTraceScope _(Lane, Scope);
287
288 FTicketStatus& SinkArg = *(FTicketStatus*)this;
289 Sink(SinkArg);
290}
291
294{
295 switch (State)
296 {
297 case EState::Build: return EStage::Build;
298 case EState::Send:
299 case EState::RecvMessage: return EStage::Response;
300 case EState::RecvContent:
301 case EState::RecvStream:
302 case EState::RecvDone: return EStage::Content;
303 case EState::Completed: return EStage::Done;
304 case EState::Cancelled: return EStage::Cancelled;
305 case EState::Failed: return EStage::Failed;
306 default: break;
307 }
308 return EStage::Failed;
309}
310
313{
314 check(TransactId != 0);
315 return TransactId;
316}
317
320{
321 check(State >= EState::Send && State <= EState::Completed);
322 check(Transaction.IsValid());
323 return Transaction;
324}
325
328{
329 return { Buffer.GetData() + MethodOffset, PathOffset - MethodOffset };
330}
331
334{
335 return { Buffer.GetData() + PathOffset, PathLength };
336}
337
340{
341 check(State <= EState::RecvMessage);
342 return Host;
343}
344
347{
348 UPTRINT RecordAddr = uint32(PathOffset) + uint32(PathLength);
349 for (uint32 i = 0, n = HeaderCount; i < n; ++i)
350 {
351 RecordAddr = (RecordAddr + alignof(FHeaderRecord) - 1) & ~(alignof(FHeaderRecord) - 1);
352 const auto* Record = (FHeaderRecord*)(Buffer.GetData() + RecordAddr);
353
354 FAnsiStringView Key(Record->Data, Record->Key);
355 FAnsiStringView Value(Record->Data + Record->Key, Record->ValueLength);
356 HeaderSink(Key, Value);
357
358 RecordAddr += sizeof(FHeaderRecord) + Record->Key + Record->ValueLength;
359 }
360}
361
364{
365 return SinkParam;
366}
367
370{
371 check(State == EState::RecvContent || State == EState::RecvStream);
372 return *Dest;
373}
374
377{
378 if (State <= EState::RecvStream) return MAX_uint32;
379 if (State > EState::RecvContent) return 0;
380 return uint32(GetTransaction()->GetRemaining() >> 10);
381}
382
385{
387 void* Ptr = &Outcome;
388 std::memcpy(Ptr, &Error, sizeof(Outcome));
389 return Outcome;
390}
391
393#if IAS_HTTP_WITH_PERF
394const FStopwatch& FActivity::GetStopwatch() const
395{
396 return Stopwatch;
397}
398#endif // IAS_HTTP_WITH_PERF
399
401FOutcome FActivity::Transact(FHttpPeer& Peer)
402{
403 Transaction = Peer.Transact();
404 if (!Transaction.IsValid())
405 {
406 return FOutcome::Error("Unable to create a suitable transaction");
407 }
408
409 const FHost* TheHost = GetHost();
410 bool bKeepAlive = TheHost->IsPooled();
411
412 Transaction->Begin(TheHost->GetHostName(), GetMethod(), GetPath());
414 {
415 Transaction->AddHeader(Key, Value);
416 return true;
417 });
418 TransactId = Transaction->End(bKeepAlive);
419
420 ChangeState(EState::Send);
421 return FOutcome::Ok();
422}
423
425FOutcome FActivity::Send(FHttpPeer& Peer)
426{
427#if IAS_HTTP_WITH_PERF
428 Stopwatch.SendStart();
429#endif
430
431 TRACE_CPUPROFILER_EVENT_SCOPE(IasHttp::DoSend);
432
433 FOutcome Outcome = Transaction->TrySendRequest(Peer);
434 if (Outcome.IsError())
435 {
436 Fail(Outcome);
437 return Outcome;
438 }
439
440 if (Outcome.IsWaiting())
441 {
442 return Outcome;
443 }
444
445 check(Outcome.IsOk());
446
447#if IAS_HTTP_WITH_PERF
448 Stopwatch.SendEnd();
449#endif
450
451 ChangeState(EState::RecvMessage);
453}
454
456FOutcome FActivity::RecvMessage(FHttpPeer& Peer)
457{
458 TRACE_CPUPROFILER_EVENT_SCOPE(IasHttp::DoRecvMessage);
459 Trace(this, ETrace::StateChange, uint32(State));
460
461#if IAS_HTTP_WITH_PERF
462 Stopwatch.RecvStart();
463#endif
464
465 FOutcome Outcome = Transaction->TryRecvResponse(Peer);
466 if (Outcome.IsError())
467 {
468 Fail(Outcome);
469 return Outcome;
470 }
471
472 if (Outcome.IsWaiting())
473 {
474 return Outcome;
475 }
476
477 check(Outcome.IsOk());
478
479 bool bChunked = Transaction->IsChunked();
480 int64 ContentLength = Transaction->GetContentLength();
481
482 // Validate that the server's told us how and how much it will transmit
483 if (bChunked)
484 {
485 if (bAllowChunked == 0)
486 {
487 Outcome = FOutcome::Error("Chunked transfer encoding disabled (ERRNOCHUNK)");
488 Fail(Outcome);
489 return Outcome;
490 }
491 }
492 else if (ContentLength < 0)
493 {
494 Outcome = FOutcome::Error("Invalid content length");
495 Fail(Outcome);
496 return Outcome;
497 }
498
499 // Call out to the sink to get a content destination
500 FIoBuffer* PriorDest = Dest; // to retain unioned Host ptr (redirect uses it in sink)
501 CallSink();
502
503 // HEAD methods
505 bHasBody &= ((ContentLength > 0) | int32(Transaction->IsChunked())) == true;
506 if (!bHasBody)
507 {
508 ChangeState(EState::RecvDone);
510 }
511
512 // Check the user gave us a destination for content
513 if (Dest == PriorDest)
514 {
515 Outcome = FOutcome::Error("User did not provide a destination buffer");
516 Fail(Outcome);
517 return Outcome;
518 }
519
520 // The user seems to have forgotten something. Let's help them along
521 if (int32 DestSize = int32(Dest->GetSize()); DestSize == 0)
522 {
523 static const uint32 DefaultChunkSize = 4 << 10;
524 uint32 Size = bChunked ? DefaultChunkSize : uint32(ContentLength);
525 *Dest = FIoBuffer(Size);
526 }
527 else if (!bChunked && DestSize < ContentLength)
528 {
529 // todo: support piece-wise transfer of content (a la chunked).
530 Outcome = FOutcome::Error("Destination buffer too small");
531 Fail(Outcome);
532 return Outcome;
533 }
534 else if (enum { MinStreamBuf = 256 }; bChunked && DestSize < MinStreamBuf)
535 {
537 }
538
539 // We're all set to go and get content
540 check(Dest != nullptr);
541 auto NextState = bChunked ? EState::RecvStream : EState::RecvContent;
542 ChangeState(NextState);
544}
545
547FOutcome FActivity::RecvContent(FHttpPeer& Peer, int32& MaxRecvSize)
548{
549 TRACE_CPUPROFILER_EVENT_SCOPE(IasHttp::DoRecvContent);
550
551 int64 Remaining = Transaction->GetRemaining();
552
554 View = View.Right(Remaining).Left(MaxRecvSize);
555
556 FOutcome Outcome = Transaction->TryRecv(View, Peer);
557 if (Outcome.IsError())
558 {
559 Fail(Outcome);
560 return Outcome;
561 }
562
563 MaxRecvSize -= Outcome.GetResult();
564
565 if (Outcome.IsWaiting())
566 {
567 return Outcome;
568 }
569
570#if IAS_HTTP_WITH_PERF
571 Stopwatch.RecvEnd();
572#endif
573
574 Done();
576}
577
579FOutcome FActivity::RecvStream(FHttpPeer& Peer, int32& MaxRecvSize)
580{
581 TRACE_CPUPROFILER_EVENT_SCOPE(IasHttp::DoRecvStream);
582
584 View = View.Left(MaxRecvSize);
585 MaxRecvSize -= int32(View.GetSize());
586
587 FOutcome Outcome = Transaction->TryRecv(View, Peer);
588 if (Outcome.IsError())
589 {
590 Fail(Outcome);
591 return Outcome;
592 }
593
594 int32 Result = Outcome.GetResult();
595
596 if (Result != 0)
597 {
598 // Temporarily clamp IoBuffer so if the sink does GetView/GetSize() it
599 // represents actual content and not the underlying working buffer.
600 FIoBuffer& Outer = *Dest;
601
602 FMemoryView SliceView = Outer.GetView();
603 SliceView = SliceView.Left(Result);
605
606 Swap(Outer, Slice);
607 CallSink();
608 Swap(Outer, Slice);
609 }
610
611 if (!Outcome.IsOk())
612 {
613 check(Outcome.IsWaiting());
614 return Outcome;
615 }
616
617#if IAS_HTTP_WITH_PERF
618 Stopwatch.RecvEnd();
619#endif
620
621 *Dest = FIoBuffer();
622
623 Done();
625}
626
628FOutcome FActivity::Recv(FHttpPeer& Peer, int32& MaxRecvSize)
629{
630 check(State >= EState::RecvMessage && State < EState::RecvDone);
631
632 if (State == EState::RecvMessage) return RecvMessage(Peer);
633 if (State == EState::RecvContent) return RecvContent(Peer, MaxRecvSize);
634 if (State == EState::RecvStream) return RecvStream(Peer, MaxRecvSize); //-V547
635
636 check(false); // it is not expected that we'll get here
637 return FOutcome::Error("unreachable");
638}
639
642{
643 if (State == EState::Build)
644 {
645 FOutcome Outcome = Transact(Peer);
646 if (!Outcome.IsOk())
647 {
648 return Outcome;
649 }
650 }
651
652 if (State == EState::Send)
653 {
654 return Send(Peer);
655 }
656
657 check(State > EState::Send && State < EState::RecvDone);
658 check(MaxRecvSize != nullptr);
659 return Recv(Peer, *MaxRecvSize);
660}
661
662
663
665static void Trace(const struct FActivity* Activity, ETrace Action, uint32 Param)
666{
667 if (Action == ETrace::ActivityCreate)
668 {
669 static uint32 ActScopes[16] = {};
670 if (ActScopes[0] == 0)
671 {
672 ActScopes[0] = LaneTrace_NewScope("Iax/Activity");
673
675 for (int32 i = 1, n = UE_ARRAY_COUNT(ActScopes); i < n; ++i)
676 {
677 Builder.Reset();
678 Builder << "Iax/Activity_";
679 Builder << (1ull << (i - 1));
680 ActScopes[i] = LaneTrace_NewScope(Builder);
681 }
682 }
683
684 FLaneTrace* Lane = LaneEstate_Build(GActivityTraceEstate, Activity);
685 LaneTrace_Enter(Lane, ActScopes[Activity->LengthScore]);
686 return;
687 }
688
689 if (Action == ETrace::ActivityDestroy)
690 {
691 LaneEstate_Demolish(GActivityTraceEstate, Activity);
692 return;
693 }
694
695 FLaneTrace* Lane = LaneEstate_Lookup(GActivityTraceEstate, Activity);
696
697 if (Action == ETrace::StateChange)
698 {
699 static constexpr FAnsiStringView StateNames[] = {
700 "Iax/Build",
701 "Iax/WaitForSocket",
702 "Iax/WaitResponse",
703 "Iax/RecvStream",
704 "Iax/RecvContent",
705 "Iax/RecvDone",
706 "Iax/Completed",
707 "Iax/Cancelled",
708 "Iax/Failed",
709 };
710 static_assert(UE_ARRAY_COUNT(StateNames) == uint32(FActivity::EState::_Num));
711 static uint32 StateScopes[UE_ARRAY_COUNT(StateNames)] = {};
712 if (StateScopes[0] == 0)
713 {
714 for (int32 i = 0; FAnsiStringView Name : StateNames)
715 {
716 StateScopes[i++] = LaneTrace_NewScope(Name);
717 }
718 }
719
720 uint32 Scope = StateScopes[Param];
721 if (Param == uint32(FActivity::EState::Build))
722 {
723 LaneTrace_Enter(Lane, Scope);
724 }
725 else
726 {
727 LaneTrace_Change(Lane, Scope);
728 }
729
730 return;
731 }
732}
733
734} // namespace UE::IoStore::HTTP
#define check(expr)
Definition AssertionMacros.h:314
#define UE_NONCOPYABLE(TypeName)
Definition CoreMiscDefines.h:457
FPlatformTypes::int16 int16
A 16-bit signed integer.
Definition Platform.h:1123
FPlatformTypes::int64 int64
A 64-bit signed integer.
Definition Platform.h:1127
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
FPlatformTypes::UPTRINT UPTRINT
An unsigned integer the same size as a pointer.
Definition Platform.h:1146
FPlatformTypes::uint64 uint64
A 64-bit unsigned integer.
Definition Platform.h:1117
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define TRACE_CPUPROFILER_EVENT_SCOPE(Name)
Definition CpuProfilerTrace.h:528
UE_API uint32 LaneTrace_NewScope(const FAnsiStringView &Name) LANETRACE_OFF_IMPL(1)
UE_API FLaneTrace * LaneEstate_Lookup(FLaneEstate *Estate, FLanePostcode Postcode) LANETRACE_OFF_IMPL(nullptr)
UE_API FLaneEstate * LaneEstate_New(const FLaneTraceSpec &Spec) LANETRACE_OFF_IMPL(nullptr)
UE_API void LaneEstate_Demolish(FLaneEstate *Estate, FLanePostcode Postcode) LANETRACE_OFF_IMPL()
UE_API void LaneTrace_Enter(FLaneTrace *Lane, uint32 ScopeId) LANETRACE_OFF_IMPL()
UE_API void LaneTrace_Change(FLaneTrace *Lane, uint32 ScopeId) LANETRACE_OFF_IMPL()
UE_API FLaneTrace * LaneEstate_Build(FLaneEstate *Estate, FLanePostcode Postcode) LANETRACE_OFF_IMPL(nullptr)
#define MAX_uint32
Definition NumericLimits.h:21
#define UE_ARRAY_COUNT(array)
Definition UnrealTemplate.h:212
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
uint32 Size
Definition VulkanMemory.cpp:4034
uint8_t uint8
Definition binka_ue_file_header.h:8
uint16_t uint16
Definition binka_ue_file_header.h:7
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition IoBuffer.h:15
FMutableMemoryView GetMutableView()
Definition IoBuffer.h:44
uint64 GetSize() const
Definition IoBuffer.h:41
Definition LaneTrace.h:122
constexpr TMemoryView Left(uint64 InSize) const
Definition MemoryView.h:83
TMemoryView Right(uint64 InSize) const
Definition MemoryView.h:99
constexpr uint64 GetSize() const
Definition MemoryView.h:74
void Reset()
Definition StringBuilder.h:190
Definition StringBuilder.h:509
bool Equals(TStringView< OtherCharType > OtherView, ESearchCase::Type SearchCase=ESearchCase::CaseSensitive) const
Definition StringView.h:306
Definition Misc.inl:342
T * Alloc(uint32 Count=1)
Definition Misc.inl:433
const char * GetData() const
Definition Misc.inl:414
Definition ConnectionPool.inl:10
Definition Peer.inl:527
Definition Misc.inl:73
static FOutcome Ok(int32 Result=0)
Definition Misc.inl:113
static FOutcome Error(const char *Message, int32 Code=-1)
Definition Misc.inl:151
static FOutcome None()
Definition Misc.inl:80
Definition TransactionOne.inl:945
bool IsValid() const
Definition TransactionOne.inl:990
@ Trace
Definition NetTraceConfig.h:23
@ IgnoreCase
Definition CString.h:26
const TCHAR * Name
Definition OodleDataCompression.cpp:30
TArrayView< T > Slice(TArrayView< T > FullView, int32 SliceIndex, int32 SliceNum)
Definition AssetDataTagMap.cpp:613
Definition ExpressionParserTypes.h:21
Definition Client.h:20
ETrace
Definition Misc.inl:12
IOSTOREHTTPCLIENT_API const void * GetIaxTraceChannel()
Definition Misc.inl:49
uint32 FTransactId
Definition TransactionTwo.inl:9
UE_STRING_CLASS Result(Forward< LhsType >(Lhs), RhsLen)
Definition String.cpp.inl:732
U16 Index
Definition radfft.cpp:71
static uint64 Cycles64()
Definition AndroidPlatformTime.h:34
Definition Activity.inl:66
char * Buffer
Definition Activity.inl:70
uint32 ContentSizeEst
Definition Activity.inl:71
FAnsiStringView Path
Definition Activity.inl:68
FAnsiStringView Method
Definition Activity.inl:67
FHost * Host
Definition Activity.inl:69
bool bIsKeepAlive
Definition Activity.inl:73
bool bAllowChunked
Definition Activity.inl:74
uint16 BufferSize
Definition Activity.inl:72
Definition Activity.inl:64
void EnumerateHeaders(FResponse::FHeaderSink HeaderSink) const
Definition Activity.inl:346
void SetDestination(FIoBuffer *InDest)
Definition Activity.inl:232
FIoBuffer & GetContent() const
Definition Activity.inl:369
void Cancel()
Definition Activity.inl:238
FIoBuffer * Dest
Definition Activity.inl:150
friend void Trace(const FActivity *, ETrace, uint32)
EStage GetStage() const
Definition Activity.inl:293
EStage
Definition Activity.inl:78
const FTransactRef & GetTransaction() const
Definition Activity.inl:319
FAnsiStringView GetPath() const
Definition Activity.inl:333
FAnsiStringView GetMethod() const
Definition Activity.inl:327
FActivity(const FParams &Params)
Definition Activity.inl:171
void SetSink(FTicketSink &&InSink, UPTRINT Param)
Definition Activity.inl:225
UPTRINT GetSinkParam() const
Definition Activity.inl:363
FOutcome Tick(FHttpPeer &Peer, int32 *MaxRecvSize=nullptr)
Definition Activity.inl:641
FHost * Host
Definition Activity.inl:149
void Fail(const FOutcome &Outcome)
Definition Activity.inl:258
uint32 GetRemainingKiB() const
Definition Activity.inl:376
UPTRINT Error
Definition Activity.inl:151
FHost * GetHost() const
Definition Activity.inl:339
void AddHeader(FAnsiStringView Key, FAnsiStringView Value)
Definition Activity.inl:204
void Done()
Definition Activity.inl:250
FTransactId GetTransactId() const
Definition Activity.inl:312
FOutcome GetError() const
Definition Activity.inl:384