diff --git a/src/server/MainFastCGI.hs b/src/server/MainFastCGI.hs index 5f58787bd..78f1693c7 100644 --- a/src/server/MainFastCGI.hs +++ b/src/server/MainFastCGI.hs @@ -15,33 +15,32 @@ import Control.Monad import Data.Char import qualified Data.Map as Map import Data.Maybe -import System.Environment -defaultGrammarFile :: IO FilePath -defaultGrammarFile = - do env <- getEnvironment - return $ fromMaybe "grammar.pgf" $ lookup "PGF_FILE" env - main :: IO () main = do initFastCGI cache <- newCache PGF.readPGF - runFastCGIConcurrent' forkIO 100 (handleErrors (handleCGIErrors (fcgiMain cache))) + runFastCGIConcurrent' forkIO 100 (handleErrors (handleCGIErrors (cgiMain cache))) -fcgiMain :: Cache PGF -> CGI CGIResult -fcgiMain cache = liftIO (defaultGrammarFile >>= readCache cache) >>= cgiMain - -cgiMain :: PGF -> CGI CGIResult -cgiMain pgf = +cgiMain :: Cache PGF -> CGI CGIResult +cgiMain cache = do path <- pathInfo - json <- case path of - "/parse" -> return (doParse pgf) `ap` getText `ap` getCat `ap` getFrom - "/complete" -> return (doComplete pgf) `ap` getText `ap` getCat `ap` getFrom `ap` getLimit - "/linearize" -> return (doLinearize pgf) `ap` getTree `ap` getTo - "/translate" -> return (doTranslate pgf) `ap` getText `ap` getCat `ap` getFrom `ap` getTo - "/grammar" -> return (doGrammar pgf) `ap` requestAcceptLanguage - _ -> throwCGIError 404 "Not Found" ["Resource not found: " ++ path] - outputJSONP json + case filter (not . null) $ splitBy (=='/') path of + [file,command] -> do pgf <- liftIO $ readCache cache file + json <- pgfMain pgf command + outputJSONP json + _ -> throwCGIError 400 "Unknown resource" ["Unknown resource: " ++ show path, + "Use /grammar.pgf/command"] + +pgfMain :: PGF -> String -> CGI JSValue +pgfMain pgf command = + case command of + "parse" -> return (doParse pgf) `ap` getText `ap` getCat `ap` getFrom + "complete" -> return (doComplete pgf) `ap` getText `ap` getCat `ap` getFrom `ap` getLimit + "linearize" -> return (doLinearize pgf) `ap` getTree `ap` getTo + "translate" -> return (doTranslate pgf) `ap` getText `ap` getCat `ap` getFrom `ap` getTo + "grammar" -> return (doGrammar pgf) `ap` requestAcceptLanguage + _ -> throwCGIError 400 "Unknown command" ["Unknown command: " ++ show command] where getText :: CGI String getText = liftM (maybe "" (urlDecodeUnicode . UTF8.decodeString)) $ getInput "input" @@ -162,3 +161,11 @@ outputJSONP x = outputStrict :: String -> CGI CGIResult outputStrict x | x == x = output x | otherwise = fail "I am the pope." + +-- * General utilities + +splitBy :: (a -> Bool) -> [a] -> [[a]] +splitBy _ [] = [[]] +splitBy f list = case break f list of + (first,[]) -> [first] + (first,_:rest) -> first : splitBy f rest \ No newline at end of file diff --git a/src/server/gwt-client/src/se/chalmers/cs/gf/gwt_translate/client/GF.java b/src/server/gwt-client/src/se/chalmers/cs/gf/gwt_translate/client/GF.java index 9fd23f59c..74f38219c 100644 --- a/src/server/gwt-client/src/se/chalmers/cs/gf/gwt_translate/client/GF.java +++ b/src/server/gwt-client/src/se/chalmers/cs/gf/gwt_translate/client/GF.java @@ -18,9 +18,11 @@ import java.util.ArrayList; public class GF { private String baseURL; + private String pgfName; - public GF (String baseURL) { + public GF (String baseURL, String pgfName) { this.baseURL = baseURL; + this.pgfName = pgfName; } public static interface GFCallback { @@ -155,7 +157,7 @@ public class GF { /* Utilities */ private GFRequest sendRequest (String resource, List vars, final GFCallback callback) { - String url = baseURL + "/" + resource + "?" + buildQueryString(vars); + String url = baseURL + "/" + pgfName + "/" + resource + "?" + buildQueryString(vars); RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, url); builder.setTimeoutMillis(30000); builder.setHeader("Accept","text/plain, text/html;q=0.5, */*;q=0.1"); diff --git a/src/server/gwt-client/src/se/chalmers/cs/gf/gwt_translate/client/Translate.java b/src/server/gwt-client/src/se/chalmers/cs/gf/gwt_translate/client/Translate.java index d5fd78db6..a27b7ba75 100644 --- a/src/server/gwt-client/src/se/chalmers/cs/gf/gwt_translate/client/Translate.java +++ b/src/server/gwt-client/src/se/chalmers/cs/gf/gwt_translate/client/Translate.java @@ -31,6 +31,7 @@ import java.util.Set; public class Translate implements EntryPoint { private static final String gfBaseURL = "/pgf"; + private static final String pgfName = "grammar.pgf"; private GF gf; @@ -195,7 +196,7 @@ public class Translate implements EntryPoint { statusPopup.add(statusLabel); statusPopup.center(); - gf = new GF(gfBaseURL); + gf = new GF(gfBaseURL, pgfName); createTranslationUI();