Стиль розриву заголовка рядка HTTP


161

Який стиль розриву рядків є кращим для використання в заголовках HTTP: \r\nабо \nі чому?

Відповіді:


224

\r\n, оскільки він визначається як розрив рядка в специфікації протоколу. RFC2616 говорить на початку розділу 2.2 "Основні правила" досить однозначно:

CR = <CR-US-ASCII, повернення каретки (13)>
LF = <US-ASCII LF, передача рядків (10)>
HTTP / 1.1 визначає послідовність CR LF як маркер кінцевого рядка для всіх елементів протоколу, крім сутності -тіла

RFC2616 технічно застарів RFC7230, але він не вносить кардинальних змін і знову закликає CRLF як роздільник, в розділі 3 , і що посилання RFC посилається на RFC5234, додаток B.1, щоб визначити "CRLF" як %x0D %x0A.

Однак, визнаючи, що люди порушують стандарт для будь-яких цілей, в розділі 19.3 є "положення про толерантність" (зауважте, що воно повторює правильну послідовність):

Термінальним рядком для полів заголовка повідомлень є послідовність CRLF. Однак ми рекомендуємо, щоб програми, розбираючи такі заголовки, розпізнавали один LF як термінальний рядок і ігнорували провідний CR.

У новій RFC7230, § 3.5

Хоча термінальний рядок для полів початкового рядка та заголовка є послідовністю CRLF, одержувач МОЖЕ розпізнати один LF як термінальний рядок і ігнорувати будь-який попередній CR.

Тому, якщо ви не хочете бути Злом або порушити іншим чином правила RFC, використовуйте \r\n.


@Fred: Ні, є таке поняття, як занадто очевидне - непотрібне повторення та зайве повторення та безглуздо повторення тієї ж інформації затьмарює повідомлення. Особливо, коли те саме процитується прямо вище - від специфікації, не менше.
Пісквор вийшов з будівлі

2
Гарна чітка відповідь. Саме для цього найкраще підходить StackOverflow: прості чіткі відповіді на прості чіткі запитання, без зайвих і непосидних захаращень блогів та статей.
Майлз Рут


2
@Pacerier: взагалі не згадується про таке; оскільки він по суті визначає "це єдиний дійсний синтаксис для HTTP", все інше є недійсним синтаксисом. Звичайно, ти можеш порушити RFC все, що хочеш, нікого не може тебе зупинити - але тоді ти технічно вже не реалізуєш HTTP-клієнт, просто щось подібне;)
Piskvor вийшов з будинку

2
RFC7230, який застаріло RFC2616, містить той самий текст у розділі 3.5
горе

22

\ r \ n тому, що RFC 2616 говорить так (Розділ 2.2, "Основні правила"):

HTTP / 1.1 визначає послідовність CR LF як маркер кінця рядка для всіх
елементів протоколу, за винятком суті-тіла (див. Додаток 19.3 для
толерантних додатків). Маркер кінця рядка в тілі суб'єкта визначається його асоційованим типом медіа, як описано в розділі 3.7.

   CRLF           = CR LF

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.