module WASH.CGI.CookieIO (decodeCookie, encodeCookie, putCookies) where import IO import WASH.CGI.CGIMonad import qualified WASH.CGI.Debug as Debug import WASH.CGI.RawCGITypes import qualified WASH.Utility.URLCoding as URLCoding decodeCookie :: (String, String) -> (String, (Maybe String, Maybe String)) encodeCookie :: (String, (Maybe String, Maybe String)) -> (String, String) encodeCookie (k, (v, mexp)) = (URLCoding.encode k, case v of Just v' -> URLCoding.encode v' ++ (case mexp of Nothing -> "" Just exp -> "; expires=" ++ exp) Nothing -> "deleted; expires=Thu, 01-Jan-1970 00:00:00 GMT") decodeCookie (k, v) = (URLCoding.decode k, (Just (URLCoding.decode v), Nothing)) putCookies :: CGIState -> IO () putCookies cgistate = let cookies = cookiesToSend cgistate cm = cookieMap cgistate h = cgiHandle (cgiInfo cgistate) sendCookie name = case lookup name cm of Nothing -> return () Just value -> let (encName, encValue) = encodeCookie (name, value) in do hPutStr h "Set-Cookie: " hPutStr h encName hPutStr h "=" hPutStr h encValue hPutStr h ";\n" in do printCookies cm cookies h Debug.logOutput "OLD" (printCookies cm cookies) printCookies :: [(String,(Maybe String, Maybe String))] -> [String] -> Handle -> IO () printCookies cm cookies h = let sendCookie name = case lookup name cm of Nothing -> return () Just value -> let (encName, encValue) = encodeCookie (name, value) in do hPutStr h "Set-Cookie: " hPutStr h encName hPutStr h "=" hPutStr h encValue hPutStr h ";\n" in mapM_ sendCookie cookies