summaryrefslogtreecommitdiff
path: root/src/server/exec/pgf-http.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/exec/pgf-http.hs')
-rw-r--r--src/server/exec/pgf-http.hs49
1 files changed, 49 insertions, 0 deletions
diff --git a/src/server/exec/pgf-http.hs b/src/server/exec/pgf-http.hs
new file mode 100644
index 000000000..565843047
--- /dev/null
+++ b/src/server/exec/pgf-http.hs
@@ -0,0 +1,49 @@
+
+import Network.CGI(requestMethod,getVarWithDefault,logCGI,handleErrors,liftIO)
+import System.Environment(getArgs)
+import System.Directory(getDirectoryContents)
+import System.FilePath(takeExtension,takeFileName,takeDirectory,(</>))
+
+import RunHTTP(runHTTP,Options(..))
+import ServeStaticFile(serveStaticFile)
+import PGFService(cgiMain',getPath,stderrToFile,logFile,newPGFCache)
+import FastCGIUtils(outputJSONP,handleCGIErrors)
+
+import Paths_gf_server(getDataDir)
+
+main :: IO ()
+main = do datadir <- getDataDir
+ let defaults = Options { documentRoot = datadir</>"www",
+ port = 41296 }
+ cache <- newPGFCache
+ args <- getArgs
+ options <- case args of
+ [] -> return defaults
+ [port] -> do p <- readIO port
+ return defaults{port=p}
+ putStrLn $ "Starting HTTP server, open http://localhost:"
+ ++show (port options)++"/ in your web browser.\n"
+ print options
+ putStrLn $ "logFile="++logFile
+ stderrToFile logFile
+ httpMain cache options
+
+
+httpMain cache options = runHTTP options (do log ; serve =<< getPath)
+ where
+ log = do method <- requestMethod
+ uri <- getVarWithDefault "REQUEST_URI" "-"
+ logCGI $ method++" "++uri
+
+ serve path =
+ handleErrors . handleCGIErrors $
+ if takeExtension path==".pgf"
+ then cgiMain' cache path
+ else if takeFileName path=="grammars.cgi"
+ then grammarList (takeDirectory path)
+ else serveStaticFile path
+
+ grammarList dir =
+ do paths <- liftIO $ getDirectoryContents dir
+ let pgfs = [path|path<-paths, takeExtension path==".pgf"]
+ outputJSONP pgfs