RUDE

OpenSSL BIO_read неверен

Это код, как я читаю ответ на мой HTTPS-запрос:

int len = 0;
f = fopen("response.txt", "wb");
do
{
    char buff[1534];
    len = BIO_read(bio, buff, sizeof(buff));

    if (len > 0) {
        fwrite(buff, sizeof(char), len, f);
    }

} while (len > 0 || BIO_should_retry(bio));
fclose(f);

Ответ должен быть «свернутым» JSON (без новых строк), но по какой-то причине я вижу некоторые «случайно» вставленные \r\n, если я смотрю на ответ с помощью HEX-редактора:

Изображение

33 35 2C 2D 31 31 35 0D 0A 31 30 30 30 0D 0A

Это выдержка из массива JSON, поэтому вместо \r\n должно быть просто ,.

Также тело ответа HTTP содержит некоторые странные символы перед фактическим JSON:

Изображение

HTTP/1.1 201 Created
Server: nginx/1.21.3
Date: Wed, 04 May 2022 11:22:22 GMT
Content-Type: application/json; charset=utf-8
Transfer-Encoding: chunked
Connection: close
Location: http://myserver.de/my/endpoint
api-supported-versions: 1.0

1f1b

Между массивом JSON (только с числами) есть три символа, которых там быть не должно:

Изображение

Ead

И после JSON есть дополнительный 0, которого там быть не должно:

Изображение

0.

Единственная причина, о которой я могу думать, это какое-то нарушение ограничения памяти.

Возвращенный JSON правильный, за исключением упомянутых ошибок, и у бэкэнда нет проблем с запросом, поэтому я предполагаю, что он правильный.

Любые идеи, как я могу это исправить?


18
1

Ответ:

Решено

Это произошло потому, что мой заголовок запроса HTTP/1.1

POST /my/endpoint HTTP/1.1
Host: localhost
Content-Type: multipart/form-data; boundary=123456
Content-Length: 83031
Connection: close

Если я изменю его на HTTP/1.0, артефакты исчезнут.