From 646bf9c4d838f2cbb59e3eb0ae7bf0636ff2f7e4 Mon Sep 17 00:00:00 2001 From: bjorn Date: Sun, 24 Aug 2008 17:39:24 +0000 Subject: [PATCH] URL decode text input in fastcgi server, including %uXXXX sequences. --- src/server/MainFastCGI.hs | 3 ++- src/server/URLEncoding.hs | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 src/server/URLEncoding.hs diff --git a/src/server/MainFastCGI.hs b/src/server/MainFastCGI.hs index 230e09b00..b7af9fce4 100644 --- a/src/server/MainFastCGI.hs +++ b/src/server/MainFastCGI.hs @@ -3,6 +3,7 @@ import PGF (PGF) import qualified PGF import FastCGIUtils +import URLEncoding import Network.CGI import Text.JSON @@ -42,7 +43,7 @@ cgiMain pgf = outputJSON json where getText :: CGI String - getText = liftM (fromMaybe "") $ getInput "input" + getText = liftM (maybe "" urlDecodeUnicode) $ getInput "input" getTree :: CGI PGF.Tree getTree = do mt <- getInput "tree" diff --git a/src/server/URLEncoding.hs b/src/server/URLEncoding.hs new file mode 100644 index 000000000..ad5fb0dd9 --- /dev/null +++ b/src/server/URLEncoding.hs @@ -0,0 +1,18 @@ +module URLEncoding where + +import Data.Bits (shiftL, (.|.)) +import Data.Char (chr,digitToInt,isHexDigit) + + +urlDecodeUnicode :: String -> String +urlDecodeUnicode [] = "" +urlDecodeUnicode ('%':'u':x1:x2:x3:x4:s) + | all isHexDigit [x1,x2,x3,x4] = + chr ( digitToInt x1 `shiftL` 12 + .|. digitToInt x2 `shiftL` 8 + .|. digitToInt x3 `shiftL` 4 + .|. digitToInt x4) : urlDecodeUnicode s +urlDecodeUnicode ('%':x1:x2:s) | isHexDigit x1 && isHexDigit x2 = + chr ( digitToInt x1 `shiftL` 4 + .|. digitToInt x2) : urlDecodeUnicode s +urlDecodeUnicode (c:s) = c : urlDecodeUnicode s