From e7348b4f769eb79973cdf52b11ec2a89bbca4a7f Mon Sep 17 00:00:00 2001
From: John MacFarlane <jgm@berkeley.edu>
Date: Wed, 6 Dec 2023 09:11:07 -0800
Subject: [PATCH] pandoc-server: Switch from base64 to base64-bytestring.

See #9233.
---
 pandoc-server/pandoc-server.cabal       |  2 +-
 pandoc-server/src/Text/Pandoc/Server.hs | 25 ++++++++++---------------
 2 files changed, 11 insertions(+), 16 deletions(-)

Index: b/pandoc-server.cabal
===================================================================
--- a/pandoc-server.cabal
+++ b/pandoc-server.cabal
@@ -54,7 +54,7 @@ library
                  containers            >= 0.6.0.1  && < 0.7,
                  aeson                 >= 2.0      && < 2.3,
                  bytestring            >= 0.9      && < 0.13,
-                 base64                >= 0.4      && < 0.5,
+                 base64-bytestring     >= 0.1      && < 1.3,
                  doctemplates          >= 0.11     && < 0.12,
                  data-default          >= 0.4      && < 0.8,
                  text                  >= 1.1.1.0  && < 2.1,
Index: b/src/Text/Pandoc/Server.hs
===================================================================
--- a/src/Text/Pandoc/Server.hs
+++ b/src/Text/Pandoc/Server.hs
@@ -29,7 +29,7 @@ import qualified Data.Text.Lazy.Encoding
 import Data.Maybe (fromMaybe)
 import qualified Data.ByteString as BS
 import qualified Data.ByteString.Lazy as BL
-import Data.ByteString.Base64 (decodeBase64, encodeBase64)
+import qualified Data.ByteString.Base64 as Base64 (decodeLenient, encode)
 import Data.Default
 import Control.Monad (when, unless, foldM)
 import qualified Data.Set as Set
@@ -111,15 +111,11 @@ newtype Blob = Blob BL.ByteString
   deriving (Show, Eq)
 
 instance ToJSON Blob where
-  toJSON (Blob bs) = toJSON (encodeBase64 $ BL.toStrict bs)
+  toJSON (Blob bs) = toJSON (UTF8.toText . Base64.encode $ BL.toStrict bs)
 
 instance FromJSON Blob where
- parseJSON = withText "Blob" $ \t -> do
-   let inp = UTF8.fromText t
-   case decodeBase64 inp of
-        Right bs -> return $ Blob $ BL.fromStrict bs
-        Left _ -> -- treat as regular text
-                    return $ Blob $ BL.fromStrict inp
+ parseJSON = withText "Blob" $
+   pure . Blob . BL.fromStrict . Base64.decodeLenient . UTF8.fromText
 
 -- This is the data to be supplied by the JSON payload
 -- of requests.  Maybe values may be omitted and will be
@@ -236,7 +232,8 @@ server = convertBytes
   --    handleErr =<< liftIO (runIO (convert' params))
   -- will allow the IO operations.
   convertText params = handleErr $
-    runPure (convert' return (return . encodeBase64 . BL.toStrict) params)
+    runPure (convert' return (return . UTF8.toText .
+                               Base64.encode . BL.toStrict) params)
 
   convertBytes params = handleErr $
     runPure (convert' (return . UTF8.fromText) (return . BL.toStrict) params)
@@ -245,7 +242,7 @@ server = convertBytes
     runPure
       (convert'
         (\t -> Succeeded t False . map toMessage <$> getLog)
-        (\bs -> Succeeded (encodeBase64 (BL.toStrict bs)) True
+        (\bs -> Succeeded (UTF8.toText $ Base64.encode (BL.toStrict bs)) True
                  . map toMessage <$> getLog)
         params)
 
@@ -341,11 +338,9 @@ server = convertBytes
 
     let reader = case readerSpec of
                 TextReader r -> r readeropts
-                ByteStringReader r -> \t -> do
-                  let eitherbs = decodeBase64 $ UTF8.fromText t
-                  case eitherbs of
-                    Left errt -> throwError $ PandocSomeError errt
-                    Right bs -> r readeropts $ BL.fromStrict bs
+                ByteStringReader r ->
+                  r readeropts . BL.fromStrict . Base64.decodeLenient
+                    . UTF8.fromText
 
     let writer d@(Pandoc meta _) = do
           case lookupMetaString "lang" meta of
