【问题标题】:Listen on specific host using warp使用 warp 监听特定主机
【发布时间】:2014-05-06 04:11:10
【问题描述】:

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

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

我如何需要调用run 才能仅监听特定主机/IP?

注意:这个问题故意显示没有研究工作,因为它是问答式回答的。

【问题讨论】:

    标签: haskell haskell-warp


    【解决方案1】:

    当前接受的答案因管道和/或扭曲的更改而被破坏。 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!"
    

    【讨论】:

    • 感谢您更新到最新的 API!实际上,我很久以前就更新了自己的代码,但忘记相应地更新我的答案。我会将您的答案标记为已接受!
    • 您也可以使用fromString。奇怪的是,read 不起作用。
    【解决方案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!" 
    

    【讨论】:

    • 请解释投反对票,只是投反对票不会让帖子变得更好!
    • 据我所知,Network.Wai.Handler.Warp 不会导出 Host 构造函数,至少现在不会了。
    猜你喜欢
    • 1970-01-01
    • 2016-07-20
    • 1970-01-01
    • 2019-12-07
    • 2019-07-04
    • 2012-04-05
    • 2020-02-06
    • 2015-11-28
    • 1970-01-01
    相关资源
    最近更新 更多