import Data.List
import Data.Map (Map)
import qualified Data.Map as M
+import Data.Ord
import Data.Word
import Foreign.ForeignPtr
import Foreign.Ptr
import Foreign.Storable
+import Network.HTTP.Lucu.HandleLike
import Network.HTTP.Lucu.Parser
import Network.HTTP.Lucu.Parser.Http
import Network.HTTP.Lucu.Utils
-import System.IO
type Headers = Map NCBS Strict.ByteString
newtype NCBS = NCBS Strict.ByteString
| otherwise
= do c1 <- peek p1
c2 <- peek p2
- case toLower (w2c c1) `compare` toLower (w2c c2) of
+ case comparing (toLower . w2c) c1 c2 of
EQ -> noCaseCmp' (p1 `plusPtr` 1) (l1 - 1) (p2 `plusPtr` 1) (l2 - 1)
x -> return x
-}
headersP :: Parser Headers
headersP = do xs <- many header
- crlf
+ _ <- crlf
return $! toHeaders xs
where
header :: Parser (Strict.ByteString, Strict.ByteString)
header = do name <- token
- char ':'
+ _ <- char ':'
-- FIXME: これは多少インチキだが、RFC 2616 のこの部分
-- の記述はひどく曖昧であり、この動作が本當に間違って
-- ゐるのかどうかも良く分からない。例へば
-- のか?直勸的には駄目さうに思へるが、そんな記述は見
-- 付からない。
contents <- many (lws <|> many1 text)
- crlf
+ _ <- crlf
let value = foldr (++) "" contents
norm = normalize value
return (C8.pack name, C8.pack norm)
normalize :: String -> String
normalize = trimBody . trim isWhiteSpace
- trimBody = foldr (++) []
+ trimBody = concat
. map (\ s -> if head s == ' ' then
" "
else
else c)
-hPutHeaders :: Handle -> Headers -> IO ()
+hPutHeaders :: HandleLike h => h -> Headers -> IO ()
hPutHeaders h hds
= h `seq` hds `seq`
- mapM_ putH (M.toList hds) >> C8.hPut h (C8.pack "\r\n")
+ mapM_ putH (M.toList hds) >> hPutBS h (C8.pack "\r\n")
where
putH :: (NCBS, Strict.ByteString) -> IO ()
putH (name, value)
= name `seq` value `seq`
- do C8.hPut h (fromNCBS name)
- C8.hPut h (C8.pack ": ")
- C8.hPut h value
- C8.hPut h (C8.pack "\r\n")
+ do hPutBS h (fromNCBS name)
+ hPutBS h (C8.pack ": ")
+ hPutBS h value
+ hPutBS h (C8.pack "\r\n")