mirror of
https://github.com/simplex-chat/simplexmq.git
synced 2026-05-13 12:15:01 +00:00
9ee684b0f4
* rfc: faster handshake protocol * update * 1 message * SKEY * use SKEY for both parties * test * update doc * NEW command parameter * add k=s param to queue URI * fix * add sndSecure field to queues * make sender key non-optional in SndQueue (WIP, tests fail) * fast handshake sometimes works (many tests fail) * correctly handle SKEY retries, avoiding to re-generate the keys * handle SKEY retries during async connection * fix most tests (1 test fails) * remove do * fix contact requests encoding/tests * export * fix: ignore duplicate confirmations, fixes testBatchedPendingMessages * do not store sndSecure in store log if it is false to allow server downgrade * add connection invitation encoding tests
43 lines
1.5 KiB
Haskell
43 lines
1.5 KiB
Haskell
module Simplex.Messaging.Agent.QueryString where
|
|
|
|
import Data.Attoparsec.ByteString.Char8 (Parser)
|
|
import qualified Data.Attoparsec.ByteString.Char8 as A
|
|
import Data.ByteString.Char8 (ByteString)
|
|
import qualified Data.ByteString.Char8 as B
|
|
import Data.List (find)
|
|
import qualified Network.HTTP.Types as Q
|
|
import Simplex.Messaging.Encoding.String
|
|
import Simplex.Messaging.Parsers (parseAll)
|
|
|
|
data QueryStringParams = QSP QSPEscaping Q.SimpleQuery
|
|
deriving (Show)
|
|
|
|
data QSPEscaping = QEscape | QNoEscaping
|
|
deriving (Show)
|
|
|
|
instance StrEncoding QueryStringParams where
|
|
strEncode (QSP esc q) = case esc of
|
|
QEscape -> Q.renderSimpleQuery False q
|
|
QNoEscaping ->
|
|
Q.renderQueryPartialEscape False $
|
|
map (\(n, v) -> (n, [Q.QN v])) q
|
|
strP = QSP QEscape . Q.parseSimpleQuery <$> A.takeTill (\c -> c == ' ' || c == '\n')
|
|
|
|
queryParam :: StrEncoding a => ByteString -> QueryStringParams -> Parser a
|
|
queryParam = queryParamParser strP
|
|
|
|
queryParamParser :: Parser a -> ByteString -> QueryStringParams -> Parser a
|
|
queryParamParser p name q =
|
|
case queryParamStr name q of
|
|
Just s -> either fail pure $ parseAll p s
|
|
_ -> fail $ "no qs param " <> B.unpack name
|
|
|
|
queryParam_ :: StrEncoding a => ByteString -> QueryStringParams -> Parser (Maybe a)
|
|
queryParam_ name q =
|
|
case queryParamStr name q of
|
|
Just p -> either fail pure $ parseAll strP p
|
|
_ -> pure Nothing
|
|
|
|
queryParamStr :: ByteString -> QueryStringParams -> Maybe ByteString
|
|
queryParamStr name (QSP _ q) = snd <$> find ((== name) . fst) q
|