Фантомные байты в HTTP ответе

Пытаюсь получить и обработать бинарные данные с сервера. Но в ответе берутся лишние 10 байт.
Вот пример голого ответа, с заголовками и символами. Тело - те самые, нужные 10 нулевых байт.


Код получения и обработки ответа.

            if(_httpResponseCode == 200) {

                WiFiClient *stream = http.getStreamPtr();

                int available = stream->available();

                Serial.print("Available ");
                Serial.println(available);

                //Allocating memory for the response buffer
                uint8_t* _result_bufer = new uint8_t[available];

                //Reading all bytes from the stream and writing to the buffer
                stream->readBytes(_result_bufer, available);


                //Printing all received bytes to the console
                for(int bytesRead = 0; bytesRead < available ; bytesRead++){
                    Serial.printf("%02X ", _result_bufer[bytesRead]);
                }

                _result = _result_bufer;
                Serial.println();
                Serial.print("Total bytes reads: ");
                Serial.println(bytesRead);
            }

available возвращает 20.
4 пары байт это - переноса строк CL LF(выделил синим) 2 байта вообще неясные.
Вот результат работы кода, зеленым - это те самые 10 нужных байт.


Откуда это все? в ответе нет столько переносов даже.

А так?

uint8_t* _result_bufer = new uint8_t[available];
memset(_result_bufer , 0x00, available);
...

Без изменений. Явно фонит библиотека.
При том, если тело 0 байт, то ничего не приходит. А если хотя бы 1 байт, то приходит уже 11.
Можно вырезать конечно, но доверять такому коду сложно, учитывая что при большем теле (например в 20 байт), появляется еще один байт вначале, то есть 11 байт фантомных.

Я бы ещё попробовал статический буфер.

Т.е., конечно, всё указывает на то, что прилетают такие данные уже из стрима, но, с другой стороны, если библиотека была глючная, то об этом все уже знали.

Я со статики и начинал, долго не мог понять, что за каша мне приходит.
Менял платы, менял точки доступа, сервера, проблема остается. Грешу еще на компиляцию на винде. Забавно, что http.getString() работает как надо, лишнее не отдает. А вот с потоком проблема.

В интернете мало инфы по чтению из потока, по сути одна статья. Думал, может есть какие-то параметры дополнительные, которые используют, а то страшно как-то в исходники лезть.

С сервера вайршарком смотрели, что улетает?

На какой хрен в 2023м году вы все лезете вручную разбирать HTTP? Возьми БИБЛИОТЕКУ и НЕ УСЛОЖНЯЙ СЕБЕ ЖИЗНЬ.

1 лайк

cURL - ом смотрел, было все ок…

Но причину все же нашел, спустя 4 дня мучений. )))
Ответ от сервера должен содержать заголовок “Content-Length”, с размером тела. без него штормит библиотеку.
8266 такая же проблема.

Спасибо!