X-Git-Url: http://git.cielonegro.org/gitweb.cgi?a=blobdiff_plain;f=Rakka%2FUtils.hs;h=15bc6f4043f5a87f149cd09a5147c4cb4cb5be7c;hb=9d86882fe1630c844e11cf2cf760110c04ea10d4;hp=f58a0b8a30340070dfc0c9b715371fedfb75cdb8;hpb=7a4f13a3d483c950743e1ced001ade4406d239d3;p=Rakka.git diff --git a/Rakka/Utils.hs b/Rakka/Utils.hs index f58a0b8..15bc6f4 100644 --- a/Rakka/Utils.hs +++ b/Rakka/Utils.hs @@ -1,17 +1,25 @@ module Rakka.Utils ( yesOrNo + , trueOrFalse , parseYesOrNo , maybeA , deleteIfEmpty - , formatW3CDateTime , chomp + , guessMIMEType + , isSafeChar + , mkQueryString ) where +import qualified Codec.Binary.UTF8.String as UTF8 import Control.Arrow import Control.Arrow.ArrowList -import Data.Time -import Text.Printf +import qualified Data.ByteString.Lazy as Lazy (ByteString) +import qualified Data.ByteString.Lazy.Char8 as L8 hiding (ByteString) +import Magic +import Network.HTTP.Lucu +import Network.URI +import System.IO.Unsafe yesOrNo :: Bool -> String @@ -19,6 +27,11 @@ yesOrNo True = "yes" yesOrNo False = "no" +trueOrFalse :: Bool -> String +trueOrFalse True = "true" +trueOrFalse False = "false" + + parseYesOrNo :: ArrowChoice a => a String Bool parseYesOrNo = proc str -> do case str of @@ -42,48 +55,35 @@ deleteIfEmpty _ -> returnA -< str -formatW3CDateTime :: ZonedTime -> String -formatW3CDateTime zonedTime - = formatLocalTime (zonedTimeToLocalTime zonedTime) - ++ - formatTimeZone (zonedTimeZone zonedTime) +chomp :: String -> String +chomp = reverse . snd . break (/= '\n') . reverse + + +guessMIMEType :: Lazy.ByteString -> MIMEType +guessMIMEType = read . unsafePerformIO . magicString magic . L8.unpack where - formatLocalTime :: LocalTime -> String - formatLocalTime localTime - = let (year, month, day) = toGregorian (localDay localTime) - timeOfDay = localTimeOfDay localTime - (secInt, secFrac) = properFraction (todSec timeOfDay) - in - (printf "%04d-%02d-%02dT%02d:%02d:%02d" - year - month - day - (todHour timeOfDay) - (todMin timeOfDay) - (secInt :: Int)) - ++ - (if secFrac == 0 - then "" - else tail (show secFrac)) - - formatTimeZone :: TimeZone -> String - formatTimeZone tz - = case timeZoneMinutes tz of - offset | offset < 0 -> '-':(showTZ $ negate offset) - | offset == 0 -> "Z" - | otherwise -> '+':(showTZ offset) - - showTZ :: Int -> String - showTZ offset - = let hour = offset `div` 60 - minute = offset - hour * 60 - in - show2 hour ++ ":" ++ show2 minute - - show2 :: Int -> String - show2 n | n < 10 = '0':(show n) - | otherwise = show n + magic :: Magic + magic = unsafePerformIO + $ do m <- magicOpen [MagicMime] + magicLoadDefault m + return m -chomp :: String -> String -chomp = reverse . snd . break (/= '\n') . reverse +isSafeChar :: Char -> Bool +isSafeChar c + | c == '/' = True + | isReserved c = False + | c > ' ' && c <= '~' = True + | otherwise = False + + +mkQueryString :: [(String, String)] -> String +mkQueryString [] = "" +mkQueryString ((k, v) : xs) = encode k ++ "=" ++ encode v ++ + if xs == [] then + "" + else + ';' : mkQueryString(xs) + where + encode :: String -> String + encode = escapeURIString isSafeChar . UTF8.encodeString \ No newline at end of file