Diretiva CORS para Spray

Em nosso projeto atual, estamos usando o Spray para desenvolver uma API RESTful. Precisávamos habilitar o suporte CORS para nosso javascript e não consegui encontrar uma maneira fácil de fazer isso. O que eu queria era:

Uma diretiva que pode ser usada no nível mais alto de minhas rotas que ativa o suporte CORS para todas as rotas contidas nela. Que significa:

  • Responda às solicitações OPTIONS com os cabeçalhos corretos apenas para os caminhos registrados (ou seja, OPTIONS / algo-que-não-existe deve resultar em um 404, não um 405
  • Adicione o cabeçalho Access-Control-Allow-Origin a cada solicitação

Depois de pesquisar um pouco, descobri que o spray tem um suporte muito bom para algo assim.

Para a primeira parte, responder a OPÇÕES, é tão fácil quanto olhar a resposta, ver se ela será rejeitada e, se a causa da rejeição for ‘MethodNotSupported’, isso significa que há uma rota em algum lugar dentro de seu CORS diretiva que responderia a este uri com um método diferente. Ou seja, se a solicitação era uma opção, temos que responder OK, pois é uma solicitação de comprovação. Podemos até construir a lista de métodos permitidos para Access-Control-Allow-Methods a partir da lista de rejeições.

Para a segunda parte, tudo o que precisamos fazer é adicionar o cabeçalho à resposta.

Você pode encontrar o código aqui: https://gist.github.com/joseraya/176821d856b43b1cfe19