Edited at

Servant で CORS をサポートする方法

More than 1 year has passed since last update.

ServantでCORSの設定をしようと思うとwai-corsだけでは足りなかったのでメモ。

ただ詳しいことはわからなかったので workaround だけ書きます。

Servantを使ったサーバーのCORSの設定にはwai-corsとservant-optionsを使って以下のようにします

import qualified Network.Wai.Handler.Warp as Warp

import Network.Wai.Middleware.Cors (cors, simpleCorsResourcePolicy, corsRequestHeaders)
import Network.Wai.Middleware.Servant.Options (provideOptions)
import Servant

type API = ...

api :: Proxy API
api = Proxy

main :: IO ()
main = Warp.run 8080
$ cors (const $ Just policy)
$ provideOptions api
$ serve api server
where
policy = simpleCorsResourcePolicy
{ corsRequestHeaders = [ "content-type" ] }

simpleCorsだとダメで必ずcorsRequestHeadersの設定をする必要があります。

この方法はOPTIONS support #278で示されているものです。詳しい議論はここに書いてあると思います


追記: 2017/08/06

この記事の執筆時に使用していた servant の version は 0.9.1.1 でしたが 0.11 にアップデートしたところ simpleCors だけでCORSの設定を行えました。

どうやら間違った成果物を試してたようで、確かに servant-options への依存は必要なくなりましたが policy の設定は必要でした