Недопустимые символы в заголовках HTTP

Я создаю HttpUrlConnection и вам нужно установить несколько настраиваемых заголовков.

Я хотел бы сделать что-то в следующем порядке, но содержимое карты заголовка должно происходить из одной строки. Существуют ли какие-либо символы, которые являются незаконными или крайне редко используются как в заголовках HTTP-заголовков, так и в значениях заголовков HTTP?

HashMap<String, String> headers = new HashMap<String, String>();

// TODO: How can I fill the headers map reliably from a single string?

HttpURLConnection c = (HttpURLConnection) url.openConnection();
for(Map.Entry<String, String> e : headers.entrySet())
    c.setRequestProperty(e.getKey(), e.getValue());

Решение на данный момент

Кажется, что имена заголовков HTTP не содержат пробелов (как правило, вместо них используется тире?), поэтому я могу отделить это имя со значением, используя одно пространство. Что касается наборов значений имен, кажется, что я завинчен, так как значение может содержать почти что угодно в соответствии с данным ответом. Поэтому я только что выбрал персонажа, которого, я уверен, скорее всего никогда не будет использовать: §. Если выяснится, что это действительно необходимо, мне просто нужно настроить свой код: p

Header1 Value1§Header2 Value2§Header3 Header3

Ответы

Ответ 1

Соответствующим BNF из RFC7230 является:

field-name = token

token = 1*tchar

tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" / "+" / "-" / 
        "." / "^" / "_" / "'" / "|" / "~" / DIGIT / ALPHA

Набор символов отображается USASCII.

RFC 7230 является более поздним, чем ваш вопрос, но в соответствующих подробностях он не меняет того, что ранее упоминалось в RFC 2616.

Там очень сильное соглашение для имен полей, которое гораздо более ограничительно, чем позволяет RFC, и это применяется в различной степени в различных реализациях. Имена полей обычно следуют шаблону последовательности слов [ASCII/NUMERAL] с первой буквой (только) каждого заглавного слова. Слова разделяются одним дефис.

Так, например, "HttpUrlConnection" должно было быть заголовком HTTP-заголовка (а не токеном java), вы бы назвали его "Http-Url-Connection".

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

  • Наборы символов не ASCII не играют роли в именах полей, хотя они могут использоваться в значениях полей.

  • Экранирование в именах полей не поддерживается стандартом. Экранирование значений не относится к стандартам HTTP или MIME, но вы можете выбрать повторное использование стандартного метода кодирования URL для кодирования набора пар значений имени.