aboutsummaryrefslogtreecommitdiff
path: root/src/Text
diff options
context:
space:
mode:
authorJohn MacFarlane <[email protected]>2025-12-24 10:13:03 -0700
committerJohn MacFarlane <[email protected]>2025-12-24 11:00:25 -0700
commit83692bbc50d46e157126099da84233deb6dc6574 (patch)
tree30ee8f569121a989a3fa97d5331b06f3f4bcbdc2 /src/Text
parenteef6cde22f868c82618bf9517f5281f28ed10ab0 (diff)
Add http cabal flag.
This allows pandoc to be compiled without support for making HTTP requests, which is useful when WASM is the target. Closes #10980.
Diffstat (limited to 'src/Text')
-rw-r--r--src/Text/Pandoc/Class/CommonState.hs7
-rw-r--r--src/Text/Pandoc/Class/IO.hs23
2 files changed, 23 insertions, 7 deletions
diff --git a/src/Text/Pandoc/Class/CommonState.hs b/src/Text/Pandoc/Class/CommonState.hs
index e3c4efce9..27f9c7f16 100644
--- a/src/Text/Pandoc/Class/CommonState.hs
+++ b/src/Text/Pandoc/Class/CommonState.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
{- |
Module : Text.Pandoc.Class.CommonState
Copyright : Copyright (C) 2016-2020 Jesse Rosenthal, John MacFarlane
@@ -23,7 +24,9 @@ import Text.Collate.Lang (Lang)
import Text.Pandoc.MediaBag (MediaBag)
import Text.Pandoc.Logging (LogMessage, Verbosity (WARNING))
import Text.Pandoc.Translations.Types (Translations)
+#ifdef PANDOC_HTTP_SUPPORT
import Network.HTTP.Client (Manager)
+#endif
-- | 'CommonState' represents state that is used by all
-- instances of 'PandocMonad'. Normally users should not
@@ -51,9 +54,11 @@ data CommonState = CommonState
, stResourcePath :: [FilePath]
-- ^ Path to search for resources like
-- included images
+#ifdef PANDOC_HTTP_SUPPORT
, stManager :: Maybe Manager
-- ^ Manager for HTTP client; this needs to persist across many requests
-- for efficiency.
+#endif
, stVerbosity :: Verbosity
-- ^ Verbosity level
, stTrace :: Bool
@@ -79,7 +84,9 @@ defaultCommonState = CommonState
, stInputFiles = []
, stOutputFile = Nothing
, stResourcePath = ["."]
+#ifdef PANDOC_HTTP_SUPPORT
, stManager = Nothing
+#endif
, stVerbosity = WARNING
, stTrace = False
}
diff --git a/src/Text/Pandoc/Class/IO.hs b/src/Text/Pandoc/Class/IO.hs
index 1a9dc2eae..4c0d7b1ab 100644
--- a/src/Text/Pandoc/Class/IO.hs
+++ b/src/Text/Pandoc/Class/IO.hs
@@ -38,13 +38,17 @@ module Text.Pandoc.Class.IO
import Control.Monad.Except (throwError)
import Control.Monad.IO.Class (MonadIO, liftIO)
-import Data.ByteString.Lazy (toChunks)
import Data.Text (Text, pack, unpack)
import Data.Time (TimeZone, UTCTime)
import Data.Unique (hashUnique)
+#ifdef PANDOC_HTTP_SUPPORT
+import Data.ByteString.Lazy (toChunks)
+import System.Environment (getEnv)
+import Data.Default (def)
import Network.Connection (TLSSettings(..))
import qualified Network.TLS as TLS
import qualified Network.TLS.Extra as TLS
+import System.X509 (getSystemCertificateStore)
import Network.HTTP.Client
(httpLbs, Manager, responseBody, responseHeaders,
Request(port, host, requestHeaders), parseUrlThrow, newManager, HttpException)
@@ -52,17 +56,19 @@ import Network.HTTP.Client.Internal (addProxy)
import Network.HTTP.Client.TLS (mkManagerSettings)
import Network.HTTP.Types.Header ( hContentType )
import Network.Socket (withSocketsDo)
+import Text.Pandoc.Class.CommonState (CommonState (..))
+import Text.Pandoc.Class.PandocMonad ( getsCommonState, modifyCommonState )
+import qualified Data.CaseInsensitive as CI
+#endif
import Network.URI (URI(..), parseURI, unEscapeString)
import System.Directory (createDirectoryIfMissing)
-import System.Environment (getEnv)
import System.FilePath ((</>), takeDirectory, normalise)
import qualified System.FilePath.Posix as Posix
import System.IO (stderr)
import System.IO.Error
import System.Random (StdGen)
-import Text.Pandoc.Class.CommonState (CommonState (..))
import Text.Pandoc.Class.PandocMonad
- (PandocMonad, getsCommonState, modifyCommonState,
+ (PandocMonad,
getMediaBag, report, extractURIData)
import Text.Pandoc.Definition (Pandoc, Inline (Image))
import Text.Pandoc.Error (PandocError (..))
@@ -73,7 +79,6 @@ import Text.Pandoc.Walk (walk)
import qualified Control.Exception as E
import qualified Data.ByteString as B
import qualified Data.ByteString.Lazy as BL
-import qualified Data.CaseInsensitive as CI
import qualified Data.Text as T
import qualified Data.Time
import qualified Data.Time.LocalTime
@@ -83,8 +88,6 @@ import qualified System.Environment as Env
import qualified System.FilePath.Glob
import qualified System.Random
import qualified Text.Pandoc.UTF8 as UTF8
-import Data.Default (def)
-import System.X509 (getSystemCertificateStore)
#ifndef EMBED_DATA_FILES
import qualified Paths_pandoc as Paths
#endif
@@ -125,6 +128,7 @@ newStdGen = liftIO System.Random.newStdGen
newUniqueHash :: MonadIO m => m Int
newUniqueHash = hashUnique <$> liftIO Data.Unique.newUnique
+#ifdef PANDOC_HTTP_SUPPORT
getManager :: (PandocMonad m, MonadIO m) => m Manager
getManager = do
mbManager <- getsCommonState stManager
@@ -154,12 +158,14 @@ getManager = do
newManager tlsManagerSettings
modifyCommonState $ \st -> st{ stManager = Just manager }
pure manager
+#endif
openURL :: (PandocMonad m, MonadIO m) => Text -> m (B.ByteString, Maybe MimeType)
openURL u
| Just (URI{ uriScheme = "data:",
uriPath = upath }) <- parseURI (T.unpack u)
= pure $ extractURIData upath
+#ifdef PANDOC_HTTP_SUPPORT
| otherwise = do
let toReqHeader (n, v) = (CI.mk (UTF8.fromText n), UTF8.fromText v)
customHeaders <- map toReqHeader <$> getsCommonState stRequestHeaders
@@ -181,6 +187,9 @@ openURL u
Right r -> return r
Left (e :: HttpException)
-> throwError $ PandocHttpError u (T.pack (show e))
+#else
+ | otherwise = error "Text.Pandoc.Class.IO.openURL"
+#endif
-- | Read the lazy ByteString contents from a file path, raising an error on
-- failure.