David Reiss | ea2cba8 | 2009-03-30 21:35:00 +0000 | [diff] [blame] | 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 | |
iproctor | ff8eb92 | 2007-07-25 19:06:13 +0000 | [diff] [blame] | 20 | module TServer(run_basic_server,run_threaded_server) where |
| 21 | |
| 22 | import Network |
| 23 | import Thrift |
| 24 | import Control.Exception |
| 25 | import TBinaryProtocol |
| 26 | import TChannelTransport |
| 27 | import Control.Concurrent |
| 28 | |
| 29 | proc_loop hand proc ps = do v <-proc hand ps |
| 30 | if v then proc_loop hand proc ps |
| 31 | else return () |
| 32 | |
David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame] | 33 | accept_loop accepter hand sock proc transgen iprotgen oprotgen = |
iproctor | 7897c92 | 2007-08-08 01:43:39 +0000 | [diff] [blame] | 34 | do (h,hn,_) <- accepter sock |
David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame] | 35 | let t = transgen h |
iproctor | ff8eb92 | 2007-07-25 19:06:13 +0000 | [diff] [blame] | 36 | let ip = iprotgen t |
| 37 | let op = oprotgen t |
| 38 | forkIO (handle (\e -> return ()) (proc_loop hand proc (ip,op))) |
iproctor | 7897c92 | 2007-08-08 01:43:39 +0000 | [diff] [blame] | 39 | accept_loop accepter hand sock proc transgen iprotgen oprotgen |
David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame] | 40 | |
| 41 | run_threaded_server accepter listener hand proc port transgen iprotgen oprotgen = |
iproctor | 7897c92 | 2007-08-08 01:43:39 +0000 | [diff] [blame] | 42 | do sock <- listener |
| 43 | accept_loop accepter hand sock proc transgen iprotgen oprotgen |
iproctor | ff8eb92 | 2007-07-25 19:06:13 +0000 | [diff] [blame] | 44 | return () |
David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame] | 45 | |
iproctor | ff8eb92 | 2007-07-25 19:06:13 +0000 | [diff] [blame] | 46 | |
| 47 | -- A basic threaded binary protocol socket server. |
iproctor | 7897c92 | 2007-08-08 01:43:39 +0000 | [diff] [blame] | 48 | run_basic_server hand proc port = run_threaded_server accept (listenOn (PortNumber port)) hand proc port TChannelTrans TBinaryProtocol TBinaryProtocol |