1 {-# LANGUAGE OverloadedStrings #-} 2 module Databrary.EZID.Service 3 ( EZID(..) 4 , initEZID 5 ) where 6 7 import Control.Monad (unless, forM) 8 import qualified Data.ByteString as BS 9 import qualified Data.ByteString.Char8 as BSC 10 import qualified Network.HTTP.Client as HC 11 import Network.HTTP.Types (hContentType) 12 13 import qualified Databrary.Store.Config as C 14 15 data EZID = EZID 16 { ezidRequest :: !HC.Request 17 , ezidNS :: !BS.ByteString 18 } 19 20 initEZID :: C.Config -> IO (Maybe EZID) 21 initEZID conf = conf C.! "ns" `forM` \ns -> do 22 unless ("doi:10." `BSC.isPrefixOf` ns) $ 23 fail "ezid.ns must be for DOIs" 24 req <- HC.parseRequest "https://ezid.cdlib.org/" 25 return $ EZID 26 { ezidRequest = HC.applyBasicAuth (conf C.! "user") (conf C.! "pass") req 27 { HC.requestHeaders = (hContentType, "text/plain") : HC.requestHeaders req 28 , HC.responseTimeout = HC.responseTimeoutMicro 100000000 29 , HC.redirectCount = 1 30 } 31 , ezidNS = ns 32 }