如何使WARP服务器终止?

时间:2017-08-23 12:38:38

标签: haskell haskell-warp

我有一个HTTP应用程序服务器,在某些条件下处理某个请求时需要退出(为了由主管重新启动)。

给出一个主要的:

Bundle

和处理程序类似:

import Network.Wai.Handler.Warp (run)

main :: IO ()
main = do
  config <- readConfig
  run (portNumber config) (makeApp config)

如何在发送500响应后导致流程结束?

1 个答案:

答案 0 :(得分:5)

我现在正在打电话,所以我无法为您输入准确的代码。但基本思路是将Warp线程抛出异步异常。这可能听起来很复杂,但最简单的方法是使用异步库中的竞争函数。像这样:

toExitVar <- newEmptyMVar
race warp (takeMVar toExitVar)

然后在你的处理程序中,当你想让Warp退出时:

putMVar toExitVar ()

编辑一天后,我回到我的电脑,这是一个功能齐全的例子:

#!/usr/bin/env stack
-- stack --resolver lts-9.0 script
{-# LANGUAGE OverloadedStrings #-}

module Main where

import Network.Wai
import Network.Wai.Handler.Warp
import Network.HTTP.Types
import Control.Concurrent.Async
import Control.Concurrent.MVar

main :: IO ()
main = do
toDie <- newEmptyMVar
race_ (takeMVar toDie) $ run 3000 $ \req send ->
    if pathInfo req == ["die"]
    then do
        putMVar toDie ()
        send $ responseLBS status200 [] "Goodbye!"
    else send $ responseLBS status200 [] "Still alive!"