summaryrefslogtreecommitdiffhomepage
path: root/SessionID.hs
diff options
context:
space:
mode:
authorJoey Hess <joeyh@joeyh.name>2017-04-21 17:42:10 -0400
committerJoey Hess <joeyh@joeyh.name>2017-04-21 17:52:18 -0400
commit5572dbc8289de934e9ee5bc3f74a0f98365ce3e5 (patch)
tree9c1bba1a5d40748f72e13be788c29ed24dc3dd28 /SessionID.hs
parent360d8ac4601dc5b48c22eeb93eb1853cee99e6c9 (diff)
downloaddebug-me-5572dbc8289de934e9ee5bc3f74a0f98365ce3e5.tar.gz
initial http server
Incomplete, but the client is able to connect and send messages which get logged. Split up debug-me.hs into Role/* Switched from cereal to binary, since websockets operate on lazy ByteStrings, and using cereal would involve a copy on every receive. This commit was sponsored by Boyd Stephen Smith Jr. on Patreon.
Diffstat (limited to 'SessionID.hs')
-rw-r--r--SessionID.hs28
1 files changed, 28 insertions, 0 deletions
diff --git a/SessionID.hs b/SessionID.hs
new file mode 100644
index 0000000..a47de8f
--- /dev/null
+++ b/SessionID.hs
@@ -0,0 +1,28 @@
+module SessionID (SessionID, mkSessionID, sessionLogFile, withSessionID) where
+
+import System.FilePath
+import Data.Text
+import System.IO
+
+-- | A SessionID is the base name of the log file to use,
+-- and may not contain any path information.
+newtype SessionID = SessionID FilePath
+ deriving (Show, Eq, Ord)
+
+-- | Smart constructor that enforces security requirements.
+mkSessionID :: Text -> Maybe SessionID
+mkSessionID t =
+ let f = unpack t
+ in if takeFileName f == f
+ then Just (SessionID f)
+ else Nothing
+
+sessionLogFile :: FilePath -> SessionID -> FilePath
+sessionLogFile dir (SessionID f) = dir </> "debug-me." ++ f ++ ".log"
+
+-- | Allocate a new SessionID and return an open Handle to its log file.
+withSessionID :: FilePath -> ((Handle, SessionID) -> IO a) -> IO a
+withSessionID dir a = do
+ -- TODO find an unused log file and open it
+ let sid = SessionID "1"
+ withFile "debug-me-server.log" WriteMode $ \h -> a (h, sid)