module Network.SOAP.Transport.HTTP.Conduit
(
initTransport, initTransport_
, EndpointURL
, RequestP, clientCert
, BodyP, iconv
, runQuery
) where
import Text.XML
import Network.HTTP.Conduit
import Control.Monad.Trans.Resource
import Codec.Text.IConv (EncodingName, convertFuzzy, Fuzzy(Transliterate))
import qualified Network.TLS.Extra as TLS
import qualified Data.ByteString.Char8 as BS
import Data.ByteString.Lazy.Char8 (ByteString)
import Network.SOAP.Transport
type RequestP = Request (ResourceT IO) -> Request (ResourceT IO)
type BodyP = ByteString -> ByteString
type EndpointURL = String
initTransport :: EndpointURL
-> RequestP
-> BodyP
-> IO Transport
initTransport url updateReq updateBody = do
manager <- newManager def
return $! runQuery manager url updateReq updateBody
initTransport_ :: EndpointURL -> IO Transport
initTransport_ url = initTransport url id id
runQuery :: Manager
-> EndpointURL
-> RequestP
-> BodyP
-> Transport
runQuery manager url updateReq updateBody soapAction doc = do
let body = renderLBS def $! doc
request <- parseUrl url
let request' = request { method = "POST"
, responseTimeout = Just 15000000
, requestBody = RequestBodyLBS body
, requestHeaders = [ ("Content-Type", "text/xml; charset=utf-8")
, ("SOAPAction", BS.pack soapAction)
]
}
res <- runResourceT $ httpLbs (updateReq request') manager
return . updateBody . responseBody $ res
iconv :: EncodingName -> BodyP
iconv src = convertFuzzy Transliterate src "UTF-8"
clientCert :: FilePath
-> FilePath
-> IO RequestP
clientCert certPath keyPath = do
cert <- TLS.fileReadCertificate certPath
pkey <- TLS.fileReadPrivateKey keyPath
return $ \req -> req { clientCertificates = [(cert, Just pkey)] }