9

ここにリストされているコード例は、warp を特定のホストでのみリッスンする方法を示しています。

さらに、この投稿では、Haskell で UNIX ドメイン ソケットを使用する方法の基本をいくつか示します。

warp が特定の UNIX ドメイン ソケット (たとえば ) をリッスンする (バインドする) ようにするために、これら 2 つのアプローチをどのように組み合わせることができますwarp.sockか?

注:この質問は、Q&A スタイルで回答されているため、意図的に研究努力を示していません。

4

2 に答える 2

12

ソケットrunSettingsSocketで使用できます:AF_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 プラットフォームでのみ機能することに注意してください。

于 2014-03-24T22:08:08.713 に答える
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)
于 2016-07-06T23:35:38.467 に答える