From c4812d3d2b2dca3048ee1ecdca29f08e849a07ba Mon Sep 17 00:00:00 2001 From: ynishinaka <96223955+ynishinaka@users.noreply.github.com> Date: Tue, 3 Dec 2024 19:42:31 +0900 Subject: [PATCH 1/2] Allow segments to be omitted --- src/LaunchDarkly/Server/Network/Streaming.hs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/LaunchDarkly/Server/Network/Streaming.hs b/src/LaunchDarkly/Server/Network/Streaming.hs index e2d2bd9..5b6d2b8 100644 --- a/src/LaunchDarkly/Server/Network/Streaming.hs +++ b/src/LaunchDarkly/Server/Network/Streaming.hs @@ -27,7 +27,7 @@ import System.Clock (Clock (Monotonic), TimeSpec (TimeSpec), getTime) import System.Random (Random (randomR), newStdGen) import System.Timeout (timeout) -import LaunchDarkly.AesonCompat (KeyMap) +import LaunchDarkly.AesonCompat (KeyMap, emptyObject) import LaunchDarkly.Server.Config.ClientContext (ClientContext (..)) import LaunchDarkly.Server.Config.HttpConfiguration (HttpConfiguration (..), prepareRequest) import LaunchDarkly.Server.DataSource.Internal (DataSourceUpdates (..)) @@ -39,7 +39,7 @@ data PutBody = PutBody { flags :: !(KeyMap Flag) , segments :: !(KeyMap Segment) } - deriving (Generic, Show, FromJSON) + deriving (Generic, Show) data PathData d = PathData { path :: !Text @@ -53,6 +53,12 @@ data PathVersion = PathVersion } deriving (Generic, Show, FromJSON) +instance FromJSON PutBody where + parseJSON = withObject "PutBody" $ \o -> do + flags <- o .: "flags" + segments <- o .:? "segments" .!= emptyObject + pure $ PutBody {flags = flags, segments = segments} + instance FromJSON a => FromJSON (PathData a) where parseJSON = withObject "Put" $ \o -> do pathData <- o .: "data" From 2a1ca0349879a0d23fd2501fe011f9855b606d5e Mon Sep 17 00:00:00 2001 From: ynishinaka <96223955+ynishinaka@users.noreply.github.com> Date: Wed, 4 Dec 2024 19:37:34 +0900 Subject: [PATCH 2/2] parseEvent: follow the grammar precisely https://html.spec.whatwg.org/multipage/server-sent-events.html#server-sent-events --- src/LaunchDarkly/Server/Network/Streaming.hs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/LaunchDarkly/Server/Network/Streaming.hs b/src/LaunchDarkly/Server/Network/Streaming.hs index 5b6d2b8..063303d 100644 --- a/src/LaunchDarkly/Server/Network/Streaming.hs +++ b/src/LaunchDarkly/Server/Network/Streaming.hs @@ -3,7 +3,7 @@ module LaunchDarkly.Server.Network.Streaming (streamingThread) where -import Control.Applicative (many) +import Control.Applicative (many, (<|>)) import Control.Concurrent (threadDelay) import Control.Exception (throwIO) import Control.Monad (mzero, void) @@ -104,7 +104,7 @@ processField (fieldName, fieldValue) event = case fieldName of parseEvent :: Parser SSE parseEvent = do - fields <- many (many comment >> parseField >>= pure) + fields <- concat <$> many ((comment >> pure []) <|> fmap (: []) parseField) endOfLineSSE let event = foldr processField (SSE "" "" mzero mzero) fields if T.null (name event) || T.null (buffer event) then parseEvent else pure event