7 module Network.HTTP.Lucu.DefaultPage
13 import qualified Blaze.ByteString.Builder.Char.Utf8 as BB
15 import Control.Arrow.ArrowList
16 import Control.Arrow.ListArrow
17 import Control.Arrow.Unicode
18 import Control.Concurrent.STM
20 import qualified Data.Ascii as A
22 import qualified Data.Text as T
23 import qualified Data.Text.Lazy as Lazy
24 import Network.HTTP.Lucu.Config
25 import Network.HTTP.Lucu.Headers
26 import Network.HTTP.Lucu.Interaction
27 import Network.HTTP.Lucu.Request
28 import Network.HTTP.Lucu.Response
29 import Network.URI hiding (path)
30 import Prelude.Unicode
31 import Text.XML.HXT.Arrow.WriteDocument
32 import Text.XML.HXT.Arrow.XmlArrow
33 import Text.XML.HXT.Arrow.XmlState
34 import Text.XML.HXT.DOM.TypeDefs
36 getDefaultPage ∷ Config → Maybe Request → Response → Lazy.Text
37 {-# INLINEABLE getDefaultPage #-}
38 getDefaultPage !conf !req !res
39 = let msgA = getMsg req res
40 [xmlStr] = runLA ( mkDefaultPage conf (resStatus res) msgA
42 writeDocumentToString [ withIndent True ]
47 writeDefaultPage ∷ Interaction → STM ()
49 -- Content-Type が正しくなければ補完できない。
50 = do res ← readItr itrResponse id itr
51 when (getHeader "Content-Type" res == Just defaultPageContentType)
52 $ do reqM ← readItr itrRequest id itr
54 let conf = itrConfig itr
55 page = getDefaultPage conf reqM res
57 putTMVar (itrBodyToSend itr) (BB.fromLazyText page)
59 mkDefaultPage ∷ (ArrowXml a) ⇒ Config → StatusCode → a b XmlTree → a b XmlTree
60 {-# INLINEABLE mkDefaultPage #-}
61 mkDefaultPage !conf !status !msgA
62 = let sStr = A.toString $ A.fromAsciiBuilder $ printStatusCode status
63 sig = concat [ A.toString (cnfServerSoftware conf)
65 , T.unpack (cnfServerHost conf)
69 += sattr "xmlns" "http://www.w3.org/1999/xhtml"
78 += ( eelem "p" += msgA )
80 += ( eelem "address" += txt sig ))))
82 getMsg ∷ (ArrowXml a) ⇒ Maybe Request → Response → a b XmlTree
83 {-# INLINEABLE getMsg #-}
85 = case resStatus res of
91 → txt ("The resource at " ⧺ path ⧺ " has been moved to ")
93 eelem "a" += sattr "href" loc
99 → txt ("The resource at " ⧺ path ⧺ " is currently located at ")
101 eelem "a" += sattr "href" loc
104 txt ". This is not a permanent relocation."
107 → txt ("The resource at " ⧺ path ⧺ " can be found at ")
109 eelem "a" += sattr "href" loc
115 → txt ("The resource at " ⧺ path ⧺ " is temporarily located at ")
117 eelem "a" += sattr "href" loc
124 → txt "The server could not understand the request you sent."
127 → txt ("You need a valid authentication to access " ⧺ path)
130 → txt ("You don't have permission to access " ⧺ path)
133 → txt ("The requested URL " ⧺ path ⧺ " was not found on this server.")
136 → txt ("The resource at " ⧺ path ⧺ " was here in past times, but has gone permanently.")
138 RequestEntityTooLarge
139 → txt ("The request entity you sent for " ⧺ path ⧺ " was too large to accept.")
142 → txt "The request URI you sent was too large to accept."
146 → txt ("An internal server error has occured during the process of your request to " ⧺ path)
149 → txt "The service is temporarily unavailable. Try later."
155 path = let uri = reqURI $ fromJust req
160 loc = A.toString $ fromJust $ getHeader "Location" res