{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE RecordWildCards #-} module OpenTelemetry.Propagator.W3CBaggage where import Data.ByteString import Network.HTTP.Types import qualified OpenTelemetry.Baggage as Baggage import OpenTelemetry.Context (Context, insertBaggage, lookupBaggage) import OpenTelemetry.Propagator decodeBaggage :: ByteString -> Maybe Baggage.Baggage decodeBaggage bs = case Baggage.decodeBaggageHeader bs of Left _ -> Nothing Right b -> Just b encodeBaggage :: Baggage.Baggage -> ByteString encodeBaggage = Baggage.encodeBaggageHeader w3cBaggagePropagator :: Propagator Context RequestHeaders ResponseHeaders w3cBaggagePropagator = Propagator{..} where propagatorNames = [ "baggage" ] extractor hs c = case Prelude.lookup "baggage" hs of Nothing -> pure c Just baggageHeader -> case decodeBaggage baggageHeader of Nothing -> pure c Just baggage -> pure $! insertBaggage baggage c injector c hs = do case lookupBaggage c of Nothing -> pure hs Just baggage -> pure $! (("baggage", encodeBaggage baggage) : hs)