{-# LANGUAGE ScopedTypeVariables #-} module Text.RDF.RDF4H.ParserUtils( _parseURL, Parser(..) ) where import Data.RDF.Types import Control.Exception.Lifted import Network.HTTP.Conduit import Data.Text.Encoding (decodeUtf8) import qualified Data.ByteString.Lazy as BS import qualified Data.Text as T data Parser = Parsec | Attoparsec -- | A convenience function for terminating a parse with a parse failure, using -- the given error message as the message for the failure. errResult :: String -> Either ParseFailure (RDF rdfImpl) errResult msg = Left (ParseFailure msg) _parseURL :: (T.Text -> Either ParseFailure (RDF rdfImpl)) -> String -> IO (Either ParseFailure (RDF rdfImpl)) _parseURL parseFunc url = do result <- Control.Exception.Lifted.try $ simpleHttp url case result of Left (ex::HttpException) -> case ex of (HttpExceptionRequest _req content) -> case content of ConnectionTimeout -> do return $ errResult "Connection timed out" _ -> return $ errResult ("HttpExceptionRequest content: " ++ show content) (InvalidUrlException{}) -> return $ errResult "Invalid URL exception" Right bs -> do let s = decodeUtf8 $ BS.toStrict bs return (parseFunc s)