summaryrefslogtreecommitdiff
path: root/src/Hakyll
diff options
context:
space:
mode:
Diffstat (limited to 'src/Hakyll')
-rw-r--r--src/Hakyll/Check.hs37
1 files changed, 23 insertions, 14 deletions
diff --git a/src/Hakyll/Check.hs b/src/Hakyll/Check.hs
index 8bfc2aa..c917f3a 100644
--- a/src/Hakyll/Check.hs
+++ b/src/Hakyll/Check.hs
@@ -14,6 +14,7 @@ import Control.Monad.RWS (RWST, runRWST)
import Control.Monad.Trans (liftIO)
import Control.Monad.Trans.Resource (runResourceT)
import Control.Monad.Writer (tell)
+import Data.ByteString.Char8 (unpack)
import Data.List (isPrefixOf)
import Data.Set (Set)
import qualified Data.Set as S
@@ -28,9 +29,8 @@ import qualified Text.HTML.TagSoup as TS
--------------------------------------------------------------------------------
#ifdef CHECK_EXTERNAL
-import Control.Exception (AsyncException (..),
- SomeException (..), handle,
- throw)
+import Control.Exception (SomeAsyncException (..),
+ SomeException (..), try, throw)
import Control.Monad.State (get, modify)
import Data.List (intercalate)
import Data.Typeable (cast)
@@ -162,11 +162,14 @@ skip reason = do
tell $ mempty {checkerOk = 1}
--------------------------------------------------------------------------------
-faulty :: String -> Checker ()
-faulty url = do
+faulty :: String -> Maybe String -> Checker ()
+faulty url reason = do
logger <- checkerLogger <$> ask
- Logger.error logger $ "Broken link to " ++ show url
+ Logger.error logger $ "Broken link to " ++ show url ++ explanation
tell $ mempty {checkerFaulty = 1}
+ where
+ formatExplanation = (" (" ++) . (++ ")")
+ explanation = maybe "" formatExplanation reason
--------------------------------------------------------------------------------
@@ -182,7 +185,7 @@ checkInternalUrl base url = case url' of
| otherwise = dir </> url'
exists <- checkFileExists filePath
- if exists then ok url else faulty url
+ if exists then ok url else faulty url Nothing
where
url' = stripFragments $ unEscapeString url
@@ -198,7 +201,7 @@ checkExternalUrl url = do
if not needsCheck || checked
then Logger.debug logger "Already checked, skipping"
else do
- isOk <- liftIO $ handle (failure logger) $ do
+ result <- liftIO $ try $ do
mgr <- Http.newManager Http.tlsManagerSettings
runResourceT $ do
request <- Http.parseUrl urlToCheck
@@ -209,7 +212,12 @@ checkExternalUrl url = do
modify $ if schemeRelative url
then S.insert urlToCheck . S.insert url
else S.insert url
- if isOk then ok url else faulty url
+ case result of
+ Left (SomeException e) ->
+ case (cast e :: Maybe SomeAsyncException) of
+ Just ae -> throw ae
+ _ -> faulty url (Just $ showException e)
+ Right _ -> ok url
where
-- Add additional request info
settings r = r
@@ -222,14 +230,15 @@ checkExternalUrl url = do
ua = fromString $ "hakyll-check/" ++
(intercalate "." $ map show $ versionBranch $ Paths_hakyll.version)
- -- Catch all the things except UserInterrupt
- failure logger (SomeException e) = case cast e of
- Just UserInterrupt -> throw UserInterrupt
- _ -> Logger.error logger (show e) >> return False
-
-- Check scheme-relative links
schemeRelative = isPrefixOf "//"
urlToCheck = if schemeRelative url then "http:" ++ url else url
+
+ -- Convert exception to a concise form
+ showException e = case cast e of
+ Just (Http.StatusCodeException (Http.Status code msg) _ _) ->
+ show code ++ " " ++ unpack msg
+ _ -> head $ words $ show e
#else
checkExternalUrl _ = return ()
#endif