【问题标题】:Warp: Binding to Unix Domain SocketsWarp:绑定到 Unix 域套接字
【发布时间】:2014-03-24 22:08:08
【问题描述】:

here 列出的示例代码展示了如何让 warp 只在特定主机上侦听。

此外,this post 展示了一些关于如何在 Haskell 中使用 unix 域套接字的基础知识。

如何结合这两种方法以使 warp 侦听(即绑定到)特定的 unix 域套接字(例如,warp.sock)?

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

【问题讨论】:

    标签: haskell unix-socket haskell-warp


    【解决方案1】:

    您可以将runSettingsSocketAF_UNIX 套接字一起使用:

    {-# LANGUAGE OverloadedStrings #-}
    
    import Network.Wai (responseLBS)
    import Network.Wai.Handler.Warp
    import Network.Socket
    import Network.HTTP.Types (status200)
    import Network.HTTP.Types.Header (hContentType)
    
    main = do
        let port = 3000
        -- Open the socket
        sock <- socket AF_UNIX Stream 0
        bind sock $ SockAddrUnix "warp.sock"
        listen sock maxListenQueue
        -- Run the server
        let settings = defaultSettings { settingsPort = port }
        runSettingsSocket settings sock app
        -- Cleanup: Close socket
        close sock
    
    app req f = f $
        responseLBS status200 [(hContentType, "text/plain")] "Hello world!"
    

    请注意,这显然只适用于 unixoid 平台。

    【讨论】:

      【解决方案2】:

      FWIW:如果想使用 http-client 来使用那个 UNIX 套接字:

      {-# LANGUAGE OverloadedStrings #-}
      
      import Network.HTTP.Client
      import Network.HTTP.Client.Internal (Connection, openSocketConnection, makeConnection)
      import Network.Socket.ByteString (sendAll, recv)
      
      import qualified Control.Exception as E
      import qualified Network.Socket as NS
      
      main :: IO ()
      main = do
          mgr <- newManager defaultManagerSettings {
              managerRawConnection = createUnixConnection
          }
          -- This changes in http-client-0.5, use parseUrlThrow
          req <- parseUrl "http://localhost/whatever"
          res <- httpLbs req mgr
          print (responseBody res)
      
      createUnixConnection :: IO (Maybe NS.HostAddress -> String -> Int -> IO Connection)
      createUnixConnection = return $ \_ _ _ -> openUnixConnection "warp.sock"
      
      openUnixConnection :: String -> IO Connection
      openUnixConnection addr = E.bracketOnError
          (NS.socket NS.AF_UNIX NS.Stream NS.defaultProtocol)
          (NS.close)
          $ \sock -> do
              NS.connect sock sockAddr
              socketConnection sock chunksize
        where
          sockAddr = NS.SockAddrUnix addr
          chunksize = 8192
      
      -------------------------------------------------------------------------------
      -- Copied from http-client
      -------------------------------------------------------------------------------
      
      socketConnection :: NS.Socket -> Int -> IO Connection
      socketConnection socket chunksize = makeConnection
          (recv socket chunksize)
          (sendAll socket)
          (NS.close socket)
      

      【讨论】:

        猜你喜欢
        • 2010-11-25
        • 1970-01-01
        • 2021-10-17
        • 2011-11-16
        • 1970-01-01
        • 2010-11-02
        • 2014-06-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多