使用warp收听特定主机

时间:2014-03-24 21:07:27

标签: haskell haskell-warp

使用warp运行run应用程序时,它会侦听所有IP地址。

出于安全原因,我只想听localhost,使用反向代理处理远程访问。

如何调用run仅侦听特定主机/ IP?

注意:这个问题故意显示没有研究工作,因为答案是Q& A-Style。

2 个答案:

答案 0 :(得分:6)

当前接受的答案因管道和/或翘曲的变化而被打破。 Warp不再导出Host构造函数。但是你不需要它,因为HostPreference类型支持OverloadedStrings扩展,所以你可以直接使用字符串。

此示例还通过切换为setPortsetHost来消除弃用警告。

{-# LANGUAGE OverloadedStrings #-}

import Network.Wai (responseLBS)
import Network.Wai.Handler.Warp
import Network.HTTP.Types (status200)
import Network.HTTP.Types.Header (hContentType)

main = do
    let port = 3000
    putStrLn $ "Listening on port " ++ show port
    let settings = setPort port $ setHost "127.0.0.1" defaultSettings
    runSettings settings app

app req = return $
    responseLBS status200 [(hContentType, "text/plain")] "Hello world!"

答案 1 :(得分:2)

run本身不能这样做。你需要使用runSettings

您要传递的Settings参数包含有关其侦听的主机的信息。

此处的相关类型为HostPreference。虽然它允许您指定不同的通配符,包括IPv6Only,但我们将在此处使用Host构造函数。

基于this answer,我将展示一个仅在本地主机上侦听的最小示例。

请注意,settingsHost等访问者已被标记为已弃用,但warp 2.1.2.1的官方文档仍显示使用settingsTimeout here的示例。

{-# LANGUAGE OverloadedStrings #-}

import Network.Wai (responseLBS)
import Network.Wai.Handler.Warp
import Network.HTTP.Types (status200)
import Network.HTTP.Types.Header (hContentType)

main = do
    let port = 3000
    putStrLn $ "Listening on port " ++ show port
    let settings = defaultSettings { settingsPort = port,
                                     settingsHost = Host "127.0.0.1" }
    runSettings settings app

app req = return $
    responseLBS status200 [(hContentType, "text/plain")] "Hello world!"