packages feed

request-0.5.0.0: src/Network/HTTP/Request/Internal/Query.hs

module Network.HTTP.Request.Internal.Query
  ( addQuery,
  )
where

import qualified Data.ByteString.Char8 as C
import qualified Data.Text as T
import qualified Data.Text.Encoding as T
import Network.HTTP.Types.URI (renderSimpleQuery)

-- | Append query parameters to a URL. Keys and values are UTF-8 encoded and
-- percent-escaped. Parameters already in the URL are kept, and a fragment
-- stays at the end.
addQuery :: String -> [(T.Text, T.Text)] -> String
addQuery url [] = url
addQuery url params = base ++ separator ++ C.unpack rendered ++ fragment
  where
    (base, fragment) = break (== '#') url
    rendered = renderSimpleQuery False [(T.encodeUtf8 k, T.encodeUtf8 v) | (k, v) <- params]
    separator
      | '?' `notElem` base = "?"
      | last base `elem` "?&" = ""
      | otherwise = "&"