Почему Ejabberd по-разному обрабатывает запросы PUT и POST? - PullRequest
1 голос
/ 17 марта 2020

Это, кажется, вызывает странное поведение, когда PUT имеет тело, превышающее определенную длину (в моем случае это 902 байта), т.е. ejabberd обрезает тело (в моем случае он получает искаженный JSON).

Ссылка на Github: https://github.com/processone/ejabberd/blob/master/src/ejabberd_http.erl#L403

Если я изменю оператор case на:

        case Method of
        _AnyMethod ->
            case recv_data(State) of
            {ok, Data} ->
                LQuery = case catch parse_urlencoded(Data) of
                     {'EXIT', _Reason} -> [];
                     LQ -> LQ
                     end,
                {State, {LPath, LQuery, Data}};
            error ->
                {State, false}
            end
        end

, тогда тело будет проанализировано правильно.

Это проблема конфигурации? Как я могу заставить Ejabberd правильно разобрать тело JSON?

1 Ответ

2 голосов
/ 17 марта 2020

Похоже, вы нашли ошибку.

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

Сколько из тело запроса будет зависеть от размера заголовков, а также от способа отправки запроса клиентом. Например, если клиент сначала отправляет заголовки в одном сетевом пакете, а затем тело запроса в следующем сетевом пакете, ejabberd вообще не получит тело запроса.

...