import qualified Data.Attoparsec.Lazy as LP
import Data.ByteString (ByteString)
import qualified Data.ByteString as Strict
-import qualified Data.ByteString.Char8 as C8
-import qualified Data.ByteString.Lazy as Lazy
+import qualified Data.ByteString.Lazy as Lazy
import Data.Foldable (toList)
import Data.List
import qualified Data.Map as M
-- > ...
-- > , ...
-- > }
-getResourcePath ∷ Resource [Ascii]
+getResourcePath ∷ Resource [Text]
getResourcePath = (fromJust ∘ itrResourcePath) <$> getInteraction
-- |This is an analogy of CGI PATH_INFO. The result is
-- URI-unescaped. It is always @[]@ if the
-- 'Network.HTTP.Lucu.Resource.Tree.ResourceDef' is not greedy. See
-- 'getResourcePath'.
-getPathInfo ∷ Resource [ByteString]
+--
+-- Note that the returned path is URI-decoded and then UTF-8 decoded.
+getPathInfo ∷ Resource [Text]
getPathInfo = do rsrcPath ← getResourcePath
- uri ← getRequestURI
- let reqPathStr = uriPath uri
- reqPath = [unEscapeString x | x ← splitBy (≡ '/') reqPathStr, (¬) (null x)]
+ reqPath ← splitPathInfo <$> getRequestURI
-- rsrcPath と reqPath の共通する先頭部分を reqPath か
-- ら全部取り除くと、それは PATH_INFO のやうなものにな
-- る。rsrcPath は全部一致してゐるに決まってゐる(でな
-- ければこの Resource が撰ばれた筈が無い)ので、
-- rsrcPath の長さの分だけ削除すれば良い。
- return $ map C8.pack $ drop (length rsrcPath) reqPath
+ return $ drop (length rsrcPath) reqPath
-- |Assume the query part of request URI as
-- application\/x-www-form-urlencoded, and parse it to pairs of
-- 成功。itr 内にチャンクを置いたままにする
-- とメモリの無駄になるので除去。
chunk ← readItr itrReceivedBody seqToLBS itr
- writeItr itrReceivedBody (∅) itr
+ writeItr itrReceivedBody (∅) itr
+ writeItr itrReceivedBodyLen 0 itr
return chunk
driftTo DecidingHeader
$ retry
-- 成功
chunk ← readItr itrReceivedBody seqToLBS itr
- writeItr itrReceivedBody (∅) itr
+ writeItr itrReceivedBody (∅) itr
+ writeItr itrReceivedBodyLen 0 itr
return chunk
when (Lazy.null chunk)
$ driftTo DecidingHeader
unless (Lazy.null wholeChunk)
$ liftIO $ atomically $
- writeItr itrBodyIsNull False itr
+ writeItr itrSentNoBody False itr
where
sendChunks ∷ Lazy.ByteString → Int → Resource ()
sendChunks str limit
= postprocess itr
drift itr _ Done
- = do bodyIsNull ← readItr itrBodyIsNull id itr
+ = do bodyIsNull ← readItr itrSentNoBody id itr
when bodyIsNull
$ writeDefaultPage itr