Failed to execute ‘setRequestHeader’ on ‘XMLHttpRequest’

Failed to execute ‘setRequestHeader’ on ‘XMLHttpRequest’: ‘ ‘ is not a valid HTTP header field value.

— именно такую ошибку можно наблюдать в Chrome 31 и Firefox 25 при попытке отправить заголовок, содержащий нелатинские символы.

Судя по комментариям разработчиков Chromium — изначально Chromium парсил заголовки как UTF-8, однако, разработчики решили «привести код в соответствии со спецификацией и другими браузерами», а именно — парсить заголовки в Latin-1.

We currently decode them as UTF-8, but they should be interpreted as Latin-1.
(XHR specs the relevant parameters as WebIDL ByteString.) For response headers,
this matches Firefox, IE, Opera 12, and Safari. For status text, this matches
Firefox nightly, IE, Opera 12, and Opera. For request headers, this matches
Firefox nightly, Opera 12, and Safari.

Иными словами, при попытке отправить ajax-запрос, заголовок заголовок которого содержит, например, кириллицу (равно как и любой другой символ не из Latin-1) — мы получим Exception.

Временной мерой может послужить использование encodeURIComponent(), например:

xhr.open("POST", url);
var body = reader.result;
xhr.setRequestHeader("X-Header", encodeURIComponent(x_header));
xhr.send(body);

или Base64.encode() отсюда. Однако, стоит поискать более адекватное решение, чтобы не переписывать серверную часть.

Ссылки по теме:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *