X-Git-Url: http://git.cielonegro.org/gitweb.cgi?a=blobdiff_plain;f=Network%2FHTTP%2FLucu%2FResponse.hs;h=920449db36e469b431babe522792ca954a6aac07;hb=eb77281b24b8d7218e1fd80164f941836cef1d5a;hp=c18819f8f8ceb782a7e1938f3121c7a5d887beab;hpb=fffa09842d060c7d738084125dea07783d84aefe;p=Lucu.git diff --git a/Network/HTTP/Lucu/Response.hs b/Network/HTTP/Lucu/Response.hs index c18819f..920449d 100644 --- a/Network/HTTP/Lucu/Response.hs +++ b/Network/HTTP/Lucu/Response.hs @@ -1,6 +1,9 @@ {-# LANGUAGE - OverloadedStrings + FlexibleInstances + , MultiParamTypeClasses + , OverloadedStrings , RecordWildCards + , TemplateHaskell , UnicodeSyntax , ViewPatterns #-} @@ -8,7 +11,7 @@ module Network.HTTP.Lucu.Response ( -- * Class and Types StatusCode(..) - , SomeStatusCode(..) + , SomeStatusCode , Response(..) , statusCodes , module Network.HTTP.Lucu.StatusCode @@ -17,11 +20,7 @@ module Network.HTTP.Lucu.Response , emptyResponse , setStatusCode , resCanHaveBody - , printStatusCode - , printResponse - , (≈) - , (≉) , isInformational , isSuccessful , isRedirection @@ -30,8 +29,10 @@ module Network.HTTP.Lucu.Response , isServerError ) where -import Data.Ascii (AsciiBuilder) -import qualified Data.Ascii as A +import Data.Ascii (Ascii, AsciiBuilder) +import Data.Convertible.Base +import Data.Convertible.Instances.Ascii () +import Data.Convertible.Utils import Data.Monoid.Unicode import Network.HTTP.Lucu.Headers import Network.HTTP.Lucu.HttpVersion @@ -39,11 +40,6 @@ import Network.HTTP.Lucu.StatusCode import Network.HTTP.Lucu.StatusCode.Internal import Prelude.Unicode --- |Convert a 'StatusCode' to an 'AsciiBuilder'. -printStatusCode ∷ StatusCode sc ⇒ sc → AsciiBuilder -{-# INLINEABLE printStatusCode #-} -printStatusCode = A.toAsciiBuilder ∘ textualStatus - -- |This is the definition of an HTTP response. data Response = Response { resVersion ∷ !HttpVersion @@ -55,6 +51,23 @@ instance HasHeaders Response where getHeaders = resHeaders setHeaders res hdr = res { resHeaders = hdr } +instance ConvertSuccess Response Ascii where + {-# INLINE convertSuccess #-} + convertSuccess = convertSuccessVia ((⊥) ∷ AsciiBuilder) + +instance ConvertSuccess Response AsciiBuilder where + {-# INLINE convertSuccess #-} + convertSuccess (Response {..}) + = cs resVersion ⊕ + cs (" " ∷ Ascii) ⊕ + cs resStatus ⊕ + cs ("\x0D\x0A" ∷ Ascii) ⊕ + cs resHeaders + +deriveAttempts [ ([t| Response |], [t| Ascii |]) + , ([t| Response |], [t| AsciiBuilder |]) + ] + -- |Returns an HTTP\/1.1 'Response' with no header fields. emptyResponse ∷ StatusCode sc ⇒ sc → Response emptyResponse sc @@ -76,21 +89,11 @@ setStatusCode sc res resCanHaveBody ∷ Response → Bool {-# INLINEABLE resCanHaveBody #-} resCanHaveBody (Response {..}) - | isInformational resStatus = False - | resStatus ≈ NoContent = False - | resStatus ≈ ResetContent = False - | resStatus ≈ NotModified = False - | otherwise = True - --- |Convert a 'Response' to 'AsciiBuilder'. -printResponse ∷ Response → AsciiBuilder -{-# INLINEABLE printResponse #-} -printResponse (Response {..}) - = printHttpVersion resVersion ⊕ - A.toAsciiBuilder " " ⊕ - printStatusCode resStatus ⊕ - A.toAsciiBuilder "\x0D\x0A" ⊕ - printHeaders resHeaders + | isInformational resStatus = False + | resStatus ≡ cs NoContent = False + | resStatus ≡ cs ResetContent = False + | resStatus ≡ cs NotModified = False + | otherwise = True -- |@'isInformational' sc@ returns 'True' iff @sc '<' 200@. isInformational ∷ StatusCode sc ⇒ sc → Bool