170 похожих чатов

ContentLength в объекте запроса репрезентует заголовок Content-Length. Но этот заголовок

репрезентует длину тела сообщения, а не длину самой сущности. Разница в том, что тело сообщения может быть закодировано, например, сжато условным gzip. Тело сущности - декодированное тело сообщения. Я в своем фреймворке пользователю подаю сразу готовенькое и декодированное. В таком случае, ContentLength может не соответствовать реальному количеству байт, прочитанных из тела. Это может создать проблемы для пользователя?

21 ответов

24 просмотра

А как условный прокси сервер написанный на фреймворке должен это корректно обработать?

А если нету заголовка Content-Length?

Подозреваю, что когда прокси-сервер жмет в gz, он и переписывает этого заголовок на новое значение?

Andrey S
А если нету заголовка Content-Length?

он разве не обязательный по протоколу?

судя по спеке вы не должны модифицировать программно это значение, если верно вас понял

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

Maxim Biryukov
Какой клиент?

Который дергает ручку

Владимир Гришин
Который дергает ручку

Клиент который дёргает ручку никак не увидит что внутри фреймворка переписали хидер с длиной, более того автор вопроса про переписывание и не писал

А зачем такие сложности? Чтобы два раза не аллоцировать тело?

Павλо-🇺🇦 Автор вопроса
Andrey S
А если нету заголовка Content-Length?

если не указан Connection: close, то тело будет обработано, как следующий запрос. Что, вероятнее всего, приведет к ошибке парсинга

Павλо-🇺🇦 Автор вопроса
Andrey Likhachev
А зачем такие сложности? Чтобы два раза не аллоцир...

не в аллокациях, а дизайне вопрос. Например, ожидает ли пользователь, что request.ContentLength будет строго равен размеру прочитанного тела?

Павλо-🇺🇦 Автор вопроса
Alex
Подозреваю, что когда прокси-сервер жмет в gz, он ...

ну да, Content-Length должен быть равен длине тела сообщения, а не сущности. Иными словами - фактический размер передаваемых данных

Павλо-🇺🇦 Автор вопроса
Александр Костюченко
судя по спеке вы не должны модифицировать программ...

нет, значение я модифицировать не буду, да и не смогу

Если писать прокси, то 1) потерялось значение content length, и передавать его дальше неверно, и об этом надо капсом в доке писать 2) фреймворк задекодил тело, теперь нужно руками энкодить, если нужно было со сжатием или в точности передать тело - некруто, лишняя работа 3) можно было как то хитро использовать io.CopyBuffer с буфером зависимым от length, это теперь тоже нельзя делать 4) явное поведение лучше неявного

Павλо-🇺🇦 Автор вопроса
Maxim Biryukov
Если писать прокси, то 1) потерялось значение co...

вот прокси как раз может спокойно модифицировать запрос, такое поведение будет некорректным для гейтвея

Павλо 🇺🇦
не в аллокациях, а дизайне вопрос. Например, ожида...

Да. Стабильно будет проверять. Еще есть вариант с посылкой частями. Это же часть протокола.

А range-bytes поддерживаешь?)

Павλо-🇺🇦 Автор вопроса
Roman Timofeev
А range-bytes поддерживаешь?)

это разве не для отдачи данных сервером?

Павλо 🇺🇦
это разве не для отдачи данных сервером?

Оно самое, да. Способ клиента сказать какой диапазон байт ему нужен

Павλо-🇺🇦 Автор вопроса
Roman Timofeev
Оно самое, да. Способ клиента сказать какой диапаз...

у меня есть всего одна точка, в которой это можно поддерживать (и там оно не поддерживается)

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта