Subversion Repositories SmartDukaan

Rev

Rev 30 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
30 ashish 1
--
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
 
20
module Thrift.Server
21
    ( runBasicServer
22
    , runThreadedServer
23
    ) where
24
 
25
import Control.Concurrent ( forkIO )
26
import Control.Exception
27
import Control.Monad ( forever, when )
28
 
29
import Network
30
 
31
import System.IO
32
 
33
import Thrift
34
import Thrift.Transport.Handle
35
import Thrift.Protocol.Binary
36
 
37
 
38
-- | A threaded sever that is capable of using any Transport or Protocol
39
-- instances.
40
runThreadedServer :: (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
46
runThreadedServer accepter hand proc port = do
47
    socket <- listenOn port
48
    acceptLoop (accepter socket) (proc hand)
49
 
50
-- | A basic threaded binary protocol socket server.
51
runBasicServer :: h
52
               -> (h -> (BinaryProtocol Handle, BinaryProtocol Handle) -> IO Bool)
53
               -> PortNumber
54
               -> IO a
55
runBasicServer 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
 
60
acceptLoop :: IO t -> (t -> IO Bool) -> IO a
61
acceptLoop 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) }