@@ -23,20 +23,21 @@ module Xrefcheck.Verify
2323 ) where
2424
2525import Control.Concurrent.Async (forConcurrently , withAsync )
26- import Control.Monad.Except (ExceptT , MonadError (.. ))
26+ import Control.Monad.Except (MonadError (.. ))
2727import qualified Data.Map as M
2828import qualified Data.Text as T
2929import Data.Text.Metrics (damerauLevenshteinNorm )
3030import Fmt (Buildable (.. ), blockListF' , listF , (+|) , (|+) )
3131import qualified GHC.Exts as Exts
3232import Network.HTTP.Client (HttpException (.. ), HttpExceptionContent (.. ), responseStatus )
3333import Network.HTTP.Req (GET (.. ), HEAD (.. ), HttpException (.. ), NoReqBody (.. ), defaultHttpConfig ,
34- ignoreResponse , parseUrl , req , runReq )
34+ ignoreResponse , req , runReq , useURI )
3535import Network.HTTP.Types.Status (Status , statusCode , statusMessage )
3636import System.Console.Pretty (Style (.. ), style )
3737import System.Directory (canonicalizePath , doesDirectoryExist , doesFileExist )
3838import System.FilePath (takeDirectory , (</>) )
3939import qualified System.FilePath.Glob as Glob
40+ import Text.URI (mkURI )
4041import Time (RatioNat , Second , Time (.. ), ms , threadDelay , timeout )
4142
4243import Xrefcheck.Config
@@ -94,6 +95,7 @@ data VerifyError
9495 | AnchorDoesNotExist Text [Anchor ]
9596 | AmbiguousAnchorRef FilePath Text (NonEmpty Anchor )
9697 | ExternalResourceInvalidUri
98+ | ExternalResourceUnknownProtocol
9799 | ExternalResourceUnavailable Status
98100 | ExternalResourceSomeError Text
99101 deriving (Show )
@@ -113,6 +115,8 @@ instance Buildable VerifyError where
113115 " Use of such anchors is discouraged because referenced object\n \
114116 \ can change silently whereas the document containing it evolves.\n "
115117 ExternalResourceInvalidUri ->
118+ " ⛂ Invalid url\n "
119+ ExternalResourceUnknownProtocol ->
116120 " ⛂ Bad url (expected 'http' or 'https')\n "
117121 ExternalResourceUnavailable status ->
118122 " ⛂ Resource unavailable (" +| statusCode status |+ " " +|
@@ -257,8 +261,10 @@ checkExternalResource VerifyConfig{..} link
257261
258262 makeRequest :: _ => method -> RatioNat -> IO (Either VerifyError () )
259263 makeRequest method timeoutFrac = runExceptT $ do
260- parsedUrl <- parseUrl (encodeUtf8 link)
261- & maybe (throwError ExternalResourceInvalidUri ) pure
264+ uri <- mkURI link
265+ & maybe (throwError ExternalResourceInvalidUri ) pure
266+ parsedUrl <- useURI uri
267+ & maybe (throwError ExternalResourceUnknownProtocol ) pure
262268 let reqLink = case parsedUrl of
263269 Left (url, option) ->
264270 runReq defaultHttpConfig $
0 commit comments