1
1
{-# LANGUAGE GADTs #-}
2
+ {-# LANGUAGE ImportQualifiedPost #-}
2
3
{-# LANGUAGE OverloadedLabels #-}
3
4
4
5
-- | An HTTP service for the Primer API.
@@ -24,6 +25,15 @@ import Network.Wai.Handler.Warp (
24
25
setPort ,
25
26
)
26
27
import Network.Wai.Handler.Warp qualified as Warp (runSettings )
28
+ import Network.Wai.Middleware.Cors (
29
+ CorsResourcePolicy (.. ),
30
+ cors ,
31
+ corsMethods ,
32
+ corsRequestHeaders ,
33
+ simpleCorsResourcePolicy ,
34
+ simpleHeaders ,
35
+ simpleMethods ,
36
+ )
27
37
import Optics ((%) , (.~) , (?~) )
28
38
import Primer.API (
29
39
Env (.. ),
@@ -410,10 +420,21 @@ primerServer = openAPIServer :<|> legacyServer
410
420
server :: Env -> Server API
411
421
server e = pure openAPIInfo :<|> hoistPrimer e
412
422
423
+ -- | CORS settings for the Primer API. Note that this policy will not
424
+ -- work with credentialed requests because the origin is implicitly
425
+ -- "*". See:
426
+ -- https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#credentialed_requests_and_wildcards
427
+ apiCors :: CorsResourcePolicy
428
+ apiCors =
429
+ simpleCorsResourcePolicy
430
+ { corsMethods = simpleMethods <> [" PUT" , " OPTIONS" ]
431
+ , corsRequestHeaders = simpleHeaders <> [" Content-Type" , " Authorization" ]
432
+ }
433
+
413
434
serve :: Sessions -> TBQueue Database. Op -> Version -> Int -> IO ()
414
435
serve ss q v port = do
415
436
putText $ " Listening on port " <> show port
416
- Warp. runSettings warpSettings $ noCache $ Servant. serve api $ server $ Env ss q v
437
+ Warp. runSettings warpSettings $ noCache $ cors ( const $ Just apiCors) $ Servant. serve api $ server $ Env ss q v
417
438
where
418
439
-- By default Warp will try to bind on either IPv4 or IPv6, whichever is
419
440
-- available.
0 commit comments