21 if (Message.
Len() < Protocol.
Len() + 1)
26 const char* Cursor = Message.
GetData();
36 for (
int n = 32; i < n && Cursor[i] ==
' '; ++i);
40 for (
int n = 32; i < n &&
uint32(Cursor[i] - 0x30) <= 9; ++i);
47 for (
int n = 32; i < n && Cursor[i] ==
' '; ++i);
57 for (; Cursor[i] !=
'\r'; ++i)
64 if (Cursor[i + 1] !=
'\n')
76template <
typename LambdaType>
82 auto IsOws = [] (
int32 c) {
return (c ==
' ') | (c ==
'\t'); };
84 const char* Cursor = Headers.
GetData();
85 const char*
End = Cursor + Headers.
Len();
99 const char*
Right = Cursor + 1;
110 const char*
Left = Cursor + 1;
114 for (; Cursor >
Left + 1 &&
IsOws(Cursor[-1]); --Cursor);
118 if (!Lambda(Name,
Value))
127 }
while (Cursor <
End);
202 int16 HeaderRight = -1;
203 int8 MethodLength = -1;
210 check(MethodLength < 0);
212 *
this << Method <<
" " << Path <<
" HTTP/1.1" "\r\n";
213 MethodLength =
int8(Method.
Len());
222 check(HeaderRight < 0);
223 *
this << Key <<
":" <<
Value <<
"\r\n";
268 AlreadySent +=
uint16(Result);
285 using FRequest::FRequest;
300 int64 ContentLength = -1;
302 int16 MessageLeft = -1;
303 int16 MessageRight = -1;
305 uint8 bKeepAlive : 1;
313 return (MessageRight > 0) ? bKeepAlive :
true;
319 check(StatusCode >= 100);
327 const char* Cursor =
GetData() + MessageLeft;
335 return ContentLength;
341 check(MessageRight > 0);
352 UE::IoStore::HTTP::EnumerateHeaders(Headers, Sink);
358 return GetData() + MessageRight;
369 ::memcpy(&Candidate, Cursor + i - 4,
sizeof(Candidate));
370 if (Candidate == 0x0a0d0a0d)
375 i += (Cursor[i - 1] > 0x0d) ? 3 : 0;
390 static const uint32 PageSize = 256;
406 if (Dest - 3 >=
GetData() + MessageLeft)
430 const char* Cursor =
GetData() + MessageLeft;
461 ContentLength = int32(CrudeToInt(Value));
462 Flags |= Flag_Length;
467 bChunked = Value.Equals(
"chunked", ESearchCase::IgnoreCase);
468 Flags |= Flag_XferEnc;
473 bKeepAlive = !Value.Equals(
"close", ESearchCase::IgnoreCase);
474 Flags |= Flag_Connection;
483 if (!bChunked)
return FOutcome::Error(
"Unsupported Transfer-Encoding");
489 if (ContentLength < 0)
return FOutcome::Error(
"Invalid Content-Length field",
uint32(ContentLength));
517 using FStatusHeaders::FStatusHeaders;
523 enum class EState :
uint8 { Init, Recv, Prologue, Chunk, Epilogue,
Done };
534 EState State = EState::Init;
547 return (State == EState::Recv) ? Remaining : -1;
562 case EState::Init:
Outcome = Init(Dest, Peer);
break;
563 case EState::Recv:
Outcome = Recv(Dest, Peer);
break;
564 default:
Outcome = Gather(Dest, Peer);
break;
570 State = EState::Done;
587 case EState::Prologue:
Outcome = Prologue(Dest, Peer);
break;
588 case EState::Chunk:
Outcome = Chunk(Dest, Peer);
break;
589 case EState::Epilogue:
Outcome = Epilogue(Dest, Peer);
break;
606 Dest = Dest.
Mid(Result);
634 check(Remaining == 0);
635 State = EState::Prologue;
640 check(Remaining > 0);
641 State = EState::Recv;
656 Overspill = Overspill.
Mid(
Size);
658 if (Remaining == 0 || Dest.
IsEmpty())
665 auto* Cursor = (
char*)(Dest.
GetData());
711 if ((c -
'0' >= 10) & (c -
'a' >= 6) & (c -
'A' >= 6))
730 const char*
Header =
nullptr;
732 int32 HeaderLength = 0;
748 HeaderLength =
Outcome.GetResult();
749 Overspill = Overspill.
Mid(HeaderLength);
752 if (HeaderLength == 0)
768 char* Cursor = (
char*)View.
GetData();
777 char* Cursor = (
char*)View.
GetData();
786 HeaderLength =
Outcome.GetResult();
787 Overspill = View.
Mid(HeaderLength);
794 if (ChunkSize > 16 << 20)
return FOutcome::Error(
"Unacceptable chunk size");
798 Remaining = EndOfXfer;
800 State = EState::Epilogue;
801 return Epilogue(Dest, Peer);
804 Remaining = ChunkSize;
805 State = EState::Chunk;
806 return Chunk(Dest, Peer);
812 check(Remaining != 0);
814 Dest = Dest.
Left(Remaining);
815 FOutcome
Outcome = Recv(Dest, Peer);
821 check(Remaining == 0);
823 State = EState::Epilogue;
840 check(Remaining <= 0);
851 if (Cursor[0] !=
'\r' || Cursor[1] !=
'\n')
853 return FOutcome::Error(
"Trailing headers are not supported (ERRTRAIL)");
858 State = EState::Prologue;
859 return Prologue(Dest, Peer);
874 using DetailOne::FBody::FBody;
902#define TR_METHOD(x, ...) \
903 template <typename... Arg> auto x(Arg&&... Args) __VA_ARGS__ { \
904 if (auto Self = UPTRINT(this); Self & 1) \
905 return ((FTransactionTwo*)(Self ^ 1))->x(Forward<Arg>(Args)...); \
906 return ((FTransactionOne*)this)->x(Forward<Arg>(Args)...); \
930 void* Addr = (
void*)(
Self ^ 1);
968 check((Ptr & 1) == 0);
974 Swap(Self, Rhs.Self);
992 return Get() !=
nullptr;
1002FTransaction* FTransactRef::Get()
1004 return (FTransaction*)Self;
1031#if IAS_HTTP_WITH_TWO
#define check(expr)
Definition AssertionMacros.h:314
return Self
Definition CocoaThread.cpp:337
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
TStringView< ANSICHAR > FAnsiStringView
Definition StringFwd.h:46
#define TR_METHOD(x,...)
Definition TransactionOne.inl:902
uint32 Offset
Definition VulkanMemory.cpp:4033
uint32 Size
Definition VulkanMemory.cpp:4034
if(Failed) console_printf("Failed.\n")
memcpy(InputBufferBase, BinkBlocksData, BinkBlocksSize)
Definition AndroidPlatformMisc.h:14
constexpr DataType * GetData() const
Definition MemoryView.h:68
constexpr TMemoryView Left(uint64 InSize) const
Definition MemoryView.h:83
constexpr bool IsEmpty() const
Definition MemoryView.h:77
TMemoryView Mid(uint64 InOffset, uint64 InSize=TNumericLimits< uint64 >::Max()) const
Definition MemoryView.h:115
constexpr uint64 GetSize() const
Definition MemoryView.h:74
constexpr int32 Len() const
Definition StringView.h:174
constexpr const CharType * GetData() const
Definition StringView.h:160
Definition TransactionOne.inl:137
void AdvanceUsed(uint32 Delta)
Definition TransactionOne.inl:179
const char * GetData() const
Definition TransactionOne.inl:161
uint32 GetSize() const
Definition TransactionOne.inl:167
FMutableSection GetMutableFree(uint32 MinSize, uint32 PageSize=256)
Definition TransactionOne.inl:173
FBase()
Definition TransactionOne.inl:155
Definition TransactionOne.inl:515
FOutcome TryRecv(FMutableMemoryView Dest, FTlsPeer &Peer)
Definition TransactionOne.inl:551
int64 GetRemaining() const
Definition TransactionOne.inl:545
Definition TransactionOne.inl:189
void Begin(FAnsiStringView Host, FAnsiStringView Method, FAnsiStringView Path)
Definition TransactionOne.inl:208
FOutcome TrySendRequest(FTlsPeer &Peer)
Definition TransactionOne.inl:252
FTransactId End(bool bKeepAlive)
Definition TransactionOne.inl:227
void AddHeader(FAnsiStringView Key, FAnsiStringView Value)
Definition TransactionOne.inl:220
void AdvanceUsed(uint32 Delta)
Definition Misc.inl:467
FMutableSection GetMutableFree(uint32 MinSize, uint32 PageSize=256)
Definition Misc.inl:453
uint32 GetSize() const
Definition Misc.inl:420
const char * GetData() const
Definition Misc.inl:414
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 WaitBuffer(int32 Result=0)
Definition Misc.inl:131
static FOutcome None()
Definition Misc.inl:80
static FOutcome Waiting(int32 Result=0)
Definition Misc.inl:122
FOutcome Send(const char *Data, int32 Size)
Definition Peer.inl:492
FOutcome Recv(char *Out, int32 MaxSize)
Definition Peer.inl:503
Definition TransactionOne.inl:945
bool IsValid() const
Definition TransactionOne.inl:990
FTransactRef(const FTransactRef &)=delete
const FTransaction * operator->() const
Definition TransactionOne.inl:978
FTransactRef(FTransactRef &&)=delete
~FTransactRef()
Definition TransactionOne.inl:1008
void operator=(const FTransactRef &Rhs)=delete
Definition TransactionOne.inl:872
Definition TransactionTwo.inl:897
Definition TransactionOne.inl:900
@ IgnoreCase
Definition CString.h:26
const TCHAR * Name
Definition OodleDataCompression.cpp:30
FOutcome HandshakeOne(FTlsPeer &, void *)
Definition TransactionOne.inl:880
bool IsStatusCodeOk(uint32 StatusCode)
Definition TransactionTwo.inl:18
FTransactRef CreateTransactOne(void *&)
Definition TransactionOne.inl:1021
FOutcome TickOne(FTlsPeer &, void *)
Definition TransactionOne.inl:886
bool IsContentless(uint32 StatusCode)
Definition TransactionTwo.inl:12
void GoAwayOne(FTlsPeer &, void *)
Definition TransactionOne.inl:892
uint32 FTransactId
Definition TransactionTwo.inl:9
FTransactRef CreateTransactTwo(void *PeerData)
Definition TransactionOne.inl:1029
UE_STRING_CLASS Result(Forward< LhsType >(Lhs), RhsLen)
Definition String.cpp.inl:732
static FORCENOINLINE CORE_API void Free(void *Original)
Definition UnrealMemory.cpp:685
char * Data
Definition Misc.inl:346
Definition TransactionOne.inl:10
uint8 Message
Definition TransactionOne.inl:12
uint16 Headers
Definition TransactionOne.inl:13
uint8 StatusCode
Definition TransactionOne.inl:11