+isWhiteSpace ' ' = True
+isWhiteSpace '\t' = True
+isWhiteSpace '\r' = True
+isWhiteSpace '\n' = True
+isWhiteSpace _ = False
+{-# INLINE isWhiteSpace #-}
+
+-- |> quoteStr "abc"
+-- > ==> "\"abc\""
+--
+-- > quoteStr "ab\"c"
+-- > ==> "\"ab\\\"c\""
+quoteStr :: String -> String
+quoteStr str = str `seq`
+ foldr (++) "" (["\""] ++ map quote str ++ ["\""])
+ where
+ quote :: Char -> String
+ quote '"' = "\\\""
+ quote c = [c]
+
+
+-- |> parseWWWFormURLEncoded "aaa=bbb&ccc=ddd"
+-- > ==> [("aaa", "bbb"), ("ccc", "ddd")]
+parseWWWFormURLEncoded :: String -> [(String, String)]
+parseWWWFormURLEncoded src
+ | src == "" = []
+ | otherwise = do pairStr <- splitBy (\ c -> c == ';' || c == '&') src
+ let (key, value) = break (== '=') pairStr
+ return ( unEscapeString key
+ , unEscapeString $ case value of
+ ('=':val) -> val
+ "" -> ""
+ )