Eu tenho uma máquina na minha LAN local (machineA) que possui dois servidores web. O primeiro é o embutido no XBMC (na porta 8080) e exibe nossa biblioteca. O segundo servidor é um script python CherryPy (porta 8081) que estou usando para acionar uma conversão de arquivo sob demanda. A conversão do arquivo é acionada por uma solicitação AJAX POST da página veiculada no servidor XBMC.
- Vá para http: // machineA: 8080, que exibe a biblioteca
- Biblioteca é exibida
- O usuário clica no link 'converter' que emite o seguinte comando -
Solicitação Ajax do jQuery
$.post('http://machineA:8081', {file_url: 'asfd'}, function(d){console.log(d)})
- O navegador emite uma solicitação OPÇÕES HTTP com os seguintes cabeçalhos;
Cabeçalho da solicitação - OPÇÕES
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
- O servidor responde com o seguinte;
Cabeçalho de resposta - OPÇÕES (STATUS = 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
- A conversa então pára. O navegador, em teoria, deve emitir uma solicitação POST, pois o servidor respondeu com os cabeçalhos CORS corretos (?) (Access-Control-Allow-Origin: *)
Para solução de problemas, também emiti o mesmo comando $ .post em http://jquery.com . É aqui que sou surpreendido, a partir de jquery.com, a solicitação de postagem funciona, uma solicitação de OPÇÕES é enviada após um POST. Os cabeçalhos desta transação estão abaixo;
Cabeçalho da solicitação - OPÇÕES
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
Cabeçalho de resposta - OPÇÕES (STATUS = 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
Cabeçalho da Solicitação - 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
Cabeçalho de resposta - 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
Não sei por que o mesmo pedido funcionaria em um site, mas não no outro. Espero que alguém possa apontar o que estou perdendo. Obrigado pela ajuda!