[Bug] PerformHttpRequest silently drops the response body (and headers) above ~10 MB #96
Closed
Pedro-Lucas14
started this conversation in
[BUG] FiveM for GTAV Enhanced
Replies: 2 comments 1 reply
|
Thanks, we are looking into this. |
0 replies
|
A fix for this bug has been implemented and is available in the latest patch. Please try again and let us know if the issue persists. Thanks for your help! |
1 reply
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Summary
cfx-server.exe),PerformHttpRequestinvokes its callback withstatus = 200butdata = niland no headers table whenever the HTTP response is larger than roughly 10 MB. Responses at 8 MB and below arrive intact.errorDatais empty and nothing is written to the console, so a resource cannot distinguish this from a legitimately empty response. The failure is completely silent.FXServer.exebinary, at every size tested up to 32 MB — so this is a regression, not a long-standing limit.Issue type
Server
Repro rate
Always
Server build version
FXServer-early-access b92 win32
OS
No response
CPU
No response
GPU
No response
RAM
No response
Storage type
None
Connection type
None
ISP and bandwidth
No response
DxDiag
No response
Network graph
No response
Platform
Windows
OS version / distribution
Windows Server 2022
CPU
AMD Ryzen 9
RAM
128 GB DDR4
Using txAdmin?
No
Hosting provider
Self-hosted
Machine type
Dedicated
/perf endpoint output
Not relevant to this repro — it is a single loopback HTTP request on an otherwise idle
server, and it fails identically on a freshly started server with only the repro resource
loaded. No DDoS protection or rate limiting sits between the two processes; both run on
the same host over
127.0.0.1.DDoS protection
No response
ulimit -n value (Linux only)
No response
Docker Compose file (Docker only)
No response
Steps to Reproduce
httpsize_repro.node payload-server.js(Node corehttponly, no npm install).ensure httpsize_reprohttpsizetestin the server console.payload-server.js— answersGET /<megabytes>with exactly that many megabytes and an accurateContent-Length:server.lua:fxmanifest.luais justfx_version 'cerulean',game 'common',server_script 'server.lua'.Expected Behavior
The callback receives the complete body, matching the advertised
Content-Length, as itdoes on the legacy binary at all sizes up to 32 MB.
If a response-size cap is intentional on the new binary, the failure should surface as an
error status, a non-empty
errorData, or at minimum a console warning — not as asuccessful-looking
200withnildata.Actual Behavior
Above ~10 MB the callback fires with
status = 200,data = nil, and no headers table.errorDatais empty. Nothing is logged.Actual Behavior
Above ~10 MB the callback fires with
status = 200,data = nil, and no headers table.errorDatais empty. Nothing is logged.Evidence
Enhanced binary (
cfx-server.exe) — fails from 10 MB on:Legacy binary (
FXServer.exe), same machine, same payload server — all sizes intact:Exact cut-off, bisected byte by byte on the Enhanced binary:
Independent confirmation that the payload server itself is fine — same endpoint, same
sizes, fetched with PowerShell on the same machine:
Additional Context
Two things worth noting for whoever picks this up:
8 MB success. The transfer looks aborted as soon as the limit is crossed, rather than
read to completion and then discarded.
Content-Lengthcomes backnilon the failing sizes, so the callback cannot even inspect what it was supposed toreceive.
Response size is the only trigger we could find. We ruled out name resolution by running
the same sweep against both
http://127.0.0.1:8899/andhttp://localhost:8899/— bothfail at exactly the same threshold.
Real-world impact for us: our framework loads its startup caches over HTTP from a local
database proxy. Two of those responses are 24.7 MB and 11.6 MB, and both came back empty
on the new binary, so the identifier cache never populated and no player could
authenticate — with no error anywhere to explain why. We have worked around it by
paginating those queries into ~1.4 MB chunks, but any resource fetching a large payload
over HTTP will hit this and get no diagnostic at all.
All reactions