X-Git-Url: http://git.cielonegro.org/gitweb.cgi?p=Lucu.git;a=blobdiff_plain;f=Network%2FHTTP%2FLucu%2FPostprocess.hs;h=49c95e809be046489bed306c83db6f77eab12baf;hp=ca416b9f4dc24b96cf5f206554c7d4a8bf212100;hb=c6847797963abde98faf6aa6425c9bebc0e5dfb5;hpb=54778963482bef9f6dfc305e593658e0e9d1a4c5 diff --git a/Network/HTTP/Lucu/Postprocess.hs b/Network/HTTP/Lucu/Postprocess.hs index ca416b9..49c95e8 100644 --- a/Network/HTTP/Lucu/Postprocess.hs +++ b/Network/HTTP/Lucu/Postprocess.hs @@ -1,5 +1,6 @@ {-# LANGUAGE BangPatterns + , DoAndIfThenElse , OverloadedStrings , UnicodeSyntax #-} @@ -78,12 +79,18 @@ postprocess !itr ⊕ printStatusCode sc ) when (sc ≡ MethodNotAllowed ∧ getHeader "Allow" res ≡ Nothing) - $ abortSTM InternalServerError [] - $ Just ("The status was " ++ show sc ++ " but no Allow header.") + $ abortSTM InternalServerError [] + $ Just + $ A.toText ( "The status was " + ⊕ printStatusCode sc + ⊕ " but no Allow header." ) - when (sc /= NotModified ∧ isRedirection sc ∧ getHeader (C8.pack "Location") res ≡ Nothing) - $ abortSTM InternalServerError [] - $ Just ("The status code was " ++ show sc ++ " but no Location header.") + when (sc /= NotModified ∧ isRedirection sc ∧ getHeader "Location" res ≡ Nothing) + $ abortSTM InternalServerError [] + $ Just + $ A.toText ( "The status code was " + ⊕ printStatusCode sc + ⊕ " but no Location header." ) when (reqM /= Nothing) relyOnRequest @@ -117,32 +124,34 @@ postprocess !itr if canHaveBody then when (reqVer ≡ HttpVersion 1 1) - $ do updateRes $ setHeader "Transfer-Encoding" "chunked" - writeItr itr itrWillChunkBody True - else + $ do updateRes $ setHeader "Transfer-Encoding" "chunked" + writeItr itr itrWillChunkBody True + else -- body 関連のヘッダを削除。但し HEAD なら Content-* は殘す when (reqMethod req /= HEAD) - $ do updateRes $ deleteHeader "Content-Type" - updateRes $ deleteHeader "Etag" - updateRes $ deleteHeader "Last-Modified" + $ do updateRes $ deleteHeader "Content-Type" + updateRes $ deleteHeader "Etag" + updateRes $ deleteHeader "Last-Modified" conn ← readHeader "Connection" case conn of Nothing → return () Just value → when (A.toCIAscii value ≡ "close") - $ writeItr itr itrWillClose True + $ writeItr itr itrWillClose True willClose ← readItr itr itrWillClose id when willClose - $ updateRes $ setHeader "Connection" "close" + $ updateRes $ setHeader "Connection" "close" when (reqMethod req ≡ HEAD ∨ not canHaveBody) - $ writeTVar (itrWillDiscardBody itr) True + $ writeTVar (itrWillDiscardBody itr) True readHeader ∷ CIAscii → STM (Maybe Ascii) + {-# INLINE readHeader #-} readHeader = readItr itr itrResponse ∘ getHeader updateRes ∷ (Response → Response) → STM () + {-# INLINE updateRes #-} updateRes = updateItr itr itrResponse completeUnconditionalHeaders ∷ Config → Response → IO Response