Похоже, вы нашли ошибку.
Как вы заметили, для запросов POST вызывается функция recv_data
, которая проверяет заголовок Content-Length и считывает столько байтов из сокета. , Однако для запросов PUT он использует только Trail
, то есть данные, которые уже были получены при чтении заголовков HTTP-запроса. (Это происходит в функции receive_headers
, которая отправляет длину 0 в функцию recv
, что означает, что она не будет ждать какого-либо определенного количества c данных.)
Сколько из тело запроса будет зависеть от размера заголовков, а также от способа отправки запроса клиентом. Например, если клиент сначала отправляет заголовки в одном сетевом пакете, а затем тело запроса в следующем сетевом пакете, ejabberd вообще не получит тело запроса.