summaryrefslogtreecommitdiff
path: root/src/server/pgf-http.hs
diff options
context:
space:
mode:
authorhallgren <hallgren@chalmers.se>2010-11-26 14:30:51 +0000
committerhallgren <hallgren@chalmers.se>2010-11-26 14:30:51 +0000
commit72d2d9b204568b3683c29dea0ae794d3a524f2ee (patch)
treef392cb3859e2a173d17a820ae3a6294f4386a755 /src/server/pgf-http.hs
parent75ad59b1217e4b81d19fed6eadf4fc80d3ebd2f1 (diff)
Split pgf-server into pgf-fcgi and pgf-http.
The dependency on the fastcgi package made pgf-server difficult to compile, so it is now split into - pgf-fgci (main module in pgf-fcgi.hs), which is built only if fastcgi is already installed or if you turn on the fastcgi flag (e.g. by doing 'cabal install -f fastcgi'). - pgf-http (main module in pgf-http.hs) which is always built (and hopefully has no problematic dependencies.) The modules FastCGIUtils and PGFService no longer depend on fastcgi.
Diffstat (limited to 'src/server/pgf-http.hs')
-rw-r--r--src/server/pgf-http.hs38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/server/pgf-http.hs b/src/server/pgf-http.hs
new file mode 100644
index 000000000..ff356c6e7
--- /dev/null
+++ b/src/server/pgf-http.hs
@@ -0,0 +1,38 @@
+
+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)
+import ServeStaticFile(serveStaticFile)
+import PGFService(cgiMain',getPath,stderrToFile,logFile,newPGFCache)
+import FastCGIUtils(outputJSONP,handleCGIErrors)
+
+main :: IO ()
+main = do stderrToFile logFile
+ cache <- newPGFCache
+ args <- getArgs
+ port <- case args of
+ [] -> return 41296
+ [port] -> readIO port
+ httpMain cache port
+
+httpMain cache port = runHTTP port (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