2013-07-07 2 views
14

Нормальный ответ HTTP выглядит следующим образом:Может ли HTTP-ответ пропустить фразу разума?

HTTP/1.0 200 OK 

Можно ли пропустить то, что RFC называет Reason-Phrase? Что-то вроде:

HTTP/1.0 200 

RFC, говорит:

Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF 
Reason-Phrase = *<TEXT, excluding CR, LF> 

Я понимаю это так:

  • пустая строка OK для Reason-Phrase
  • Но должен быть пробел после Статусного кода в любом случае

Так следующее было бы справедливо:

HTTP-Version SP Status-Code SP CRLF 

ли я понимаю RFC правильно?

+0

Почему опустить? Если вы ищете экономию байтов, превышающую размер записи, просто используйте [SPDY] (http://en.wikipedia.org/wiki/SPDY). – josh3736

+0

@josh Создание библиотеки, позволяющей пользователю установить код ответа.Если пользователь устанавливает код экзотического ответа, мне придется выбирать между тем, чтобы оставить пустую строку, установив некоторого короля 'UNKNOWN' Reason-Phrase или заставив пользователя установить фразу разума. – Benjamin

+0

FWIW, базовая HTTP-библиотека Node (и, следовательно, большинство вещей, построенных на нем, например Express) [по умолчанию отправляет строку 'unknown' как фразу разума] (https://github.com/joyent/node/blob/v0. 10.12/lib/http.js # L1119), когда автор устанавливает код экзотического статуса и не содержит строку причины. – josh3736

ответ

14

Это выглядит так, если вы читаете * как «ноль или больше символов», как в регулярных выражениях.

кажется, имеют немного другой смысл, если вы читаете Notational Convention из RFC:

*rule

The character "*" preceding an element indicates repetition. The full form is "<n>*<m>element" indicating at least <n> and at most <m> occurrences of element. Default values are 0 and infinity so that "*(element)" allows any number, including zero; "1*element" requires at least one; and "1*2element" allows one or two.

Таким образом, хотя это не регулярное выражение, смысл, по существу, одна и та же. Астерикс, не имеющий конечного числа в этом случае, означает, что могут быть «0 или более» «тексты». Нечетный способ выразить это, но, похоже, вы правы.

Строго говоря, пробел -, хотя я думаю, что разделитель может быть опущен, если нечего отделять. Это может убить клиентов, которые имеют строгую реализацию, однако, если они просто разделили эту строку на пробелы и попытались прочитать элемент, в котором должно быть описание. Но опять же, эти клиенты должны были использовать некоторые защитные программы, чтобы поймать эту ситуацию. ;)

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

+0

Спасибо, это полезно. – Benjamin

Смежные вопросы