module Network.Wreq.ErrorHandling where
import Control.Exception.Lifted as Lifted
import Control.Lens
import Control.Monad.Except
import Data.ByteString.Char8 as C8
import Data.Monoid
import Network.HTTP.Client
import Network.HTTP.Types.Status
#if !MIN_VERSION_http_client(0,5,0)
import Data.HashMap.Lazy as H
#endif
import Hocker.Types.Exceptions
interceptHttpExc :: ExceptT HockerException IO a
-> ExceptT HockerException IO a
interceptHttpExc a = Lifted.try a >>= except . over _Left prettify
where
except (Left e) = throwError e
except (Right v) = return v
prettify :: HttpException -> HockerException
#if MIN_VERSION_http_client(0,5,0)
prettify
(HttpExceptionRequest _
(StatusCodeException
(responseStatus -> (Status code msg)) body))
= HockerException
(show code <> " " <> C8.unpack msg)
(Just $ C8.unpack body)
Nothing
#else
prettify
(StatusCodeException (Status code msg) (H.fromList -> e) _)
= HockerException
((show code) <> " " <> C8.unpack msg)
(C8.unpack <$> H.lookup "X-Response-Body-Start" e)
Nothing
#endif
prettify e = HockerException (show e) Nothing Nothing