|
@@ -8,6 +8,9 @@ import qualified Data.Attoparsec.ByteString as BA
|
|
|
import qualified Data.ByteString.Lazy as LBS
|
|
|
import qualified Text.StringConvert as SC
|
|
|
|
|
|
+import Data.Maybe
|
|
|
+import Data.Default.Class
|
|
|
+
|
|
|
import Data.Char
|
|
|
|
|
|
data Header = Header (String, String) deriving (Read, Show, Eq, Ord)
|
|
@@ -19,6 +22,8 @@ data ResourceInfo = ResourceInfo {
|
|
|
bases :: [URI.Revision],
|
|
|
address :: [URI.URI]
|
|
|
} deriving (Eq, Ord, Show)
|
|
|
+instance Default ResourceInfo where
|
|
|
+ def = ResourceInfo def def URI.NoRevision [] []
|
|
|
|
|
|
type ResourceData = LBS.ByteString
|
|
|
|
|
@@ -48,13 +53,13 @@ baseHeader = "fCMTP-Revision-Base"
|
|
|
addressHeader :: String
|
|
|
addressHeader = "fCMTP-Address"
|
|
|
|
|
|
-resourceInfo :: [Header] -> Maybe ResourceInfo
|
|
|
-resourceInfo hh = do
|
|
|
- (mimet, mimep) <- getHeaderValue hh Mime.contentTypeHeaderName >>= bparse PMime.parseContentType
|
|
|
- curr <- URI.Revision <$> getHeaderValue hh revisionHeader
|
|
|
- let bb = map URI.Revision $ getMultipleValue hh baseHeader
|
|
|
- uu <- mapM (bparse URI.parseURI) $ getMultipleValue hh addressHeader
|
|
|
- return $ ResourceInfo mimet mimep curr bb uu
|
|
|
+resourceInfo :: [Header] -> ResourceInfo
|
|
|
+resourceInfo hh = let
|
|
|
+ (mimet, mimep) = fromMaybe (def, def) $ getHeaderValue hh Mime.contentTypeHeaderName >>= bparse PMime.parseContentType
|
|
|
+ curr = fromMaybe URI.NoRevision $ URI.Revision <$> getHeaderValue hh revisionHeader
|
|
|
+ bb = map URI.Revision $ getMultipleValue hh baseHeader
|
|
|
+ uu = catMaybes . map (bparse URI.parseURI) $ getMultipleValue hh addressHeader
|
|
|
+ in ResourceInfo mimet mimep curr bb uu
|
|
|
where
|
|
|
bparse :: BA.Parser a -> String -> Maybe a
|
|
|
bparse p v = eitherToMaybe . BA.parseOnly p $ SC.s v
|