blob: 770965f1e8b8e436a2b16ad5cce073d41718b3d0 [file] [log] [blame]
Bryan Duxbury0781f2b2009-04-07 23:29:42 +00001--
2-- Licensed to the Apache Software Foundation (ASF) under one
3-- or more contributor license agreements. See the NOTICE file
4-- distributed with this work for additional information
5-- regarding copyright ownership. The ASF licenses this file
6-- to you under the Apache License, Version 2.0 (the
7-- "License"); you may not use this file except in compliance
8-- with the License. You may obtain a copy of the License at
9--
10-- http://www.apache.org/licenses/LICENSE-2.0
11--
12-- Unless required by applicable law or agreed to in writing,
13-- software distributed under the License is distributed on an
14-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15-- KIND, either express or implied. See the License for the
16-- specific language governing permissions and limitations
17-- under the License.
18--
19
20module Thrift.Server
21 ( runBasicServer
22 , runThreadedServer
23 ) where
24
25import Control.Concurrent ( forkIO )
26import Control.Exception
27import Control.Monad ( forever, when )
28
29import Network
30
31import System.IO
32
33import Thrift
34import Thrift.Transport.Handle
35import Thrift.Protocol.Binary
36
37
38-- | A threaded sever that is capable of using any Transport or Protocol
39-- instances.
40runThreadedServer :: (Transport t, Protocol i, Protocol o)
41 => (Socket -> IO (i t, o t))
42 -> h
43 -> (h -> (i t, o t) -> IO Bool)
44 -> PortID
45 -> IO a
46runThreadedServer accepter hand proc port = do
47 socket <- listenOn port
48 acceptLoop (accepter socket) (proc hand)
49
50-- | A basic threaded binary protocol socket server.
51runBasicServer :: h
52 -> (h -> (BinaryProtocol Handle, BinaryProtocol Handle) -> IO Bool)
53 -> PortNumber
54 -> IO a
55runBasicServer hand proc port = runThreadedServer binaryAccept hand proc (PortNumber port)
56 where binaryAccept s = do
57 (h, _, _) <- accept s
58 return (BinaryProtocol h, BinaryProtocol h)
59
60acceptLoop :: IO t -> (t -> IO Bool) -> IO a
61acceptLoop accepter proc = forever $
62 do ps <- accepter
63 forkIO $ handle (\(e :: SomeException) -> return ())
64 (loop $ proc ps)
65 where loop m = do { continue <- m; when continue (loop m) }