Haskell

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

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 の設定は必要でした