warp 3.3.11 → 3.3.12
raw patch · 7 files changed
+49/−25 lines, 7 filesdep ~http2
Dependency ranges changed: http2
Files
- ChangeLog.md +5/−0
- Network/Wai/Handler/Warp/HTTP2.hs +3/−4
- Network/Wai/Handler/Warp/HTTP2/Request.hs +5/−2
- Network/Wai/Handler/Warp/HTTP2/Response.hs +18/−15
- Network/Wai/Handler/Warp/Request.hs +1/−1
- Network/Wai/Handler/Warp/Types.hs +14/−0
- warp.cabal +3/−3
ChangeLog.md view
@@ -1,3 +1,8 @@+## 3.3.12++* Fixing HTTP/2 logging relating to status and push.+* Adding QUIC constructor to Transport.+ ## 3.3.11 * Adding setAltSvc.
Network/Wai/Handler/Warp/HTTP2.hs view
@@ -60,9 +60,8 @@ req <- toWAIRequest h2req0 aux0 ref <- I.newIORef Nothing eResponseReceived <- E.try $ app req $ \rsp -> do- let st = responseStatus rsp- h2rsp <- fromResponse settings ii req rsp- pps <- fromPushPromises ii req+ (h2rsp,st,hasBody) <- fromResponse settings ii req rsp+ pps <- if hasBody then fromPushPromises ii req else return [] I.writeIORef ref $ Just (h2rsp, pps, st) _ <- response h2rsp pps return ResponseReceived@@ -81,7 +80,7 @@ S.settingsOnException settings (Just req) e let ersp = S.settingsOnExceptionResponse settings e st = responseStatus ersp- h2rsp' <- fromResponse settings ii req ersp+ (h2rsp',_,_) <- fromResponse settings ii req ersp let msiz = fromIntegral <$> H2.responseBodySize h2rsp' _ <- response h2rsp' [] logResponse req st msiz
Network/Wai/Handler/Warp/HTTP2/Request.hs view
@@ -30,6 +30,9 @@ ---------------------------------------------------------------- +http30 :: H.HttpVersion+http30 = H.HttpVersion 3 0+ toRequest :: InternalInfo -> S.Settings -> SockAddr -> ToReq toRequest ii settings addr ht bodylen body th transport = do ref <- newIORef Nothing@@ -42,7 +45,7 @@ where !req = Request { requestMethod = colonMethod- , httpVersion = H.http20+ , httpVersion = if isTransportQUIC transport then http30 else H.http20 , rawPathInfo = rawPath , pathInfo = H.decodePathSegments path , rawQueryString = query@@ -83,7 +86,7 @@ $ Vault.insert setHTTP2DataKey (writeIORef ref) $ Vault.insert modifyHTTP2DataKey (modifyIORef' ref) $ Vault.insert pauseTimeoutKey (T.pause th)- $ Vault.insert getClientCertificateKey (tlsClientCertificate transport)+ $ Vault.insert getClientCertificateKey (getTransportClientCertificate transport) Vault.empty getHTTP2DataKey :: Vault.Key (IO (Maybe HTTP2Data))
Network/Wai/Handler/Warp/HTTP2/Response.hs view
@@ -24,10 +24,10 @@ ---------------------------------------------------------------- -fromResponse :: S.Settings -> InternalInfo -> Request -> Response -> IO H2.Response+fromResponse :: S.Settings -> InternalInfo -> Request -> Response -> IO (H2.Response, H.Status, Bool) fromResponse settings ii req rsp = do date <- getDate ii- h2rsp <- case rsp of+ rspst@(h2rsp, st, hasBody) <- case rsp of ResponseFile st rsphdr path mpart -> do let rsphdr' = add date svr rsphdr responseFile st rsphdr' isHead path mpart ii reqhdr@@ -40,10 +40,11 @@ _ -> error "ResponseRaw is not supported in HTTP/2" mh2data <- getHTTP2Data req case mh2data of- Nothing -> return h2rsp+ Nothing -> return rspst Just h2data -> do let !trailers = http2dataTrailers h2data- return $ H2.setResponseTrailersMaker h2rsp trailers+ !h2rsp' = H2.setResponseTrailersMaker h2rsp trailers+ return (h2rsp', st, hasBody) where !isHead = requestMethod req == H.methodHead !reqhdr = requestHeaders req@@ -56,7 +57,7 @@ responseFile :: H.Status -> H.ResponseHeaders -> Bool -> FilePath -> Maybe FilePart -> InternalInfo -> H.RequestHeaders- -> IO H2.Response+ -> IO (H2.Response, H.Status, Bool) responseFile st rsphdr _ _ _ _ _ | noBody st = return $ responseNoBody st rsphdr @@ -84,41 +85,43 @@ ---------------------------------------------------------------- -responseFile2XX :: H.Status -> H.ResponseHeaders -> Bool -> H2.FileSpec -> H2.Response+responseFile2XX :: H.Status -> H.ResponseHeaders -> Bool -> H2.FileSpec -> (H2.Response, H.Status, Bool) responseFile2XX st rsphdr isHead fileSpec | isHead = responseNoBody st rsphdr- | otherwise = H2.responseFile st rsphdr fileSpec+ | otherwise = (H2.responseFile st rsphdr fileSpec, st, True) ---------------------------------------------------------------- responseBuilder :: H.Status -> H.ResponseHeaders -> Bool -> BB.Builder- -> H2.Response+ -> (H2.Response, H.Status, Bool) responseBuilder st rsphdr isHead builder | noBody st = responseNoBody st rsphdr | isHead = responseNoBody st rsphdr- | otherwise = H2.responseBuilder st rsphdr builder+ | otherwise = (H2.responseBuilder st rsphdr builder, st, True) ---------------------------------------------------------------- responseStream :: H.Status -> H.ResponseHeaders -> Bool -> StreamingBody- -> H2.Response+ -> (H2.Response, H.Status, Bool) responseStream st rsphdr isHead strmbdy | noBody st = responseNoBody st rsphdr | isHead = responseNoBody st rsphdr- | otherwise = H2.responseStreaming st rsphdr strmbdy+ | otherwise = (H2.responseStreaming st rsphdr strmbdy, st, True) ---------------------------------------------------------------- -responseNoBody :: H.Status -> H.ResponseHeaders -> H2.Response-responseNoBody st rsphdr = H2.responseNoBody st rsphdr+responseNoBody :: H.Status -> H.ResponseHeaders -> (H2.Response, H.Status, Bool)+responseNoBody st rsphdr = (H2.responseNoBody st rsphdr, st, False) ---------------------------------------------------------------- -response404 :: H.ResponseHeaders -> H2.Response-response404 rsphdr = H2.responseBuilder H.notFound404 rsphdr' body+response404 :: H.ResponseHeaders -> (H2.Response, H.Status, Bool)+response404 rsphdr = (h2rsp, st, True) where+ h2rsp = H2.responseBuilder st rsphdr' body+ st = H.notFound404 !rsphdr' = R.replaceHeader H.hContentType "text/plain; charset=utf-8" rsphdr !body = BB.byteString "File not found"
Network/Wai/Handler/Warp/Request.hs view
@@ -72,7 +72,7 @@ rawPath = if settingsNoParsePath settings then unparsedPath else path vaultValue = Vault.insert pauseTimeoutKey (Timeout.pause th) $ Vault.insert getFileInfoKey (getFileInfo ii)- $ Vault.insert getClientCertificateKey (tlsClientCertificate transport)+ $ Vault.insert getClientCertificateKey (getTransportClientCertificate transport) Vault.empty (rbody, remainingRef, bodyLength) <- bodyAndSource src cl te -- body producing function which will produce '100-continue', if needed
Network/Wai/Handler/Warp/Types.hs view
@@ -182,7 +182,21 @@ , tlsChiperID :: Word16 , tlsClientCertificate :: Maybe CertificateChain } -- ^ Encrypted channel: TLS or SSL+ | QUIC {+ quicNegotiatedProtocol :: Maybe ByteString+ , quicChiperID :: Word16+ , quicClientCertificate :: Maybe CertificateChain+ } isTransportSecure :: Transport -> Bool isTransportSecure TCP = False isTransportSecure _ = True++isTransportQUIC :: Transport -> Bool+isTransportQUIC QUIC{} = True+isTransportQUIC _ = False++getTransportClientCertificate :: Transport -> Maybe CertificateChain+getTransportClientCertificate TCP = Nothing+getTransportClientCertificate (TLS _ _ _ _ cc) = cc+getTransportClientCertificate (QUIC _ _ cc) = cc
warp.cabal view
@@ -1,5 +1,5 @@ Name: warp-Version: 3.3.11+Version: 3.3.12 Synopsis: A fast, light-weight web server for WAI applications. License: MIT License-file: LICENSE@@ -45,7 +45,7 @@ , hashable , http-date , http-types >= 0.12- , http2+ , http2 >= 2.0 && < 2.1 , iproute >= 1.3.1 , simple-sendfile >= 0.2.7 && < 0.3 , stm >= 2.3@@ -197,7 +197,7 @@ , http-client , http-date , http-types >= 0.12- , http2+ , http2 >= 2.0 && < 2.1 , iproute >= 1.3.1 , lifted-base >= 0.1 , network