J'ai une machine sur mon réseau local (machineA) qui a deux serveurs Web. Le premier est celui intégré dans XBMC (sur le port 8080) et affiche notre bibliothèque. Le deuxième serveur est un script python CherryPy (port 8081) que j'utilise pour déclencher une conversion de fichier à la demande. La conversion du fichier est déclenchée par une requête AJAX POST à partir de la page servie depuis le serveur XBMC.
- Aller à http: // machineA: 8080 qui affiche la bibliothèque
- La bibliothèque est affichée
- L'utilisateur clique sur le lien «convertir» qui émet la commande suivante -
jQuery Ajax Request
$.post('http://machineA:8081', {file_url: 'asfd'}, function(d){console.log(d)})
- Le navigateur émet une requête HTTP OPTIONS avec les en-têtes suivants;
En-tête de demande - OPTIONS
Host: machineA:8081
User-Agent: ... Firefox/4.01
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://machineA:8080
Access-Control-Request-Method: POST
Access-Control-Request-Headers: x-requested-with
- Le serveur répond par ce qui suit:
En-tête de réponse - OPTIONS (STATUT = 200 OK)
Content-Length: 0
Access-Control-Allow-Headers: *
Access-Control-Max-Age: 1728000
Server: CherryPy/3.2.0
Date: Thu, 21 Apr 2011 22:40:29 GMT
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, GET, OPTIONS
Content-Type: text/html;charset=ISO-8859-1
- La conversation s'arrête alors. Le navigateur devrait, en théorie, émettre une requête POST car le serveur a répondu avec les en-têtes CORS corrects (?) (Access-Control-Allow-Origin: *)
Pour le dépannage, j'ai également émis la même commande $ .post depuis http://jquery.com . C'est là que je suis perplexe, de jquery.com, la demande de publication fonctionne, une demande d'OPTIONS est envoyée par la suite par un POST. Les en-têtes de cette transaction sont ci-dessous;
En-tête de demande - OPTIONS
Host: machineA:8081
User-Agent: ... Firefox/4.01
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://jquery.com
Access-Control-Request-Method: POST
En-tête de réponse - OPTIONS (STATUT = 200 OK)
Content-Length: 0
Access-Control-Allow-Headers: *
Access-Control-Max-Age: 1728000
Server: CherryPy/3.2.0
Date: Thu, 21 Apr 2011 22:37:59 GMT
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, GET, OPTIONS
Content-Type: text/html;charset=ISO-8859-1
En-tête de demande - POST
Host: machineA:8081
User-Agent: ... Firefox/4.01
Accept: */*
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
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Referer: http://jquery.com/
Content-Length: 12
Origin: http://jquery.com
Pragma: no-cache
Cache-Control: no-cache
En-tête de réponse - POST (STATUS = 200 OK)
Content-Length: 32
Access-Control-Allow-Headers: *
Access-Control-Max-Age: 1728000
Server: CherryPy/3.2.0
Date: Thu, 21 Apr 2011 22:37:59 GMT
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, GET, OPTIONS
Content-Type: application/json
Je ne peux pas comprendre pourquoi la même demande fonctionnerait à partir d'un site, mais pas de l'autre. J'espère que quelqu'un pourrait indiquer ce qui me manque. Merci de votre aide!