2010-08-15 26 views
4

Selon l'article Mozilla Developer Center HTTP access control, les requêtes POST intersite peuvent être "simples", c'est-à-dire ne pas nécessiter de contrôle en amont, si le type de contenu de la demande est application/x-www-form-urlencoded.Pourquoi ma requête POST interdomaine est-elle contrôlée en amont avec une requête OPTIONS?

Je ne reçois pas ce comportement dans Firefox, et je ne comprends pas du tout pourquoi c'est ainsi. Voici mon code de configuration:

function makeXDomainRequest(url, method, data) { 
    var req = 
     typeof XDomainRequest !== "undefined" ? 
     new XDomainRequest() : new XMLHttpRequest(); 

    req.open(method || "GET", url, true); 

    if (typeof req.onload !== "undefined") { 
     req.onload = onResponseLoad; 
     req.onerror = onRequestError; 
    } else { 
     req.onreadystatechange = onRequestStateChange; 
    } 

    if (data && typeof req.setRequestHeader === "function") { 
     req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 
    } else { 
     // no way to set Content-Type req header in IE's XDomainRequest: 
     // http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx 
    } 

    req.send(data || null); 
} 

function onResponseLoad() { 
    alert("Response!\n" + this.responseText); 
} 

function onRequestError(args) { 
    alert("Error!"); 
} 

function onRequestStateChange() { 
    if (this.readyState === 4) { 
     if (this.status === 200) { 
      onResponseLoad.apply(this); 
     } else { 
      onRequestError.apply(this); 
     } 
    } 
} 

Et voici le serveur je pinger:

// thanks to http://saltybeagle.com/cors/ for having this demo endpoint: 
var URL = "http://ucommbieber.unl.edu/CORS/cors.php"; 

si je fais une simple demande POST - avec les données envoyées comme application/x-www-form-urlencoded dans le code ci-dessus - la La requête est contrôlée en amont dans Firefox avec une requête OPTIONS. Il n'est pas contrôlé en amont dans Chrome. Ouvrez Fiddler avant d'exécuter ce pour voir par vous-même:

makeXDomainRequest(URL, "POST", "name=foobar"); 
// alerts "Response! Hello CORS [...] You sent a POST request. Your name is foobar" 

Voici les OPTIONS prévol demande dans Fiddler (notez l'en-tête Access-Control-Request-Method: POST même si je spécifié un type de contenu soi-disant sûr et sans en-têtes personnalisés):

OPTIONS http://ucommbieber.unl.edu/CORS/cors.php HTTP/1.1 
Host: ucommbieber.unl.edu 
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-us,en;q=0.5 
Accept-Encoding: gzip,deflate 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Keep-Alive: 115 
Connection: keep-alive 
Origin: http://localhost 
Access-Control-Request-Method: POST 

Que se passe-t-il? Est-ce un bug dans Firefox, ou est-ce que je fais quelque chose de mal? Merci!

Répondre