Конец HTTP-заголовка

Я пытаюсь создать программу, которая будет определять конец заголовка. Теперь я знаю, что заголовки http заканчиваются пустой строкой, как сказано в Обнаружить конец заголовка HTTP-запроса на получение (java), однако, насколько я понимаю, это не всегда так.

Например. в multipart у вас есть тип содержимого с границей, и в этой границе есть пустое пространство, например

Reading line: POST /hello:hello HTTP/1.1
Reading line: bla: bla
Reading line: Content-Type: multipart/form-data; boundary=--------------------------276559868742390689469124
Reading line: cache-control: no-cache
Reading line: Postman-Token: be8db757-81f4-49db-9187-30d66d0dd3d5
Reading line: User-Agent: PostmanRuntime/7.1.5
Reading line: Accept: */*
Reading line: Host: localhost:8080
Reading line: accept-encoding: gzip, deflate
Reading line: content-length: 498
Reading line: Connection: keep-alive
Reading line: 
Reading line: ----------------------------276559868742390689469124
Reading line: Content-Disposition: form-data; name = ""; filename = "TimeComplexity.txt"
Reading line: Content-Type: text/plain

поэтому очевидно, что поиск пустого места, похоже, не работает каждый раз. Однако я заметил, что Content-Type, за которым следует пробел, всегда кажется концом HTTP-заголовка, это правильно? а если нет, то какие еще есть решения? за исключением извлечения длины содержимого и извлечения содержимого перед заголовком, это кажется .. медленным. Могу также упомянуть, что я пытаюсь разобрать сообщение на java, но я бы не возражал против примеров на других языках, если вы вставляете какой-либо код, однако я пытаюсь понять это теоретически, я считаю, что смогу справиться с остальным.

Заранее спасибо!

"заголовки http заканчиваются пустой строкой ... это не всегда так" Неправильно. Заголовки ВСЕГДА заканчиваются пустой строкой. "поиск пустого места не работает каждый раз" Верно, потому что пробелы не используются в заголовках HTTP. "Content-Type, за которым следует пробел, всегда кажется концом HTTP-заголовка, это правильно?" Нет. boundary, следующий за Content-Type, является часть с тем же заголовком. Это атрибут этого заголовка. Заголовок заканчивается CRLF, его атрибуты (если есть) разделяются ;. Пробелы между элементами синтаксиса заголовка не обязательны.

Remy Lebeau 22.05.2018 09:45
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
728
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Заголовки HTTP могут быть в любом порядке. Каждый заголовок заканчивается CRLF, а после последнего заголовка идет один CRLF, создающий пустую строку. Это означает, что заголовков больше нет. Остальное - это тело сообщения HTTP. См. RFC 2616 для спецификации протокола HTTP.

Ваш последний HTTP-заголовок - это заголовок Connection. Следующие основные данные (размером 498 байт) представляют собой данные MIME в формате multipart/form-data. MIME похож на HTTP, поскольку у него также есть заголовки и тело, разделенные пустой строкой. Но MIME также имеет границы, разделяющие разные разделы данных MIME, и каждый раздел имеет свои собственные заголовки и тело. См. RFC 2045 г. - 2047, 7578 и другие RFC, связанные с MIME.

но как это может быть? Три последние строки не являются частью исходного файла.

Kavzor 21.05.2018 13:25

Файл не передается как есть, а кодируется как multipart / form-data (как вы можете видеть в типе содержимого), см. tools.ietf.org/html/rfc7578. HTTP 1.1 - это текстовый протокол, поэтому тело сообщения обычно каким-то образом закодировано.

ewramner 21.05.2018 14:02

Итак, в основном вы говорите о том, что при синтаксическом анализе следует обрабатывать multipart / form-data по-разному? Или декодирование должно быть частью ответственности получателей / клиентов?

Kavzor 21.05.2018 14:08

Если вы имеете в виду отличное от обычного текста, то да. Если вы пишете новый HTTP-клиент общего назначения, вы несете ответственность за декодирование тела, большинство других клиентов могут это сделать, и вам нужна граница из заголовка для анализа тела. Если у вас очень специализированное использование, вы можете обойтись без синтаксического анализа.

ewramner 21.05.2018 14:34

Фактически работаю над написанием версии сервлетов для сокетов, чтобы лучше понимать потоки и http. Большое спасибо, ewramner, быстрые и чистые ответы

Kavzor 21.05.2018 14:39

@ewramner "HTTP 1.1 - это текстовый протокол" - нет, это не так. Он имеет текстовые элементы (строки запроса / состояния, заголовки и т. д.), Но сам по себе не является текстовым протоколом (и даже ведется работа по превращению заголовков HTTP в двоичные данные для лучшей машинной обработки). Тело HTTP - это произвольные данные, отправитель должен решить, как они кодируются (если вообще), а получатель декодирует тело на основе заголовков. multipart/form-data - это одна из возможных кодировок данных тела, но она не влияет на сам HTTP. HTTP - это просто транспорт, MIME - это кодировка переносимых данных.

Remy Lebeau 22.05.2018 09:09

@Kavzor вам нужен HTTP-движок для обработки передачи произвольных данных. Вам нужен механизм MIME для обработки переносимых данных MIME. Вам нужен анализатор текста для обработки транспортируемого текста. Парсер изображений для обработки транспортируемых изображений. И так далее. Написание HTTP-клиента - это ОГРОМНАЯ работа, в которой МНОГО разных частей работают вместе.

Remy Lebeau 22.05.2018 09:27

@RemyLebeau была причина, по которой я написал HTTP 1.1, а не только HTTP, двоичные заголовки находятся в 2.0. Не будем срезать волосы. Я бы все равно описал HTTP 1.1 как основанный на тексте, хотя тело может быть двоичным, но важным моментом было то, что тело, возможно, нужно обрабатывать по-разному в зависимости от типа контента.

ewramner 22.05.2018 09:44

Другие вопросы по теме