@@ -46,7 +46,7 @@ import GHC.TypeLits (KnownNat, KnownSymbol, natVal,
46import Network.HTTP.Types hiding (Header, ResponseHeaders)
46import Network.HTTP.Types hiding (Header, ResponseHeaders)
47import qualified Network.HTTP.Media as NHM
47import qualified Network.HTTP.Media as NHM
48import Network.Socket (SockAddr)
48import Network.Socket (SockAddr)
49−import Network.Wai (Application, Request, Response,
49+import Network.Wai (Application, Request,
50 httpVersion, isSecure,
50 httpVersion, isSecure,
51 lazyRequestBody,
51 lazyRequestBody,
52 rawQueryString, remoteHost,
52 rawQueryString, remoteHost,
@@ -208,16 +208,6 @@ allowedMethodHead method request = method == methodGet && requestMethod request
208allowedMethod :: Method -> Request -> Bool
208allowedMethod :: Method -> Request -> Bool
209allowedMethod method request = allowedMethodHead method request || requestMethod request == method
209allowedMethod method request = allowedMethodHead method request || requestMethod request == method
211−processMethodRouter :: Maybe (BL.ByteString, BL.ByteString) -> Status -> Method
212− -> Maybe [(HeaderName, B.ByteString)]
213− -> Request -> RouteResult Response
214−processMethodRouter handleA status method headers request = case handleA of
215− Nothing -> FailFatal err406 -- this should not happen (checked before), so we make it fatal if it does
216− Just (contentT, body) -> Route $ responseLBS status hdrs bdy
218− bdy = if allowedMethodHead method request then "" else body
219− hdrs = (hContentType, cs contentT) : (fromMaybe [] headers)
221methodCheck :: Method -> Request -> DelayedIO ()
211methodCheck :: Method -> Request -> DelayedIO ()
222methodCheck method request
212methodCheck method request
223 | allowedMethod method request = return ()
213 | allowedMethod method request = return ()
@@ -236,33 +226,23 @@ acceptCheck proxy accH
236 | otherwise = delayedFail err406
226 | otherwise = delayedFail err406
238methodRouter :: (AllCTRender ctypes a)
228methodRouter :: (AllCTRender ctypes a)
229+ => (b -> ([(HeaderName, B.ByteString)], a))
239− => Method -> Proxy ctypes -> Status
230+ -> Method -> Proxy ctypes -> Status
240− -> Delayed env (Handler a)
231+ -> Delayed env (Handler b)
241 -> Router env
232 -> Router env
242−methodRouter method proxy status action = leafRouter route'
233+methodRouter splitHeaders method proxy status action = leafRouter route'
244 route' env request respond =
235 route' env request respond =
245 let accH = fromMaybe ct_wildcard $ lookup hAccept $ requestHeaders request
236 let accH = fromMaybe ct_wildcard $ lookup hAccept $ requestHeaders request
246 in runAction (action `addMethodCheck` methodCheck method request
237 in runAction (action `addMethodCheck` methodCheck method request
247 `addAcceptCheck` acceptCheck proxy accH
238 `addAcceptCheck` acceptCheck proxy accH
248 ) env request respond $ \ output -> do
239 ) env request respond $ \ output -> do
240+ let (headers, b) = splitHeaders output
249− let handleA = handleAcceptH proxy (AcceptHeader accH) output
241+ case handleAcceptH proxy (AcceptHeader accH) b of
250− processMethodRouter handleA status method Nothing request
242+ Nothing -> FailFatal err406 -- this should not happen (checked before), so we make it fatal if it does
251−
243+ Just (contentT, body) ->
252−methodRouterHeaders :: (GetHeaders (Headers h v), AllCTRender ctypes v)
244+ let bdy = if allowedMethodHead method request then "" else body
253− => Method -> Proxy ctypes -> Status
245+ in Route $ responseLBS status ((hContentType, cs contentT) : headers) bdy
254− -> Delayed env (Handler (Headers h v))
256−methodRouterHeaders method proxy status action = leafRouter route'
258− route' env request respond =
259− let accH = fromMaybe ct_wildcard $ lookup hAccept $ requestHeaders request
260− in runAction (action `addMethodCheck` methodCheck method request
261− `addAcceptCheck` acceptCheck proxy accH
262− ) env request respond $ \ output -> do
263− let headers = getHeaders output
264− handleA = handleAcceptH proxy (AcceptHeader accH) (getResponse output)
265− processMethodRouter handleA status method (Just headers) request
267instance OVERLAPPABLE_
247instance OVERLAPPABLE_
268 ( AllCTRender ctypes a, ReflectMethod method, KnownNat status
248 ( AllCTRender ctypes a, ReflectMethod method, KnownNat status
@@ -271,7 +251,7 @@ instance OVERLAPPABLE_
271 type ServerT (Verb method status ctypes a) m = m a
251 type ServerT (Verb method status ctypes a) m = m a
272 hoistServerWithContext _ _ nt s = nt s
252 hoistServerWithContext _ _ nt s = nt s
274− route Proxy _ = methodRouter method (Proxy :: Proxy ctypes) status
254+ route Proxy _ = methodRouter ([],) method (Proxy :: Proxy ctypes) status
275 where method = reflectMethod (Proxy :: Proxy method)
255 where method = reflectMethod (Proxy :: Proxy method)
276 status = toEnum . fromInteger $ natVal (Proxy :: Proxy status)
256 status = toEnum . fromInteger $ natVal (Proxy :: Proxy status)
@@ -283,7 +263,7 @@ instance OVERLAPPING_
283 type ServerT (Verb method status ctypes (Headers h a)) m = m (Headers h a)
263 type ServerT (Verb method status ctypes (Headers h a)) m = m (Headers h a)
284 hoistServerWithContext _ _ nt s = nt s
264 hoistServerWithContext _ _ nt s = nt s
286− route Proxy _ = methodRouterHeaders method (Proxy :: Proxy ctypes) status
266+ route Proxy _ = methodRouter (\x -> (getHeaders x, getResponse x)) method (Proxy :: Proxy ctypes) status
287 where method = reflectMethod (Proxy :: Proxy method)
267 where method = reflectMethod (Proxy :: Proxy method)
288 status = toEnum . fromInteger $ natVal (Proxy :: Proxy status)
268 status = toEnum . fromInteger $ natVal (Proxy :: Proxy status)