diff --git a/FFXIVClientStructs/FFXIV/Client/SupportDesk/HttpConnection.cs b/FFXIVClientStructs/FFXIV/Client/SupportDesk/HttpConnection.cs
index 70de340fbb..a61f840b6f 100644
--- a/FFXIVClientStructs/FFXIV/Client/SupportDesk/HttpConnection.cs
+++ b/FFXIVClientStructs/FFXIV/Client/SupportDesk/HttpConnection.cs
@@ -7,11 +7,20 @@ public unsafe partial struct HttpConnection {
[VirtualFunction(0)]
public partial HttpRequest* Dtor(byte freeFlags);
- // Initializes the HTTP session.
+ /// Initializes the HTTP session.
[VirtualFunction(1)]
public partial void OpenSession();
- // Cleans up the HTTP session.
+ /// Cleans up the HTTP session.
[VirtualFunction(2)]
public partial void CloseSession();
+
+ /// Creates a new HTTPRequest.
+ /// URL to make a request to.
+ /// The HTTP verb, such as "GET" or "POST".
+ /// Any request data to send (only relevant for POST requests really).
+ /// Length of the data buffer.
+ /// The new HTTPRequest handle if it could be successfully created.
+ [VirtualFunction(4)]
+ public partial HttpRequest* MakeRequest(byte* url, byte* verb, byte* data, ulong dataLength);
}
diff --git a/FFXIVClientStructs/FFXIV/Client/SupportDesk/HttpConnectionImpl.cs b/FFXIVClientStructs/FFXIV/Client/SupportDesk/HttpConnectionImpl.cs
index c6a8017a7b..615a838afd 100644
--- a/FFXIVClientStructs/FFXIV/Client/SupportDesk/HttpConnectionImpl.cs
+++ b/FFXIVClientStructs/FFXIV/Client/SupportDesk/HttpConnectionImpl.cs
@@ -6,5 +6,5 @@ namespace FFXIVClientStructs.FFXIV.Client.SupportDesk;
[Inherits]
[StructLayout(LayoutKind.Explicit, Size = 0x10)]
public unsafe partial struct HttpConnectionImpl {
- [FieldOffset(0x008)] void* SessionHandle; // HINTERNET
+ [FieldOffset(0x008)] public void* SessionHandle; // HINTERNET
}
diff --git a/FFXIVClientStructs/FFXIV/Client/SupportDesk/HttpRequest.cs b/FFXIVClientStructs/FFXIV/Client/SupportDesk/HttpRequest.cs
index f1be72157a..19cba0d1b6 100644
--- a/FFXIVClientStructs/FFXIV/Client/SupportDesk/HttpRequest.cs
+++ b/FFXIVClientStructs/FFXIV/Client/SupportDesk/HttpRequest.cs
@@ -6,4 +6,12 @@ namespace FFXIVClientStructs.FFXIV.Client.SupportDesk;
public unsafe partial struct HttpRequest {
[VirtualFunction(0)]
public partial HttpRequest* Dtor(byte freeFlags);
+
+ /// Updates various bits based on the current stage.
+ [VirtualFunction(1)]
+ public partial bool Update();
+
+ /// Cleans up the open handle.
+ [VirtualFunction(2)]
+ public partial bool CloseHandle();
}
diff --git a/FFXIVClientStructs/FFXIV/Client/SupportDesk/HttpRequestImpl.cs b/FFXIVClientStructs/FFXIV/Client/SupportDesk/HttpRequestImpl.cs
index d8d6c762d2..db98ed97df 100644
--- a/FFXIVClientStructs/FFXIV/Client/SupportDesk/HttpRequestImpl.cs
+++ b/FFXIVClientStructs/FFXIV/Client/SupportDesk/HttpRequestImpl.cs
@@ -6,10 +6,54 @@ namespace FFXIVClientStructs.FFXIV.Client.SupportDesk;
[Inherits]
[StructLayout(LayoutKind.Explicit, Size = 0x8C8)]
public unsafe partial struct HttpRequestImpl {
- [FieldOffset(0x010)] void* RequestHandle; // HINTERNET
- [FieldOffset(0x018)] void* ResponseData;
- [FieldOffset(0x020)] void* ResponseDataOffset;
- [FieldOffset(0x028)] void* ResponseDataSize;
- [FieldOffset(0x470)] void* OptionalData;
- [FieldOffset(0x480)] int Stage;
+ [FieldOffset(0x010)] public void* RequestHandle; // HINTERNET
+ [FieldOffset(0x018)] public byte* ResponseData;
+ [FieldOffset(0x020)] public long ResponseDataOffset;
+ [FieldOffset(0x028)] public ulong ResponseDataSize;
+ [FieldOffset(0x470)] public byte* OptionalData;
+ [FieldOffset(0x480)] public HttpRequestStage Stage;
+ [FieldOffset(0x48C)] public int StatusCode;
+ /// Increased by Framework.FrameDeltaTime every time Update is called.
+ [FieldOffset(0x8C0)] public float FrameDeltaTimeCounter;
+
+ /// Initializes and begins this request.
+ /// The HINTERNET handle to use.
+ /// URL to make a request to.
+ /// The HTTP verb, such as "GET" or "POST".
+ /// Any request data to send (only relevant for POST requests really).
+ /// Length of the data buffer.
+ /// Whether the request was successfully sent.
+ [MemberFunction("E8 ?? ?? ?? ?? 84 C0 75 ?? 48 8B 03 BA ?? ?? ?? ?? 48 8B CB FF 10 33 DB")]
+ public partial bool BeginRequest(void* sessionHandle, byte* url, byte* verb, byte* data, ulong dataLength);
+
+ /// Used as the WinHttp status callback.
+ /// Documentation for this callback can be found here.
+ [MemberFunction("48 85 D2 0F 84 ?? ?? ?? ?? 48 89 5C 24 ?? 56 57")]
+ public static partial void StatusCallback(void* requestHandle, HttpRequestImpl* context, uint internetStatus, void* statusInformation, uint statusInformationLength);
}
+
+public enum HttpRequestStage {
+ Unk0 = 0,
+ /// Set during BeginRequest.
+ Began = 1,
+ /// Used while and shortly after fetching the ContentLength and StatusCode headers from the response.
+ ReadingHeaders = 2,
+ /// Used while reading the response data.
+ ReadingData = 3,
+ /// Seen after FetchingData, and there's nothing more to read.
+ ReadAllData = 4,
+ Unk5 = 5,
+ Unk6 = 6,
+ /// Set for WINHTTP_CALLBACK_STATUS_HANDLE_CLOSING.
+ Closing = 7,
+ /// Set when the StatusCode is not 200 OK. Can also happen when WinHttpSendRequest is unsuccessful.
+ NotOk = 8,
+ Unk9 = 9,
+ Unk10 = 10,
+ Unk11 = 11,
+ Unk12 = 12,
+ Unk13 = 13,
+ /// Set for WINHTTP_CALLBACK_STATUS_SECURE_FAILURE.
+ SecureFailure = 14,
+}
+
diff --git a/ida/data.yml b/ida/data.yml
index 34517a678a..ec46c2c514 100644
--- a/ida/data.yml
+++ b/ida/data.yml
@@ -320,7 +320,6 @@ functions:
0x141C17880: lua_gethookmask
0x141C17A70: lua_sethook
0x141C17AA0: lua_setlocal
- 0x141CF2790: SupportDeskHttpCallback
0x141C59F10: SupportDeskCreateConnection
0x1418F20E0: luaL_openlibs
0x1418F22D0: luaL_addlstring
@@ -1013,11 +1012,14 @@ classes:
base: Client::SupportDesk::HttpConnection
funcs:
0x141CB27A0: Initialize
+ 0x141CF2790: StatusCallback # static
Client::SupportDesk::HttpRequest:
vtbls:
- ea: 0x142493A60
vfuncs:
0: dtor
+ 1: Update
+ 2: CloseHandle
Client::SupportDesk::HttpRequestImpl:
vtbls:
- ea: 0x1424938C8
@@ -11783,6 +11785,8 @@ classes:
- ea: 0x142410618
funcs:
0x141A42DD0: ctor
+ vfuncs:
+ 0: dtor
Client::UI::Misc::CharaViewPortrait:
vtbls:
- ea: 0x142198BA8