@mebrunet: Aha, this is exactly why I asked the question. I should have nipped it in the bud yesterday to save you the probably migraine-inducing debug session of diffing these two TCP streams. If you still have the streams or can recreate them, look at the individual TCP packets and see if Safari sends two packets: one with the HTTP header only, and one with the request body. This is the issue I ran into with my react-native app and posted about here:
Basically, the requests are reconstructed by every debugging tool to be nearly identical apart from a few inconsequential headers because they ARE valid. The problem is that the HTTP server doesn't treat them the same at the packet level. Hopefully, that's what you're running into as well.