Warp:绑定到Unix域套接字

9

这里列出的示例代码演示了如何使warp仅侦听特定主机

此外,此帖子介绍了如何在Haskell中使用Unix域套接字的基础知识。

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

注意:此问题故意没有展示研究努力,因为它是问答样式的回答。

2个回答

12

您可以使用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!"

请注意,这仅适用于类Unix操作系统平台。


2

顺便说一句:如果你想使用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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接