2010-04-12 7 views
47

Ich versuche einfache xhr Abstraktion zu implementieren, und bekomme diese Warnung, wenn ich versuche, die Header für einen POST zu setzen. Ich denke, es könnte etwas mit dem Setzen der Header in einer separaten JS-Datei zu tun haben, denn wenn ich sie im <script> Tag in der HTML-Datei gesetzt habe, hat es gut funktioniert. Die POST-Anfrage funktioniert gut, aber ich bekomme diese Warnung und bin neugierig warum. Ich erhalte diese Warnung sowohl für die Header als auch connection, aber nur in WebKit-Browsern (Chrome 5 Beta und Safari 4). In Firefox erhalte ich keine Warnungen, der Content-Length-Header ist auf den richtigen Wert gesetzt, aber die Verbindung ist auf Keep-Alive statt auf Close eingestellt, was mich dazu bringt, meine setRequestHeader-Aufrufe zu ignorieren und zu generieren es ist eigen. Ich habe diesen Code im IE nicht ausprobiert. Hier ist der Auszeichnungs & Code:WebKit "Weigerte uns, unsafe header 'content-length'"

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; 
} 
+0

Warum lässt WebKit dieses Header-Feld nicht setzen? – Gumbo

+0

Ich glaube, ich hatte den Eindruck, dass es das Best Practices war, dieses Feld so zu setzen, dass es in allen Browsern konsistent war ... –

+4

Es gibt Kopfzeilenfelder, die vom Client/Server besser automatisch gesetzt werden sollten. * Content-Length * ist einer von ihnen. – Gumbo

Antwort

63

es ist auch meine setRequestHeader Anrufe zu ignorieren und seine eigenen

Ja zu erzeugen, die standard sagt, es muss:

Aus Sicherheitsgründen sollten diese Schritte beendet werden, wenn Header ist [...]

  • Anschluss
  • Content-Length

Messing um mit denen könnte verschiedene request smuggling Angriffe aussetzen, so dass der Browser immer seine eigenen Werte verwendet. Es gibt keinen Grund oder Grund, die Anforderungslänge festzulegen, da der Browser dies genau anhand der Länge der Daten, die Sie an send() übergeben, tun kann.

+3

Bücher besonders, lernen PHP, MySqL und JavaScript, noch lehren Menschen, dies manuell zu tun ... Ich tat das gleiche nach dem Lesen dieses Buches. –

+0

Ich muss setRequestHeader zum Entpacken .gzip-Dateien ... ist das legal? –

+0

@Hiro: welchen Header möchten Sie einstellen? Eine HTTP-Anforderung dekomprimiert eine .gzip-Ressource im Allgemeinen nicht für Sie. Es gibt gzip Content-Encoding, um eine Ressource auf dem Draht zu komprimieren, aber wieder tun Browser das automatisch für Sie, es ist nicht etwas, das Sie mit 'XMLHttpRequest.setRequestHeader' steuern müssen (oder können). – bobince

Verwandte Themen