-- | Whether to run a 'Network.HTTP.Lucu.Resource.Resource' on a
-- native thread (spawned using @forkOS@) or to run it on a user
-- thread (spanwed using @forkIO@). Generally you don't
- resUsesNativeThread :: Bool
+ resUsesNativeThread :: !Bool
-- | Whether to be greedy or not.
--
-- Say a client is trying to access \/aaa\/bbb\/ccc. If there is a
-- there is another resource at \/aaa\/bbb\/ccc. If the resource
-- at \/aaa\/bbb is not greedy, it is just ignored. Greedy
-- resource is like a CGI script.
- , resIsGreedy :: Bool
+ , resIsGreedy :: !Bool
-- | A 'Network.HTTP.Lucu.Resource.Resource' to be run when a GET
-- request comes for the resource path. If 'resGet' is Nothing,
-- the system responds \"405 Method Not Allowed\" for GET
-- It also runs for HEAD request if the 'resHead' is Nothing. In
-- this case 'Network.HTTP.Lucu.Resource.output' and such like
-- don't actually write a response body.
- , resGet :: Maybe (Resource ())
+ , resGet :: !(Maybe (Resource ()))
-- | A 'Network.HTTP.Lucu.Resource.Resource' to be run when a HEAD
-- request comes for the resource path. If 'resHead' is Nothing,
-- the system runs 'resGet' instead. If 'resGet' is also Nothing,
-- the system responds \"405 Method Not Allowed\" for HEAD
-- requests.
- , resHead :: Maybe (Resource ())
+ , resHead :: !(Maybe (Resource ()))
-- | A 'Network.HTTP.Lucu.Resource.Resource' to be run when a POST
-- request comes for the resource path. If 'resPost' is Nothing,
-- the system responds \"405 Method Not Allowed\" for POST
-- requests.
- , resPost :: Maybe (Resource ())
+ , resPost :: !(Maybe (Resource ()))
-- | A 'Network.HTTP.Lucu.Resource.Resource' to be run when a PUT
-- request comes for the resource path. If 'resPut' is Nothing,
-- the system responds \"405 Method Not Allowed\" for PUT
-- requests.
- , resPut :: Maybe (Resource ())
+ , resPut :: !(Maybe (Resource ()))
-- | A 'Network.HTTP.Lucu.Resource.Resource' to be run when a
-- DELETE request comes for the resource path. If 'resDelete' is
-- Nothing, the system responds \"405 Method Not Allowed\" for
-- DELETE requests.
- , resDelete :: Maybe (Resource ())
+ , resDelete :: !(Maybe (Resource ()))
}
-- | 'ResTree' is an opaque structure which is a map from resource
-- path to 'ResourceDef'.
type ResTree = ResNode -- root だから Map ではない
type ResSubtree = Map String ResNode
-data ResNode = ResNode (Maybe ResourceDef) ResSubtree
+data ResNode = ResNode !(Maybe ResourceDef) !ResSubtree
-- | 'mkResTree' converts a list of @(path, def)@ to a 'ResTree' e.g.
--
-- ]
-- @
mkResTree :: [ ([String], ResourceDef) ] -> ResTree
-mkResTree list = processRoot list
+mkResTree list = list `seq` processRoot list
where
processRoot :: [ ([String], ResourceDef) ] -> ResTree
processRoot list
runResource :: ResourceDef -> Interaction -> IO ThreadId
runResource def itr
- = fork
- $ catch ( runReaderT ( do req <- getRequest
- fromMaybe notAllowed $ rsrc req
- driftTo Done
- ) itr
- )
- $ \ exc -> processException exc
+ = def `seq` itr `seq`
+ fork
+ $! catch ( runReaderT ( do req <- getRequest
+ fromMaybe notAllowed $ rsrc req
+ driftTo Done
+ ) itr
+ )
+ $ \ exc -> processException exc
where
fork :: IO () -> IO ThreadId
fork = if (resUsesNativeThread def)