warp 3.4.1 → 3.4.2
raw patch · 8 files changed
+370/−308 lines, 8 files
Files
- ChangeLog.md +5/−0
- Network/Wai/Handler/Warp/HTTP1.hs +15/−11
- Network/Wai/Handler/Warp/Internal.hs +2/−0
- Network/Wai/Handler/Warp/Request.hs +9/−6
- Network/Wai/Handler/Warp/Run.hs +14/−2
- bench/Parser.hs +2/−2
- test/RequestSpec.hs +6/−6
- warp.cabal +317/−281
ChangeLog.md view
@@ -1,5 +1,10 @@ # ChangeLog for warp +## 3.4.2++* serveConnection is re-exported from the Internal module.+ [#1007](https://github.com/yesodweb/wai/pull/1007)+ ## 3.4.1 * Using time-manager v0.1.0, and auto-update v0.2.0.
Network/Wai/Handler/Warp/HTTP1.hs view
@@ -115,7 +115,7 @@ -> Source -> IO () http1server settings ii conn transport app addr th istatus src =- loop True `UnliftIO.catchAny` handler+ loop FirstRequest `UnliftIO.catchAny` handler where handler e -- See comment below referencing@@ -154,19 +154,23 @@ `UnliftIO.catchAny` \e -> do settingsOnException settings (Just req) e -- Don't throw the error again to prevent calling settingsOnException twice.- return False+ return CloseConnection -- When doing a keep-alive connection, the other side may just -- close the connection. We don't want to treat that as an- -- exceptional situation, so we pass in False to http1 (which- -- in turn passes in False to recvRequest), indicating that+ -- exceptional situation, so we pass in SubsequentRequest to http1 (which+ -- in turn passes in SubsequentRequest to recvRequest), indicating that -- this is not the first request. If, when trying to read the -- request headers, no data is available, recvRequest will -- throw a NoKeepAliveRequest exception, which we catch here -- and ignore. See: https://github.com/yesodweb/wai/issues/618 - when keepAlive $ loop False+ case keepAlive of+ ReuseConnection -> loop SubsequentRequest+ CloseConnection -> return () +data ReuseConnection = ReuseConnection | CloseConnection+ processRequest :: Settings -> InternalInfo@@ -179,7 +183,7 @@ -> Maybe (IORef Int) -> IndexedHeader -> IO ByteString- -> IO Bool+ -> IO ReuseConnection processRequest settings ii conn app th istatus src req mremainingRef idxhdr nextBodyFlush = do -- Let the application run for as long as it wants T.pause th@@ -226,7 +230,7 @@ Nothing -> do flushEntireBody nextBodyFlush T.resume th- return True+ return ReuseConnection Just maxToRead -> do let tryKeepAlive = do -- flush the rest of the request body@@ -234,16 +238,16 @@ if isComplete then do T.resume th- return True- else return False+ return ReuseConnection+ else return CloseConnection case mremainingRef of Just ref -> do remaining <- readIORef ref if remaining <= maxToRead then tryKeepAlive- else return False+ else return CloseConnection Nothing -> tryKeepAlive- else return False+ else return CloseConnection sendErrorResponse :: Settings
Network/Wai/Handler/Warp/Internal.hs view
@@ -75,6 +75,7 @@ -- * Request and response Source,+ FirstRequest (..), recvRequest, sendResponse, @@ -85,6 +86,7 @@ -- * Misc http2server, withII,+ serveConnection, pReadMaker, ) where
Network/Wai/Handler/Warp/Request.hs view
@@ -4,6 +4,7 @@ {-# OPTIONS_GHC -fno-warn-deprecations #-} module Network.Wai.Handler.Warp.Request (+ FirstRequest(..), recvRequest, headerLines, pauseTimeoutKey,@@ -50,11 +51,13 @@ ---------------------------------------------------------------- +-- | first request on this connection?+data FirstRequest = FirstRequest | SubsequentRequest+ -- | Receiving a HTTP request from 'Connection' and parsing its header -- to create 'Request'. recvRequest- :: Bool- -- ^ first request on this connection?+ :: FirstRequest -> Settings -> Connection -> InternalInfo@@ -118,7 +121,7 @@ ---------------------------------------------------------------- -headerLines :: Int -> Bool -> Source -> IO [ByteString]+headerLines :: Int -> FirstRequest -> Source -> IO [ByteString] headerLines maxTotalHeaderLength firstRequest src = do bs <- readSource src if S.null bs@@ -127,9 +130,9 @@ -- lack of data as a real exception. See the http1 function in -- the Run module for more details. - if firstRequest- then throwIO ConnectionClosedByPeer- else throwIO NoKeepAliveRequest+ case firstRequest of+ FirstRequest -> throwIO ConnectionClosedByPeer+ SubsequentRequest -> throwIO NoKeepAliveRequest else push maxTotalHeaderLength src (THStatus 0 0 id id) bs data NoKeepAliveRequest = NoKeepAliveRequest
Network/Wai/Handler/Warp/Run.hs view
@@ -386,8 +386,8 @@ if isHTTP2 transport then return (True, "") else do- bs0 <- connRecv conn- if S.length bs0 >= 4 && "PRI " `S.isPrefixOf` bs0+ bs0 <- recv4 ""+ if "PRI " `S.isPrefixOf` bs0 then return (True, bs0) else return (False, bs0) if settingsHTTP2Enabled settings && h2@@ -395,6 +395,18 @@ http2 settings ii conn transport app origAddr th bs else do http1 settings ii conn transport app origAddr th bs+ where+ recv4 bs0 = do+ bs1 <- connRecv conn+ if S.null bs1 then+ return bs0+ else do+ -- In the case where bs0 is "", (<>) is called unnecessarily.+ -- But we adopt this logic for simplicity.+ let bs2 = bs0 <> bs1+ if S.length bs2 >= 4+ then return bs2+ else recv4 bs2 -- | Set flag FileCloseOnExec flag on a socket (on Unix) --
bench/Parser.hs view
@@ -19,7 +19,7 @@ import UnliftIO.Exception (impureThrow, throwIO) import Prelude hiding (lines) -import Network.Wai.Handler.Warp.Request (headerLines)+import Network.Wai.Handler.Warp.Request (FirstRequest (..), headerLines) import Network.Wai.Handler.Warp.Types #if MIN_VERSION_gauge(0, 2, 0)@@ -61,7 +61,7 @@ ] ] where- testIt req = producer req >>= headerLines 800 False+ testIt req = producer req >>= headerLines 800 FirstRequest ----------------------------------------------------------------
test/RequestSpec.hs view
@@ -70,7 +70,7 @@ describe "headerLines" $ do let parseHeaderLine chunks = do src <- mkSourceFunc chunks >>= mkSource- x <- headerLines defaultMaxTotalHeaderLength True src+ x <- headerLines defaultMaxTotalHeaderLength FirstRequest src x `shouldBe` ["Status: 200", "Content-Type: text/plain"] it "can handle a normal case" $@@ -95,9 +95,9 @@ it "can (not) handle an illegal case (1)" $ do let chunks = ["\nStatus:", "\n 200", "\nContent-Type: text/plain", "\r\n\r\n"] src <- mkSourceFunc chunks >>= mkSource- x <- headerLines defaultMaxTotalHeaderLength True src+ x <- headerLines defaultMaxTotalHeaderLength FirstRequest src x `shouldBe` []- y <- headerLines defaultMaxTotalHeaderLength True src+ y <- headerLines defaultMaxTotalHeaderLength FirstRequest src y `shouldBe` ["Status:", " 200", "Content-Type: text/plain"] let testLengthHeaders = ["Sta", "tus: 200\r", "\n", "Content-Type: ", "text/plain\r\n\r\n"]@@ -106,12 +106,12 @@ -- Length is 39, this shouldn't fail it "doesn't throw on correct length" $ do src <- mkSourceFunc testLengthHeaders >>= mkSource- x <- headerLines testLength True src+ x <- headerLines testLength FirstRequest src x `shouldBe` ["Status: 200", "Content-Type: text/plain"] -- Length is still 39, this should fail it "throws error on correct length too long" $ do src <- mkSourceFunc testLengthHeaders >>= mkSource- headerLines (testLength - 1) True src `shouldThrow` (== OverLargeHeader)+ headerLines (testLength - 1) FirstRequest src `shouldThrow` (== OverLargeHeader) where blankSafe = headerLinesList ["f", "oo\n", "bar\nbaz\n\r\n"] whiteSafe = headerLinesList ["foo\r\nbar\r\nbaz\r\n\r\n hi there"]@@ -135,7 +135,7 @@ writeIORef ref z return y src' <- mkSource src- res <- headerLines defaultMaxTotalHeaderLength True src'+ res <- headerLines defaultMaxTotalHeaderLength FirstRequest src' return (res, src') consumeLen :: Int -> Source -> IO S8.ByteString
warp.cabal view
@@ -1,295 +1,331 @@-Name: warp-Version: 3.4.1-Synopsis: A fast, light-weight web server for WAI applications.-License: MIT-License-file: LICENSE-Author: Michael Snoyman, Kazu Yamamoto, Matt Brown-Maintainer: michael@snoyman.com-Homepage: http://github.com/yesodweb/wai-Category: Web, Yesod-Build-Type: Simple-Cabal-Version: >= 1.10-Stability: Stable-description: HTTP\/1.0, HTTP\/1.1 and HTTP\/2 are supported.- For HTTP\/2, Warp supports direct and ALPN (in TLS)- but not upgrade.- API docs and the README are available at- <http://www.stackage.org/package/warp>.-extra-source-files: attic/hex- ChangeLog.md- README.md- test/head-response- test/inputFile+cabal-version: >=1.10+name: warp+version: 3.4.2+license: MIT+license-file: LICENSE+maintainer: michael@snoyman.com+author: Michael Snoyman, Kazu Yamamoto, Matt Brown+stability: Stable+homepage: http://github.com/yesodweb/wai+synopsis: A fast, light-weight web server for WAI applications.+description:+ HTTP\/1.0, HTTP\/1.1 and HTTP\/2 are supported.+ For HTTP\/2, Warp supports direct and ALPN (in TLS)+ but not upgrade.+ API docs and the README are available at+ <http://www.stackage.org/package/warp>. -Flag network-bytestring- Default: False+category: Web, Yesod+build-type: Simple+extra-source-files:+ attic/hex+ ChangeLog.md+ README.md+ test/head-response+ test/inputFile -Flag allow-sendfilefd- Description: Allow use of sendfileFd (not available on GNU/kFreeBSD)- Default: True+source-repository head+ type: git+ location: git://github.com/yesodweb/wai.git -Flag warp-debug- Description: print debug output. not suitable for production- Default: False+flag network-bytestring+ default: False -Flag x509- Description: Adds a dependency on the x509 library to enable getting TLS client certificates.- Default: True+flag allow-sendfilefd+ description: Allow use of sendfileFd (not available on GNU/kFreeBSD) -Library- Build-Depends: base >= 4.12 && < 5- , array- , auto-update >= 0.2 && < 0.3- , bsb-http-chunked < 0.1- , bytestring >= 0.9.1.4- , case-insensitive >= 0.2- , containers- , ghc-prim- , hashable- , http-date- , http-types >= 0.12- , http2 >= 5.1 && < 5.3- , iproute >= 1.3.1- , recv >= 0.1.0 && < 0.2.0- , simple-sendfile >= 0.2.7 && < 0.3- , stm >= 2.3- , streaming-commons >= 0.1.10- , text- , time-manager >= 0.1 && < 0.2- , vault >= 0.3- , wai >= 3.2.4 && < 3.3- , word8- , unliftio- if flag(x509)- Build-Depends: crypton-x509- if impl(ghc < 8)- Build-Depends: semigroups- if flag(network-bytestring)- Build-Depends: network >= 2.2.1.5 && < 2.2.3- , network-bytestring >= 0.1.3 && < 0.1.4- else- Build-Depends: network >= 2.3- Exposed-modules: Network.Wai.Handler.Warp- Network.Wai.Handler.Warp.Internal- Other-modules: Network.Wai.Handler.Warp.Buffer- Network.Wai.Handler.Warp.Conduit- Network.Wai.Handler.Warp.Counter- Network.Wai.Handler.Warp.Date- Network.Wai.Handler.Warp.FdCache- Network.Wai.Handler.Warp.File- Network.Wai.Handler.Warp.FileInfoCache- Network.Wai.Handler.Warp.HashMap- Network.Wai.Handler.Warp.HTTP1- Network.Wai.Handler.Warp.HTTP2- Network.Wai.Handler.Warp.HTTP2.File- Network.Wai.Handler.Warp.HTTP2.PushPromise- Network.Wai.Handler.Warp.HTTP2.Request- Network.Wai.Handler.Warp.HTTP2.Response- Network.Wai.Handler.Warp.HTTP2.Types- Network.Wai.Handler.Warp.Header- Network.Wai.Handler.Warp.IO- Network.Wai.Handler.Warp.Imports- Network.Wai.Handler.Warp.PackInt- Network.Wai.Handler.Warp.ReadInt- Network.Wai.Handler.Warp.Request- Network.Wai.Handler.Warp.RequestHeader- Network.Wai.Handler.Warp.Response- Network.Wai.Handler.Warp.ResponseHeader- Network.Wai.Handler.Warp.Run- Network.Wai.Handler.Warp.SendFile- Network.Wai.Handler.Warp.Settings- Network.Wai.Handler.Warp.Types- Network.Wai.Handler.Warp.Windows- Network.Wai.Handler.Warp.WithApplication- Paths_warp- Ghc-Options: -Wall+flag warp-debug+ description: print debug output. not suitable for production+ default: False - if flag(warp-debug)- Cpp-Options: -DWARP_DEBUG- if (os(linux) || os(freebsd) || os(darwin)) && flag(allow-sendfilefd)- Cpp-Options: -DSENDFILEFD- if os(windows)- Cpp-Options: -DWINDOWS- Build-Depends: time- , unix-compat >= 0.2- else- Build-Depends: unix- Other-modules: Network.Wai.Handler.Warp.MultiMap- if impl(ghc >= 8)- Default-Extensions: Strict StrictData- Default-Language: Haskell2010+flag x509+ description:+ Adds a dependency on the x509 library to enable getting TLS client certificates. -Test-Suite doctest- buildable: False- Type: exitcode-stdio-1.0- HS-Source-Dirs: test- Ghc-Options: -threaded -Wall- Main-Is: doctests.hs- Build-Depends: base >= 4.8 && < 5- , doctest >= 0.10.1- if os(windows)- Buildable: False- if impl(ghc >= 8)- Default-Extensions: Strict StrictData- Default-Language: Haskell2010+library+ exposed-modules:+ Network.Wai.Handler.Warp+ Network.Wai.Handler.Warp.Internal -Test-Suite spec- Main-Is: Spec.hs- Other-modules: ConduitSpec- ExceptionSpec- FdCacheSpec- FileSpec- HTTP- PackIntSpec- ReadIntSpec- RequestSpec- ResponseHeaderSpec- ResponseSpec- RunSpec- SendFileSpec- WithApplicationSpec- Network.Wai.Handler.Warp- Network.Wai.Handler.Warp.Buffer- Network.Wai.Handler.Warp.Conduit- Network.Wai.Handler.Warp.Counter- Network.Wai.Handler.Warp.Date- Network.Wai.Handler.Warp.FdCache- Network.Wai.Handler.Warp.File- Network.Wai.Handler.Warp.FileInfoCache- Network.Wai.Handler.Warp.HTTP1- Network.Wai.Handler.Warp.HTTP2- Network.Wai.Handler.Warp.HTTP2.File- Network.Wai.Handler.Warp.HTTP2.PushPromise- Network.Wai.Handler.Warp.HTTP2.Request- Network.Wai.Handler.Warp.HTTP2.Response- Network.Wai.Handler.Warp.HTTP2.Types- Network.Wai.Handler.Warp.HashMap- Network.Wai.Handler.Warp.Header- Network.Wai.Handler.Warp.IO- Network.Wai.Handler.Warp.Imports- Network.Wai.Handler.Warp.MultiMap- Network.Wai.Handler.Warp.PackInt- Network.Wai.Handler.Warp.ReadInt- Network.Wai.Handler.Warp.Request- Network.Wai.Handler.Warp.RequestHeader- Network.Wai.Handler.Warp.Response- Network.Wai.Handler.Warp.ResponseHeader- Network.Wai.Handler.Warp.Run- Network.Wai.Handler.Warp.SendFile- Network.Wai.Handler.Warp.Settings- Network.Wai.Handler.Warp.Types- Network.Wai.Handler.Warp.Windows- Network.Wai.Handler.Warp.WithApplication- Paths_warp+ other-modules:+ Network.Wai.Handler.Warp.Buffer+ Network.Wai.Handler.Warp.Conduit+ Network.Wai.Handler.Warp.Counter+ Network.Wai.Handler.Warp.Date+ Network.Wai.Handler.Warp.FdCache+ Network.Wai.Handler.Warp.File+ Network.Wai.Handler.Warp.FileInfoCache+ Network.Wai.Handler.Warp.HTTP1+ Network.Wai.Handler.Warp.HTTP2+ Network.Wai.Handler.Warp.HTTP2.File+ Network.Wai.Handler.Warp.HTTP2.PushPromise+ Network.Wai.Handler.Warp.HTTP2.Request+ Network.Wai.Handler.Warp.HTTP2.Response+ Network.Wai.Handler.Warp.HTTP2.Types+ Network.Wai.Handler.Warp.HashMap+ Network.Wai.Handler.Warp.Header+ Network.Wai.Handler.Warp.IO+ Network.Wai.Handler.Warp.Imports+ Network.Wai.Handler.Warp.PackInt+ Network.Wai.Handler.Warp.ReadInt+ Network.Wai.Handler.Warp.Request+ Network.Wai.Handler.Warp.RequestHeader+ Network.Wai.Handler.Warp.Response+ Network.Wai.Handler.Warp.ResponseHeader+ Network.Wai.Handler.Warp.Run+ Network.Wai.Handler.Warp.SendFile+ Network.Wai.Handler.Warp.Settings+ Network.Wai.Handler.Warp.Types+ Network.Wai.Handler.Warp.Windows+ Network.Wai.Handler.Warp.WithApplication+ Paths_warp - Hs-Source-Dirs: test, .- Type: exitcode-stdio-1.0+ default-language: Haskell2010+ ghc-options: -Wall+ build-depends:+ base >=4.12 && <5,+ array,+ auto-update >=0.2 && <0.3,+ bsb-http-chunked <0.1,+ bytestring >=0.9.1.4,+ case-insensitive >=0.2,+ containers,+ ghc-prim,+ hashable,+ http-date,+ http-types >=0.12,+ http2 >=5.1 && <5.4,+ iproute >=1.3.1,+ recv >=0.1.0 && <0.2.0,+ simple-sendfile >=0.2.7 && <0.3,+ stm >=2.3,+ streaming-commons >=0.1.10,+ text,+ time-manager >=0.1 && <0.2,+ vault >=0.3,+ wai >=3.2.4 && <3.3,+ word8,+ unliftio - Ghc-Options: -Wall -threaded- Build-Tool-Depends: hspec-discover:hspec-discover- Build-Depends: base >= 4.8 && < 5- , QuickCheck- , array- , auto-update- , bsb-http-chunked < 0.1- , bytestring >= 0.9.1.4- , case-insensitive >= 0.2- , containers- , directory- , ghc-prim- , hashable- , hspec >= 1.3- , http-client- , http-date- , http-types >= 0.12- , http2 >= 5.1 && < 5.3- , iproute >= 1.3.1- , network- , process- , recv >= 0.1.0 && < 0.2.0- , simple-sendfile >= 0.2.4 && < 0.3- , stm >= 2.3- , streaming-commons >= 0.1.10- , text- , time-manager- , vault- , wai >= 3.2.2.1 && < 3.3- , word8- , unliftio- if flag(x509)- Build-Depends: crypton-x509- if impl(ghc < 8)- Build-Depends: semigroups- , transformers+ if flag(x509)+ build-depends: crypton-x509 - if (os(linux) || os(freebsd) || os(darwin)) && flag(allow-sendfilefd)- Cpp-Options: -DSENDFILEFD- if os(windows)- Cpp-Options: -DWINDOWS- Build-Depends: time- , unix-compat >= 0.2- else- Build-Depends: unix- Other-modules: Network.Wai.Handler.Warp.MultiMap- if impl(ghc >= 8)- Default-Extensions: Strict StrictData- Default-Language: Haskell2010+ if impl(ghc <8)+ build-depends: semigroups -Benchmark parser- Type: exitcode-stdio-1.0- Main-Is: Parser.hs- other-modules: Network.Wai.Handler.Warp.Conduit- Network.Wai.Handler.Warp.Date- Network.Wai.Handler.Warp.FdCache- Network.Wai.Handler.Warp.FileInfoCache- Network.Wai.Handler.Warp.HashMap- Network.Wai.Handler.Warp.Header- Network.Wai.Handler.Warp.Imports- Network.Wai.Handler.Warp.MultiMap- Network.Wai.Handler.Warp.ReadInt- Network.Wai.Handler.Warp.Request- Network.Wai.Handler.Warp.RequestHeader- Network.Wai.Handler.Warp.Settings- Network.Wai.Handler.Warp.Types- Paths_warp- HS-Source-Dirs: bench .- Build-Depends: base >= 4.8 && < 5- , array- , auto-update- , bytestring- , case-insensitive- , containers- , gauge- , ghc-prim- , hashable- , http-date- , http-types- , network- , network- , recv- , streaming-commons- , text- , time-manager- , unliftio- , vault- , wai- , word8- if flag(x509)- Build-Depends: crypton-x509- if impl(ghc < 8)- Build-Depends: semigroups+ if flag(network-bytestring)+ build-depends:+ network >=2.2.1.5 && <2.2.3,+ network-bytestring >=0.1.3 && <0.1.4 - if (os(linux) || os(freebsd) || os(darwin)) && flag(allow-sendfilefd)- Cpp-Options: -DSENDFILEFD- Build-Depends: unix- if os(windows)- Cpp-Options: -DWINDOWS- Build-Depends: time- , unix-compat >= 0.2- if impl(ghc >= 8)- Default-Extensions: Strict StrictData- Default-Language: Haskell2010+ else+ build-depends: network >=2.3 -Source-Repository head- Type: git- Location: git://github.com/yesodweb/wai.git+ if flag(warp-debug)+ cpp-options: -DWARP_DEBUG++ if (((os(linux) || os(freebsd)) || os(osx)) && flag(allow-sendfilefd))+ cpp-options: -DSENDFILEFD++ if os(windows)+ cpp-options: -DWINDOWS+ build-depends:+ time,+ unix-compat >=0.2++ else+ other-modules: Network.Wai.Handler.Warp.MultiMap+ build-depends: unix++ if impl(ghc >=8)+ default-extensions: Strict StrictData++test-suite doctest+ type: exitcode-stdio-1.0+ main-is: doctests.hs+ buildable: False+ hs-source-dirs: test+ default-language: Haskell2010+ ghc-options: -threaded -Wall+ build-depends:+ base >=4.8 && <5,+ doctest >=0.10.1++ if os(windows)+ buildable: False++ if impl(ghc >=8)+ default-extensions: Strict StrictData++test-suite spec+ type: exitcode-stdio-1.0+ main-is: Spec.hs+ build-tool-depends: hspec-discover:hspec-discover+ hs-source-dirs: test .+ other-modules:+ ConduitSpec+ ExceptionSpec+ FdCacheSpec+ FileSpec+ HTTP+ PackIntSpec+ ReadIntSpec+ RequestSpec+ ResponseHeaderSpec+ ResponseSpec+ RunSpec+ SendFileSpec+ WithApplicationSpec+ Network.Wai.Handler.Warp+ Network.Wai.Handler.Warp.Internal+ Network.Wai.Handler.Warp.Buffer+ Network.Wai.Handler.Warp.Conduit+ Network.Wai.Handler.Warp.Counter+ Network.Wai.Handler.Warp.Date+ Network.Wai.Handler.Warp.FdCache+ Network.Wai.Handler.Warp.File+ Network.Wai.Handler.Warp.FileInfoCache+ Network.Wai.Handler.Warp.HTTP1+ Network.Wai.Handler.Warp.HTTP2+ Network.Wai.Handler.Warp.HTTP2.File+ Network.Wai.Handler.Warp.HTTP2.PushPromise+ Network.Wai.Handler.Warp.HTTP2.Request+ Network.Wai.Handler.Warp.HTTP2.Response+ Network.Wai.Handler.Warp.HTTP2.Types+ Network.Wai.Handler.Warp.HashMap+ Network.Wai.Handler.Warp.Header+ Network.Wai.Handler.Warp.IO+ Network.Wai.Handler.Warp.Imports+ Network.Wai.Handler.Warp.PackInt+ Network.Wai.Handler.Warp.ReadInt+ Network.Wai.Handler.Warp.Request+ Network.Wai.Handler.Warp.RequestHeader+ Network.Wai.Handler.Warp.Response+ Network.Wai.Handler.Warp.ResponseHeader+ Network.Wai.Handler.Warp.Run+ Network.Wai.Handler.Warp.SendFile+ Network.Wai.Handler.Warp.Settings+ Network.Wai.Handler.Warp.Types+ Network.Wai.Handler.Warp.Windows+ Network.Wai.Handler.Warp.WithApplication+ Paths_warp++ default-language: Haskell2010+ ghc-options: -Wall -threaded+ build-depends:+ base >=4.8 && <5,+ QuickCheck,+ array,+ auto-update,+ bsb-http-chunked <0.1,+ bytestring >=0.9.1.4,+ case-insensitive >=0.2,+ containers,+ directory,+ ghc-prim,+ hashable,+ hspec >=1.3,+ http-client,+ http-date,+ http-types >=0.12,+ http2 >=5.1 && <5.4,+ iproute >=1.3.1,+ network,+ process,+ recv >=0.1.0 && <0.2.0,+ simple-sendfile >=0.2.4 && <0.3,+ stm >=2.3,+ streaming-commons >=0.1.10,+ text,+ time-manager,+ vault,+ wai >=3.2.2.1 && <3.3,+ word8,+ unliftio++ if flag(x509)+ build-depends: crypton-x509++ if impl(ghc <8)+ build-depends:+ semigroups,+ transformers++ if (((os(linux) || os(freebsd)) || os(osx)) && flag(allow-sendfilefd))+ cpp-options: -DSENDFILEFD++ if os(windows)+ cpp-options: -DWINDOWS+ build-depends:+ time,+ unix-compat >=0.2++ else+ other-modules: Network.Wai.Handler.Warp.MultiMap+ build-depends: unix++ if impl(ghc >=8)+ default-extensions: Strict StrictData++benchmark parser+ type: exitcode-stdio-1.0+ main-is: Parser.hs+ hs-source-dirs: bench .+ other-modules:+ Network.Wai.Handler.Warp.Conduit+ Network.Wai.Handler.Warp.Date+ Network.Wai.Handler.Warp.FdCache+ Network.Wai.Handler.Warp.FileInfoCache+ Network.Wai.Handler.Warp.HashMap+ Network.Wai.Handler.Warp.Header+ Network.Wai.Handler.Warp.Imports+ Network.Wai.Handler.Warp.MultiMap+ Network.Wai.Handler.Warp.ReadInt+ Network.Wai.Handler.Warp.Request+ Network.Wai.Handler.Warp.RequestHeader+ Network.Wai.Handler.Warp.Settings+ Network.Wai.Handler.Warp.Types+ Paths_warp++ default-language: Haskell2010+ build-depends:+ base >=4.8 && <5,+ array,+ auto-update,+ bytestring,+ case-insensitive,+ containers,+ gauge,+ ghc-prim,+ hashable,+ http-date,+ http-types,+ network,+ network,+ recv,+ streaming-commons,+ text,+ time-manager,+ unliftio,+ vault,+ wai,+ word8++ if flag(x509)+ build-depends: crypton-x509++ if impl(ghc <8)+ build-depends: semigroups++ if (((os(linux) || os(freebsd)) || os(osx)) && flag(allow-sendfilefd))+ cpp-options: -DSENDFILEFD+ build-depends: unix++ if os(windows)+ cpp-options: -DWINDOWS+ build-depends:+ time,+ unix-compat >=0.2++ if impl(ghc >=8)+ default-extensions: Strict StrictData