{-# LANGUAGE LambdaCase #-} {-# LANGUAGE OverloadedStrings #-} module Speechmatics.Request( getWith, Sess.newSession, Sess.Session, postWith ) where import Control.Applicative import Control.Concurrent (threadDelay) import Control.Lens import Control.Monad import Control.Monad.Except import Data.Text.Encoding import Network.HTTP.Types.URI import OpenSSL.Session (context) import Data.Aeson (FromJSON (parseJSON), Value, eitherDecode, encode) import Network.HTTP.Client (defaultManagerSettings, managerResponseTimeout, responseTimeoutMicro, HttpException) import Data.Bifunctor import Network.HTTP.Client.OpenSSL import Network.Mime (MimeType) import qualified Network.Wreq as Wreq import System.Log.Heavy.LoggingT(LoggingT(..)) import qualified System.Log.Heavy.Shortcuts as Logcut (info, debug) import Data.Text.Format.Heavy.Instances (Single(..)) import qualified Data.ByteString.Char8 as C8BS import qualified Data.ByteString.Lazy as LBS import qualified Data.ByteString.Lazy.Char8 as C8LBS import Data.Maybe import Data.Monoid import Data.Text import qualified Data.Text.Lazy as Lazy import qualified Network.Wreq.Session as Sess import qualified Network.Wreq.Types as Types import qualified Speechmatics.JSON.PeekJob as Peek import qualified Speechmatics.JSON.PostJob as Post import Control.Lens.Prism import Control.Exception import Control.Exception.Lens import qualified Speechmatics.Log as Log import qualified Data.ByteString as BS import Control.Monad.Trans.Control(liftWith) class AsHttpExceptiont t where _HttpException :: Prism' t HttpException instance AsHttpExceptiont HttpException where _HttpException = id instance AsHttpExceptiont SomeException where _HttpException = exception logException :: IO (Wreq.Response C8LBS.ByteString) -> LoggingT IO (Wreq.Response C8LBS.ByteString) logException func = liftWith (\run -> catching _HttpException func (\x -> (run $ Log.error $ pack ("Got an http exception: " <> show x)) >> throwIO x ) ) getWith :: Wreq.Options -> Sess.Session -> String -> LoggingT IO (Wreq.Response C8LBS.ByteString) getWith opts sess str = do Log.debug (pack ("Making get request to " <> str)) logException $ Sess.getWith opts sess str postWith :: Types.Postable a => Wreq.Options -> Sess.Session -> String -> a -> LoggingT IO (Wreq.Response C8LBS.ByteString) postWith opts sess str post = do Log.debug (pack ("Making get request to " <> str)) logException $ Sess.postWith opts sess str post