summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/MainFastCGI.hs3
-rw-r--r--src/server/URLEncoding.hs18
2 files changed, 20 insertions, 1 deletions
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