WebKit "Отказался от установки небезопасного заголовка" длина содержимого "

Я пытаюсь реализовать простую абстракцию xhr, и получаю это предупреждение при попытке установить заголовки для POST. Я думаю, что это может быть связано с установкой заголовков в отдельный файл js, потому что, когда я устанавливал их в теге <script> в .html файле, он работал нормально. Запрос POST работает нормально, но я получаю это предупреждение, и мне любопытно, почему. Я получаю это предупреждение для заголовков content-length и connection, но только в браузерах WebKit (бета-версия Chrome 5 и Safari 4). В Firefox я не получаю никаких предупреждений, заголовок Content-Length установлен на правильное значение, но Connection установлен как keep-alive вместо close, что заставляет меня думать, что он также игнорирует мои вызовы setRequestHeader и генерирует он сам. Я не пробовал этот код в IE. Вот разметка и код:

test.html:

<!DOCTYPE html>
<html>
    <head>
        <script src="jsfile.js"></script>
        <script>
            var request = new Xhr('POST', 'script.php', true, 'data=somedata',  function(data) { 
                console.log(data.text); 
            });
        </script>
    </head>
    <body>
    </body>
</html>

jsfile.js:

function Xhr(method, url, async, data, callback) {
    var x;
    if(window.XMLHttpRequest) {
        x = new XMLHttpRequest();

        x.open(method, url, async);

        x.onreadystatechange = function() {
            if(x.readyState === 4) {
                if(x.status === 200) {
                    var data = {
                        text: x.responseText,
                        xml: x.responseXML
                    };
                    callback.call(this, data);
                }
            }
        }

        if(method.toLowerCase() === "post") {
            x.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
            x.setRequestHeader("Content-Length", data.length);
            x.setRequestHeader("Connection", "close");
        }

        x.send(data);
    } else {
        // ... implement IE code here ...
    }
    return x;
}

Ответ 1

он также игнорирует мои вызовы setRequestHeader и генерирует собственный

Да, стандарт говорит, что он должен:

В целях безопасности эти действия должны быть завершены, если заголовок [...]

  • Подключение
  • Content-Length

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