X-Git-Url: http://git.cielonegro.org/gitweb.cgi?p=Rakka.git;a=blobdiff_plain;f=Rakka%2FUtils.hs;h=051685cbf8a93cfedb07258fe44a04e0ac9169d3;hp=7673eb50230bf58fdab4c9c16ea36040b7c70444;hb=bea735cd0409bc96e2962ee9e97cae5f7bf4d585;hpb=0fd09a6316e0be424e6eb454124f0cab6ade40b4 diff --git a/Rakka/Utils.hs b/Rakka/Utils.hs index 7673eb5..051685c 100644 --- a/Rakka/Utils.hs +++ b/Rakka/Utils.hs @@ -14,14 +14,17 @@ module Rakka.Utils , mkQueryString ) where -import qualified Codec.Binary.Url as Url +import qualified Blaze.ByteString.Builder as BBB import Control.Arrow import Control.Arrow.ArrowList +import Data.Ascii (Ascii) +import qualified Data.Ascii as A import qualified Data.ByteString as BS import qualified Data.ByteString.Unsafe as BS import qualified Data.ByteString.Lazy as LS -import Data.List +import Data.Monoid.Unicode import qualified Data.Text as T +import qualified Data.Text.Lazy as LT import Data.Text.Encoding import Magic import Network.HTTP.Lucu @@ -84,15 +87,23 @@ isSafeChar c | isUnreserved c = True | otherwise = False -mkQueryString ∷ [(T.Text, T.Text)] → String -{-# INLINEABLE mkQueryString #-} -mkQueryString = intercalate ";" ∘ map pairToStr +mkQueryString ∷ [(T.Text, T.Text)] → Ascii +{-# INLINE mkQueryString #-} +mkQueryString = A.unsafeFromByteString + ∘ BBB.toByteString + ∘ flip mkBBB (∅) where - pairToStr ∷ (T.Text, T.Text) → String - {-# INLINE pairToStr #-} - pairToStr (k, v) - = encode k ⧺ ('=':encode v) + mkBBB ∷ [(T.Text, T.Text)] → BBB.Builder → BBB.Builder + {-# INLINEABLE mkBBB #-} + mkBBB [] acc = acc + mkBBB (kv:[]) acc = acc ⊕ pair kv + mkBBB (kv:xs) acc = mkBBB xs (acc ⊕ pair kv ⊕ semicolon) - encode ∷ T.Text → String - {-# INLINE encode #-} - encode = Url.encode ∘ BS.unpack ∘ encodeUtf8 + pair ∷ (T.Text, T.Text) → BBB.Builder + {-# INLINE pair #-} + pair (k, v) + = encodeText k ⊕ equal ⊕ encodeText v + + encodeText ∷ T.Text → BBB.Builder + {-# INLINE encodeText #-} + encodeText = BBB.fromByteString ∘ URI.encode ∘ encodeUtf8