X-Git-Url: http://git.cielonegro.org/gitweb.cgi?a=blobdiff_plain;f=Network%2FHTTP%2FLucu%2FResource.hs;h=fad0a62f4c541413f768144c3755bb5350390862;hb=42aad5a1889cf99c7c26ae7573bcc888e840ae66;hp=41415290961632701c97e8b9bb2c1639ba729e19;hpb=1de2506621977a383b991cadce024f626023908b;p=Lucu.git diff --git a/Network/HTTP/Lucu/Resource.hs b/Network/HTTP/Lucu/Resource.hs index 4141529..fad0a62 100644 --- a/Network/HTTP/Lucu/Resource.hs +++ b/Network/HTTP/Lucu/Resource.hs @@ -151,7 +151,6 @@ import Control.Monad.Unicode import Data.Ascii (Ascii, CIAscii, AsciiBuilder) import Data.Attempt import qualified Data.Attoparsec.Char8 as P -import Data.Attoparsec.Parsable import Data.ByteString (ByteString) import qualified Data.ByteString as Strict import qualified Data.ByteString.Lazy as Lazy @@ -159,6 +158,8 @@ import Data.Collections import Data.Convertible.Base import Data.Convertible.Instances.Text () import Data.Convertible.Utils +import Data.Default +import Data.Eq.Indirect import Data.List (intersperse, sort) import Data.Maybe import Data.Monoid @@ -264,7 +265,7 @@ getAccept Nothing → return [] Just accept - → case P.parseOnly (finishOff parser) (cs accept) of + → case P.parseOnly (finishOff def) (cs accept) of Right xs → return xs Left _ → abort $ mkAbortion' BadRequest $ "Unparsable Accept: " ⊕ cs accept @@ -292,7 +293,7 @@ getAcceptEncoding -- identity のみが許される。 return [("identity", Nothing)] else - case P.parseOnly (finishOff parser) (cs ae) of + case P.parseOnly (finishOff def) (cs ae) of Right xs → return $ map toTuple $ reverse $ sort xs Left _ → abort $ mkAbortion' BadRequest $ "Unparsable Accept-Encoding: " ⊕ cs ae @@ -316,7 +317,7 @@ getContentType Nothing → return Nothing Just cType - → case P.parseOnly (finishOff parser) (cs cType) of + → case P.parseOnly (finishOff def) (cs cType) of Right t → return $ Just t Left _ → abort $ mkAbortion' BadRequest $ "Unparsable Content-Type: " ⊕ cs cType @@ -330,7 +331,7 @@ getAuthorization Nothing → return Nothing Just auth - → case P.parseOnly (finishOff parser) (cs auth) of + → case P.parseOnly (finishOff def) (cs auth) of Right ac → return $ Just ac Left _ → return Nothing @@ -393,11 +394,14 @@ foundETag tag → if value ≡ "*" then return () else - case P.parseOnly (finishOff parser) (cs value) of + case P.parseOnly (finishOff def) (cs value) of + Right [] + → abort $ mkAbortion' BadRequest + $ "Empty If-Match" Right tags -- tags の中に一致するものが無ければ -- PreconditionFailed で終了。 - → when ((¬) (any (≡ tag) (tags ∷ [ETag]))) + → when ((¬) (any (≡ tag) tags)) $ abort $ mkAbortion' PreconditionFailed $ "The entity tag doesn't match: " ⊕ cs value @@ -421,9 +425,12 @@ foundETag tag abort $ mkAbortion' statusForNoneMatch $ "The entity tag matches: *" else - case P.parseOnly (finishOff parser) (cs value) of + case P.parseOnly (finishOff def) (cs value) of + Right [] + → abort $ mkAbortion' BadRequest + $ "Empty If-None-Match" Right tags - → when (any (≡ tag) (tags ∷ [ETag])) + → when (any (≡ tag) tags) $ abort $ mkAbortion' statusForNoneMatch $ "The entity tag matches: " ⊕ cs value @@ -618,7 +625,7 @@ getForm limit -- 'isRedirection' or it raises an error. redirect ∷ StatusCode sc ⇒ sc → URI → Rsrc () redirect sc uri - = do when (sc ≈ NotModified ∨ (¬) (isRedirection sc)) + = do when (sc ≡: NotModified ∨ (¬) (isRedirection sc)) $ abort $ mkAbortion' InternalServerError $ cs