on master help sign in
Clone the response type for HTTP2
3637f6eAndrew Pritchard
wai/Network/Wai/HTTP2.hs+24−1
@@ -1,11 +1,16 @@
1module Network.Wai.HTTP2
1module Network.Wai.HTTP2
2 ( Http2Application
2 ( Http2Application
3+ , Response(..)
3 , Trailers
4 , Trailers
5+ , responseStatus
6+ , responseHeaders
4 ) where
7 ) where
5
8
9+import Blaze.ByteString.Builder (Builder)
10+import qualified Data.ByteString as B
6import qualified Network.HTTP.Types as H
11import qualified Network.HTTP.Types as H
7
12
8−import Network.Wai.Internal (Request, Response)
13+import Network.Wai.Internal (Request, FilePart)
9
14
10-- | Headers sent after the end of a data stream, as defined by section 4.1.2 of
15-- | Headers sent after the end of a data stream, as defined by section 4.1.2 of
11-- the HTTP\/1.1 spec (RFC 7230), and section 8.1 of the HTTP\/2 spec.
16-- the HTTP\/1.1 spec (RFC 7230), and section 8.1 of the HTTP\/2 spec.
@@ -13,3 +18,21 @@ type Trailers = H.ResponseHeaders
13
18
14-- | The HTTP\/2-aware equivalent of 'Network.Wai.Application'.
19-- | The HTTP\/2-aware equivalent of 'Network.Wai.Application'.
15type Http2Application = Request -> (Response -> IO ()) -> IO Trailers
20type Http2Application = Request -> (Response -> IO ()) -> IO Trailers
21+
22+type StreamingBody = (Builder -> IO ()) -> IO () -> IO ()
23+
24+data Response
25+ = ResponseFile H.Status H.ResponseHeaders FilePath (Maybe FilePart)
26+ | ResponseBuilder H.Status H.ResponseHeaders Builder
27+ | ResponseStream H.Status H.ResponseHeaders StreamingBody
28+ | ResponseRaw (IO B.ByteString -> (B.ByteString -> IO ()) -> IO ()) Response
29+
30+responseStatus :: Response -> H.Status
31+responseStatus (ResponseFile s _ _ _) = s
32+responseStatus (ResponseBuilder s _ _) = s
33+responseStatus (ResponseStream s _ _) = s
34+responseStatus (ResponseRaw _ res) = responseStatus res
35+
36+responseHeaders :: Response -> H.ResponseHeaders
37+responseHeaders _ = []
38+
warp/Network/Wai/Handler/Warp/HTTP2.hs+10−3
@@ -16,9 +16,10 @@ import Data.ByteString (ByteString)
16import Network.HTTP2
16import Network.HTTP2
17import Network.Socket (SockAddr)
17import Network.Socket (SockAddr)
18
18
19−import Network.Wai (Application)
19+import Network.Wai (Application, Response)
20+import qualified Network.Wai.HTTP2 as H2 (Response(..))
20import Network.Wai.HTTP2 (Http2Application)
21import Network.Wai.HTTP2 (Http2Application)
21−import Network.Wai.Internal (ResponseReceived(..))
22+import Network.Wai.Internal (ResponseReceived(..), Response(..))
22import Network.Wai.Handler.Warp.HTTP2.EncodeFrame
23import Network.Wai.Handler.Warp.HTTP2.EncodeFrame
23import Network.Wai.Handler.Warp.HTTP2.Manager
24import Network.Wai.Handler.Warp.HTTP2.Manager
24import Network.Wai.Handler.Warp.HTTP2.Receiver
25import Network.Wai.Handler.Warp.HTTP2.Receiver
@@ -78,4 +79,10 @@ goaway Connection{..} etype debugmsg = connSendAll bytestream
78-- the HTTP/2-specific features.
79-- the HTTP/2-specific features.
79promoteApplication :: Application -> Http2Application
80promoteApplication :: Application -> Http2Application
80promoteApplication app req respond = [] <$ app req respond'
81promoteApplication app req respond = [] <$ app req respond'
81− where respond' x = ResponseReceived <$ respond x
82+ where respond' x = ResponseReceived <$ respond (promoteResponse x)
83+
84+promoteResponse :: Response -> H2.Response
85+promoteResponse (ResponseFile a b c d) = H2.ResponseFile a b c d
86+promoteResponse (ResponseBuilder a b c) = H2.ResponseBuilder a b c
87+promoteResponse (ResponseStream a b c) = H2.ResponseStream a b c
88+promoteResponse (ResponseRaw a b) = H2.ResponseRaw a (promoteResponse b)
warp/Network/Wai/Handler/Warp/HTTP2/HPACK.hs+1−2
@@ -13,8 +13,7 @@ import Data.IORef (readIORef, writeIORef)
13import Network.HPACK
13import Network.HPACK
14import qualified Network.HTTP.Types as H
14import qualified Network.HTTP.Types as H
15import Network.HTTP2
15import Network.HTTP2
16−import Network.Wai
16+import Network.Wai.HTTP2 (Trailers, Response, responseStatus, responseHeaders)
17−import Network.Wai.HTTP2 (Trailers)
18import Network.Wai.Handler.Warp.HTTP2.Types
17import Network.Wai.Handler.Warp.HTTP2.Types
19import Network.Wai.Handler.Warp.Header
18import Network.Wai.Handler.Warp.Header
20import Network.Wai.Handler.Warp.Response
19import Network.Wai.Handler.Warp.Response
warp/Network/Wai/Handler/Warp/HTTP2/Sender.hs+2−3
@@ -15,8 +15,8 @@ import qualified Data.ByteString.Builder.Extra as B
15import Foreign.Ptr
15import Foreign.Ptr
16import Network.HTTP2
16import Network.HTTP2
17import Network.HTTP2.Priority
17import Network.HTTP2.Priority
18−import Network.Wai
18+import Network.Wai hiding (Response)
19−import Network.Wai.HTTP2 (Trailers)
19+import Network.Wai.HTTP2 (Trailers, Response(..))
20import Network.Wai.Handler.Warp.Buffer
20import Network.Wai.Handler.Warp.Buffer
21import Network.Wai.Handler.Warp.HTTP2.EncodeFrame
21import Network.Wai.Handler.Warp.HTTP2.EncodeFrame
22import Network.Wai.Handler.Warp.HTTP2.HPACK
22import Network.Wai.Handler.Warp.HTTP2.HPACK
@@ -25,7 +25,6 @@ import Network.Wai.Handler.Warp.IORef
25import qualified Network.Wai.Handler.Warp.Settings as S
25import qualified Network.Wai.Handler.Warp.Settings as S
26import qualified Network.Wai.Handler.Warp.Timeout as T
26import qualified Network.Wai.Handler.Warp.Timeout as T
27import Network.Wai.Handler.Warp.Types
27import Network.Wai.Handler.Warp.Types
28−import Network.Wai.Internal (Response(..))
29import qualified System.PosixCompat.Files as P
28import qualified System.PosixCompat.Files as P
30
29
31#ifdef WINDOWS
30#ifdef WINDOWS
warp/Network/Wai/Handler/Warp/HTTP2/Types.hs+2−2
@@ -17,8 +17,8 @@ import qualified Data.ByteString as BS
17import Data.IntMap.Strict (IntMap, IntMap)
17import Data.IntMap.Strict (IntMap, IntMap)
18import qualified Data.IntMap.Strict as M
18import qualified Data.IntMap.Strict as M
19import qualified Network.HTTP.Types as H
19import qualified Network.HTTP.Types as H
20−import Network.Wai (Request, Response)
20+import Network.Wai (Request)
21−import Network.Wai.HTTP2 (Trailers)
21+import Network.Wai.HTTP2 (Trailers, Response)
22import Network.Wai.Handler.Warp.IORef
22import Network.Wai.Handler.Warp.IORef
23import Network.Wai.Handler.Warp.Types
23import Network.Wai.Handler.Warp.Types
24
24
warp/Network/Wai/Handler/Warp/HTTP2/Worker.hs+2−3
@@ -21,8 +21,8 @@ import Data.Typeable
21import qualified Network.HTTP.Types as H
21import qualified Network.HTTP.Types as H
22import Network.HTTP2
22import Network.HTTP2
23import Network.HTTP2.Priority
23import Network.HTTP2.Priority
24−import Network.Wai
25−import Network.Wai.HTTP2 (Http2Application)
24+import Network.Wai.HTTP2 (Http2Application, Response(..), responseStatus)
25+import Network.Wai hiding (Response, responseStatus)
26import Network.Wai.Handler.Warp.HTTP2.EncodeFrame
26import Network.Wai.Handler.Warp.HTTP2.EncodeFrame
27import Network.Wai.Handler.Warp.HTTP2.Manager
27import Network.Wai.Handler.Warp.HTTP2.Manager
28import Network.Wai.Handler.Warp.HTTP2.Types
28import Network.Wai.Handler.Warp.HTTP2.Types
@@ -30,7 +30,6 @@ import Network.Wai.Handler.Warp.IORef
30import qualified Network.Wai.Handler.Warp.Response as R
30import qualified Network.Wai.Handler.Warp.Response as R
31import qualified Network.Wai.Handler.Warp.Settings as S
31import qualified Network.Wai.Handler.Warp.Settings as S
32import qualified Network.Wai.Handler.Warp.Timeout as T
32import qualified Network.Wai.Handler.Warp.Timeout as T
33−import Network.Wai.Internal (Response(..))
34
33
35----------------------------------------------------------------
34----------------------------------------------------------------
36
35