module Network.Bugsnag.BeforeNotify
( BeforeNotify
, updateException
, updateStackFrames
, filterStackFrames
, setStackFramesCode
, setStackFramesInProject
, setStackFramesInProjectBy
, setGroupingHash
, setGroupingHashBy
, updateEventFromException
, updateEventFromOriginalException
, updateEventFromSession
, updateEventFromWaiRequest
, updateEventFromWaiRequestUnredacted
, redactRequestHeaders
, setDevice
, setRequest
, setStacktrace
, setWarningSeverity
, setErrorSeverity
, setInfoSeverity
) where
import Prelude
import Control.Exception (Exception, fromException)
import Data.Maybe (fromMaybe)
import Data.Text (Text)
import Network.Bugsnag.BugsnagRequestHeaders
import Network.Bugsnag.CodeIndex
import Network.Bugsnag.Device
import Network.Bugsnag.Event
import Network.Bugsnag.Exception
import Network.Bugsnag.Request
import Network.Bugsnag.Session
import Network.Bugsnag.Severity
import Network.Bugsnag.StackFrame
import Network.HTTP.Types.Header (HeaderName)
import Network.Wai (Request)
type BeforeNotify = BugsnagEvent -> BugsnagEvent
updateException :: (BugsnagException -> BugsnagException) -> BeforeNotify
updateException :: (BugsnagException -> BugsnagException) -> BeforeNotify
updateException BugsnagException -> BugsnagException
f BugsnagEvent
event = BugsnagEvent
event { beException :: BugsnagException
beException = BugsnagException -> BugsnagException
f (BugsnagException -> BugsnagException)
-> BugsnagException -> BugsnagException
forall a b. (a -> b) -> a -> b
$ BugsnagEvent -> BugsnagException
beException BugsnagEvent
event }
updateStackFrames :: (BugsnagStackFrame -> BugsnagStackFrame) -> BeforeNotify
updateStackFrames :: (BugsnagStackFrame -> BugsnagStackFrame) -> BeforeNotify
updateStackFrames BugsnagStackFrame -> BugsnagStackFrame
f =
(BugsnagException -> BugsnagException) -> BeforeNotify
updateException ((BugsnagException -> BugsnagException) -> BeforeNotify)
-> (BugsnagException -> BugsnagException) -> BeforeNotify
forall a b. (a -> b) -> a -> b
$ \BugsnagException
ex -> BugsnagException
ex { beStacktrace :: [BugsnagStackFrame]
beStacktrace = (BugsnagStackFrame -> BugsnagStackFrame)
-> [BugsnagStackFrame] -> [BugsnagStackFrame]
forall a b. (a -> b) -> [a] -> [b]
map BugsnagStackFrame -> BugsnagStackFrame
f ([BugsnagStackFrame] -> [BugsnagStackFrame])
-> [BugsnagStackFrame] -> [BugsnagStackFrame]
forall a b. (a -> b) -> a -> b
$ BugsnagException -> [BugsnagStackFrame]
beStacktrace BugsnagException
ex }
filterStackFrames :: (BugsnagStackFrame -> Bool) -> BeforeNotify
filterStackFrames :: (BugsnagStackFrame -> Bool) -> BeforeNotify
filterStackFrames BugsnagStackFrame -> Bool
p =
(BugsnagException -> BugsnagException) -> BeforeNotify
updateException ((BugsnagException -> BugsnagException) -> BeforeNotify)
-> (BugsnagException -> BugsnagException) -> BeforeNotify
forall a b. (a -> b) -> a -> b
$ \BugsnagException
ex -> BugsnagException
ex { beStacktrace :: [BugsnagStackFrame]
beStacktrace = (BugsnagStackFrame -> Bool)
-> [BugsnagStackFrame] -> [BugsnagStackFrame]
forall a. (a -> Bool) -> [a] -> [a]
filter BugsnagStackFrame -> Bool
p ([BugsnagStackFrame] -> [BugsnagStackFrame])
-> [BugsnagStackFrame] -> [BugsnagStackFrame]
forall a b. (a -> b) -> a -> b
$ BugsnagException -> [BugsnagStackFrame]
beStacktrace BugsnagException
ex }
setStackFramesCode :: CodeIndex -> BeforeNotify
setStackFramesCode :: CodeIndex -> BeforeNotify
setStackFramesCode = (BugsnagStackFrame -> BugsnagStackFrame) -> BeforeNotify
updateStackFrames ((BugsnagStackFrame -> BugsnagStackFrame) -> BeforeNotify)
-> (CodeIndex -> BugsnagStackFrame -> BugsnagStackFrame)
-> CodeIndex
-> BeforeNotify
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CodeIndex -> BugsnagStackFrame -> BugsnagStackFrame
attachBugsnagCode
setStackFramesInProject :: (FilePath -> Bool) -> BeforeNotify
setStackFramesInProject :: (FilePath -> Bool) -> BeforeNotify
setStackFramesInProject = (BugsnagStackFrame -> FilePath)
-> (FilePath -> Bool) -> BeforeNotify
forall a. (BugsnagStackFrame -> a) -> (a -> Bool) -> BeforeNotify
setStackFramesInProjectBy BugsnagStackFrame -> FilePath
bsfFile
setStackFramesInProjectBy
:: (BugsnagStackFrame -> a) -> (a -> Bool) -> BeforeNotify
setStackFramesInProjectBy :: (BugsnagStackFrame -> a) -> (a -> Bool) -> BeforeNotify
setStackFramesInProjectBy BugsnagStackFrame -> a
f a -> Bool
p =
(BugsnagStackFrame -> BugsnagStackFrame) -> BeforeNotify
updateStackFrames ((BugsnagStackFrame -> BugsnagStackFrame) -> BeforeNotify)
-> (BugsnagStackFrame -> BugsnagStackFrame) -> BeforeNotify
forall a b. (a -> b) -> a -> b
$ \BugsnagStackFrame
sf -> BugsnagStackFrame
sf { bsfInProject :: Maybe Bool
bsfInProject = Bool -> Maybe Bool
forall a. a -> Maybe a
Just (Bool -> Maybe Bool) -> Bool -> Maybe Bool
forall a b. (a -> b) -> a -> b
$ a -> Bool
p (a -> Bool) -> a -> Bool
forall a b. (a -> b) -> a -> b
$ BugsnagStackFrame -> a
f BugsnagStackFrame
sf }
setGroupingHash :: Text -> BeforeNotify
setGroupingHash :: Text -> BeforeNotify
setGroupingHash Text
hash = (BugsnagEvent -> Maybe Text) -> BeforeNotify
setGroupingHashBy ((BugsnagEvent -> Maybe Text) -> BeforeNotify)
-> (BugsnagEvent -> Maybe Text) -> BeforeNotify
forall a b. (a -> b) -> a -> b
$ Maybe Text -> BugsnagEvent -> Maybe Text
forall a b. a -> b -> a
const (Maybe Text -> BugsnagEvent -> Maybe Text)
-> Maybe Text -> BugsnagEvent -> Maybe Text
forall a b. (a -> b) -> a -> b
$ Text -> Maybe Text
forall a. a -> Maybe a
Just Text
hash
setGroupingHashBy :: (BugsnagEvent -> Maybe Text) -> BeforeNotify
setGroupingHashBy :: (BugsnagEvent -> Maybe Text) -> BeforeNotify
setGroupingHashBy BugsnagEvent -> Maybe Text
f BugsnagEvent
event = BugsnagEvent
event { beGroupingHash :: Maybe Text
beGroupingHash = BugsnagEvent -> Maybe Text
f BugsnagEvent
event }
updateEventFromException :: (BugsnagException -> BeforeNotify) -> BeforeNotify
updateEventFromException :: (BugsnagException -> BeforeNotify) -> BeforeNotify
updateEventFromException BugsnagException -> BeforeNotify
f BugsnagEvent
event = BugsnagException -> BeforeNotify
f (BugsnagEvent -> BugsnagException
beException BugsnagEvent
event) BugsnagEvent
event
updateEventFromOriginalException
:: Exception e => (e -> BeforeNotify) -> BeforeNotify
updateEventFromOriginalException :: (e -> BeforeNotify) -> BeforeNotify
updateEventFromOriginalException e -> BeforeNotify
f BugsnagEvent
event = BugsnagEvent -> Maybe BugsnagEvent -> BugsnagEvent
forall a. a -> Maybe a -> a
fromMaybe BugsnagEvent
event (Maybe BugsnagEvent -> BugsnagEvent)
-> Maybe BugsnagEvent -> BugsnagEvent
forall a b. (a -> b) -> a -> b
$ do
SomeException
someException <- BugsnagException -> Maybe SomeException
beOriginalException (BugsnagException -> Maybe SomeException)
-> BugsnagException -> Maybe SomeException
forall a b. (a -> b) -> a -> b
$ BugsnagEvent -> BugsnagException
beException BugsnagEvent
event
e
yourException <- SomeException -> Maybe e
forall e. Exception e => SomeException -> Maybe e
fromException SomeException
someException
BugsnagEvent -> Maybe BugsnagEvent
forall (f :: * -> *) a. Applicative f => a -> f a
pure (BugsnagEvent -> Maybe BugsnagEvent)
-> BugsnagEvent -> Maybe BugsnagEvent
forall a b. (a -> b) -> a -> b
$ e -> BeforeNotify
f e
yourException BugsnagEvent
event
updateEventFromWaiRequest :: Request -> BeforeNotify
updateEventFromWaiRequest :: Request -> BeforeNotify
updateEventFromWaiRequest Request
wrequest =
[HeaderName] -> BeforeNotify
redactRequestHeaders [HeaderName
"Authorization", HeaderName
"Cookie", HeaderName
"X-XSRF-TOKEN"]
BeforeNotify -> BeforeNotify -> BeforeNotify
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Request -> BeforeNotify
updateEventFromWaiRequestUnredacted Request
wrequest
updateEventFromWaiRequestUnredacted :: Request -> BeforeNotify
updateEventFromWaiRequestUnredacted :: Request -> BeforeNotify
updateEventFromWaiRequestUnredacted Request
wrequest =
let
mdevice :: Maybe BugsnagDevice
mdevice = Request -> Maybe BugsnagDevice
bugsnagDeviceFromWaiRequest Request
wrequest
request :: BugsnagRequest
request = Request -> BugsnagRequest
bugsnagRequestFromWaiRequest Request
wrequest
in BeforeNotify
-> (BugsnagDevice -> BeforeNotify)
-> Maybe BugsnagDevice
-> BeforeNotify
forall b a. b -> (a -> b) -> Maybe a -> b
maybe BeforeNotify
forall a. a -> a
id BugsnagDevice -> BeforeNotify
setDevice Maybe BugsnagDevice
mdevice BeforeNotify -> BeforeNotify -> BeforeNotify
forall b c a. (b -> c) -> (a -> b) -> a -> c
. BugsnagRequest -> BeforeNotify
setRequest BugsnagRequest
request
updateEventFromSession :: BugsnagSession -> BeforeNotify
updateEventFromSession :: BugsnagSession -> BeforeNotify
updateEventFromSession BugsnagSession
session BugsnagEvent
event =
BugsnagEvent
event { beContext :: Maybe Text
beContext = BugsnagSession -> Maybe Text
bsContext BugsnagSession
session, beUser :: Maybe BugsnagUser
beUser = BugsnagSession -> Maybe BugsnagUser
bsUser BugsnagSession
session }
redactRequestHeaders :: [HeaderName] -> BeforeNotify
[HeaderName]
headers BugsnagEvent
event =
BugsnagEvent
event { beRequest :: Maybe BugsnagRequest
beRequest = [HeaderName] -> BugsnagRequest -> BugsnagRequest
redactHeaders [HeaderName]
headers (BugsnagRequest -> BugsnagRequest)
-> Maybe BugsnagRequest -> Maybe BugsnagRequest
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> BugsnagEvent -> Maybe BugsnagRequest
beRequest BugsnagEvent
event }
redactHeaders :: [HeaderName] -> BugsnagRequest -> BugsnagRequest
[HeaderName]
headers BugsnagRequest
request = BugsnagRequest
request
{ brHeaders :: Maybe BugsnagRequestHeaders
brHeaders = [HeaderName] -> BugsnagRequestHeaders -> BugsnagRequestHeaders
redactBugsnagRequestHeaders [HeaderName]
headers (BugsnagRequestHeaders -> BugsnagRequestHeaders)
-> Maybe BugsnagRequestHeaders -> Maybe BugsnagRequestHeaders
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> BugsnagRequest -> Maybe BugsnagRequestHeaders
brHeaders BugsnagRequest
request
}
setRequest :: BugsnagRequest -> BeforeNotify
setRequest :: BugsnagRequest -> BeforeNotify
setRequest BugsnagRequest
request BugsnagEvent
event = BugsnagEvent
event { beRequest :: Maybe BugsnagRequest
beRequest = BugsnagRequest -> Maybe BugsnagRequest
forall a. a -> Maybe a
Just BugsnagRequest
request }
setDevice :: BugsnagDevice -> BeforeNotify
setDevice :: BugsnagDevice -> BeforeNotify
setDevice BugsnagDevice
device BugsnagEvent
event = BugsnagEvent
event { beDevice :: Maybe BugsnagDevice
beDevice = BugsnagDevice -> Maybe BugsnagDevice
forall a. a -> Maybe a
Just BugsnagDevice
device }
setStacktrace :: [BugsnagStackFrame] -> BeforeNotify
setStacktrace :: [BugsnagStackFrame] -> BeforeNotify
setStacktrace [BugsnagStackFrame]
stacktrace =
(BugsnagException -> BugsnagException) -> BeforeNotify
updateException ((BugsnagException -> BugsnagException) -> BeforeNotify)
-> (BugsnagException -> BugsnagException) -> BeforeNotify
forall a b. (a -> b) -> a -> b
$ \BugsnagException
ex -> BugsnagException
ex { beStacktrace :: [BugsnagStackFrame]
beStacktrace = [BugsnagStackFrame]
stacktrace }
setErrorSeverity :: BeforeNotify
setErrorSeverity :: BeforeNotify
setErrorSeverity = BugsnagSeverity -> BeforeNotify
setSeverity BugsnagSeverity
ErrorSeverity
setWarningSeverity :: BeforeNotify
setWarningSeverity :: BeforeNotify
setWarningSeverity = BugsnagSeverity -> BeforeNotify
setSeverity BugsnagSeverity
WarningSeverity
setInfoSeverity :: BeforeNotify
setInfoSeverity :: BeforeNotify
setInfoSeverity = BugsnagSeverity -> BeforeNotify
setSeverity BugsnagSeverity
InfoSeverity
setSeverity :: BugsnagSeverity -> BeforeNotify
setSeverity :: BugsnagSeverity -> BeforeNotify
setSeverity BugsnagSeverity
severity BugsnagEvent
event = BugsnagEvent
event { beSeverity :: Maybe BugsnagSeverity
beSeverity = BugsnagSeverity -> Maybe BugsnagSeverity
forall a. a -> Maybe a
Just BugsnagSeverity
severity }