2014-03-24 37 views
5

当使用run运行warp应用程序时,它监听所有IP地址。使用变形监听特定主机

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

我该如何拨打run才能在特定主机/ IP上收听?

注意:这个问题故意显示没有研究工作,因为它被回答Q & A-样式。

回答

6

目前接受的答案因导管和/或变形的变化而中断。扭曲不再输出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

感谢您更新到最新的API!我很久以前更新了自己的代码,但忘记了相应更新我的答案。我会将你的答案标记为已接受! –

2

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

要传递它的Settings参数包含有关它所监听的主机的信息。

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

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

请注意,类似settingsHost的访问器被标记为不推荐使用,但经编2.1.2.1的官方文档仍使用settingsTimeouthere显示了一个示例。

{-# 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!" 
+0

请解释downvote,只是downvoting这不会使任何更好的! –

+0

据我所知,'Network.Wai.Handler.Warp'不会导出'Host'构造函数,至少现在不会。 – Ed4