{-# LANGUAGE ScopedTypeVariables #-} -- -- Licensed to the Apache Software Foundation (ASF) under one -- or more contributor license agreements. See the NOTICE file -- distributed with this work for additional information -- regarding copyright ownership. The ASF licenses this file -- to you under the Apache License, Version 2.0 (the -- "License"); you may not use this file except in compliance -- with the License. You may obtain a copy of the License at -- -- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, -- software distributed under the License is distributed on an -- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -- KIND, either express or implied. See the License for the -- specific language governing permissions and limitations -- under the License. -- module Thrift.Server ( runBasicServer , runThreadedServer ) where import Control.Concurrent ( forkIO ) import Control.Exception import Control.Monad ( forever, when ) import Network import System.IO import Thrift import Thrift.Transport.Handle() import Thrift.Protocol.Binary -- | A threaded sever that is capable of using any Transport or Protocol -- instances. runThreadedServer :: (Transport t, Protocol i, Protocol o) => (Socket -> IO (i t, o t)) -> h -> (h -> (i t, o t) -> IO Bool) -> PortID -> IO a runThreadedServer accepter hand proc_ port = do socket <- listenOn port acceptLoop (accepter socket) (proc_ hand) -- | A basic threaded binary protocol socket server. runBasicServer :: h -> (h -> (BinaryProtocol Handle, BinaryProtocol Handle) -> IO Bool) -> PortNumber -> IO a runBasicServer hand proc_ port = runThreadedServer binaryAccept hand proc_ (PortNumber port) where binaryAccept s = do (h, _, _) <- accept s return (BinaryProtocol h, BinaryProtocol h) acceptLoop :: IO t -> (t -> IO Bool) -> IO a acceptLoop accepter proc_ = forever $ do ps <- accepter forkIO $ handle (\(_ :: SomeException) -> return ()) (loop $ proc_ ps) where loop m = do { continue <- m; when continue (loop m) }