J'essaie d'implémenter une abstraction xhr simple et j'obtiens cet avertissement lorsque j'essaie de définir les en-têtes pour un POST. Je pense que cela pourrait avoir quelque chose à voir avec la définition des en-têtes dans un fichier js distinct, car lorsque je les ai définis dans le <script>
tag dans le fichier .html, cela a bien fonctionné. La demande POST fonctionne correctement, mais je reçois cet avertissement et je suis curieux de savoir pourquoi. J'obtiens cet avertissement pour les deux content-length
et connection
en-têtes, mais uniquement dans les navigateurs WebKit (Chrome 5 beta et Safari 4). Dans Firefox, je ne reçois aucun avertissement, l'en-tête Content-Length est défini sur la valeur correcte, mais la connexion est définie sur keep-alive au lieu de fermer, ce qui me fait penser qu'elle ignore également mes appels setRequestHeader et génère sa propre. Je n'ai pas essayé ce code dans IE. Voici le balisage et le code:
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;
}
il ignore également mes appels setRequestHeader et génère son propre
Oui, le standard dit qu'il doit:
Pour des raisons de sécurité, ces étapes doivent être interrompues si l'en-tête est [...]
- Connexion
- Contenu-Longueur
Jouer avec ceux-ci pourrait exposer diverses attaques demande de contrebande , de sorte que le navigateur utilise toujours ses propres valeurs. Il n'y a ni besoin ni raison d'essayer de définir la longueur de la demande, car le navigateur peut le faire avec précision à partir de la longueur des données que vous transmettez à send()
.