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     }