From b8722cd934cd86b32dd20be634cc3168ceadadd7 Mon Sep 17 00:00:00 2001 From: Luke Worth Date: Fri, 29 Aug 2025 15:10:53 +1000 Subject: [PATCH 1/6] feat(warp): dependency on Paths_warp depends on flag include-warp-version Disabling this flag prevents warp from depending on files in the GHC distribution and may lead to a smaller runtime dependency closure. --- warp/Network/Wai/Handler/Warp/Response.hs | 14 +++++++++++--- warp/Network/Wai/Handler/Warp/Settings.hs | 14 +++++++++++--- warp/warp.cabal | 22 +++++++++++++++++++--- 3 files changed, 41 insertions(+), 9 deletions(-) diff --git a/warp/Network/Wai/Handler/Warp/Response.hs b/warp/Network/Wai/Handler/Warp/Response.hs index cd46a383d..e8d5a61bb 100644 --- a/warp/Network/Wai/Handler/Warp/Response.hs +++ b/warp/Network/Wai/Handler/Warp/Response.hs @@ -31,13 +31,11 @@ import Data.Streaming.ByteString.Builder ( newByteStringBuilderRecv, reuseBufferStrategy, ) -import Data.Version (showVersion) import Data.Word8 (_cr, _lf, _space, _tab) import qualified Network.HTTP.Types as H import qualified Network.HTTP.Types.Header as H import Network.Wai import Network.Wai.Internal -import qualified Paths_warp import qualified System.TimeManager as T import Network.Wai.Handler.Warp.Buffer (toBuilderBuffer) @@ -50,6 +48,11 @@ import Network.Wai.Handler.Warp.ResponseHeader import Network.Wai.Handler.Warp.Settings import Network.Wai.Handler.Warp.Types +#ifdef INCLUDE_WARP_VERSION +import Data.Version (showVersion) +import qualified Paths_warp +#endif + -- $setup -- >>> :set -XOverloadedStrings @@ -481,7 +484,12 @@ addDate getdate rspidxhdr hdrs = case rspidxhdr ! fromEnum ResDate of -- | The version of Warp. warpVersion :: String -warpVersion = showVersion Paths_warp.version +warpVersion = +#ifdef INCLUDE_WARP_VERSION + showVersion Paths_warp.version +#else + "unknown" +#endif {-# INLINE addServer #-} addServer diff --git a/warp/Network/Wai/Handler/Warp/Settings.hs b/warp/Network/Wai/Handler/Warp/Settings.hs index 882b77cb5..3a4ecd1e9 100644 --- a/warp/Network/Wai/Handler/Warp/Settings.hs +++ b/warp/Network/Wai/Handler/Warp/Settings.hs @@ -15,14 +15,12 @@ import qualified Data.ByteString.Char8 as C8 import Data.Streaming.Network (HostPreference) import qualified Data.Text as T import qualified Data.Text.IO as TIO -import Data.Version (showVersion) import GHC.IO (IO (IO), unsafeUnmask) import GHC.IO.Exception (IOErrorType (..)) import GHC.Prim (fork#) import qualified Network.HTTP.Types as H import Network.Socket (SockAddr, Socket, accept) import Network.Wai -import qualified Paths_warp import System.IO (stderr) import System.IO.Error (ioeGetErrorType) import System.TimeManager @@ -33,6 +31,11 @@ import Network.Wai.Handler.Warp.Types import Network.Wai.Handler.Warp.Windows (windowsThreadBlockHack) #endif +#ifdef INCLUDE_WARP_VERSION +import Data.Version (showVersion) +import qualified Paths_warp +#endif + -- | Various Warp server settings. This is purposely kept as an abstract data -- type so that new settings can be added without breaking backwards -- compatibility. In order to create a 'Settings' value, use 'defaultSettings' @@ -206,7 +209,12 @@ defaultSettings = , settingsAccept = defaultAccept , settingsNoParsePath = False , settingsInstallShutdownHandler = const $ return () - , settingsServerName = C8.pack $ "Warp/" ++ showVersion Paths_warp.version + , settingsServerName = C8.pack $ "Warp/" ++ +#ifdef INCLUDE_WARP_VERSION + showVersion Paths_warp.version +#else + "unknown" +#endif , settingsMaximumBodyFlush = Just 8192 , settingsProxyProtocol = ProxyProtocolNone , settingsSlowlorisSize = 2048 diff --git a/warp/warp.cabal b/warp/warp.cabal index 738380c80..a0bf84d40 100644 --- a/warp/warp.cabal +++ b/warp/warp.cabal @@ -34,6 +34,13 @@ flag network-bytestring flag allow-sendfilefd description: Allow use of sendfileFd (not available on GNU/kFreeBSD) +flag include-warp-version + description: + Exposes the version in Network.Wai.Handler.Warp.warpVersion. + This can cause a large runtime dependency closure due to depending on + files shipped with GHC itself. + manual: True + flag warp-debug description: print debug output. not suitable for production default: False @@ -78,7 +85,9 @@ library Network.Wai.Handler.Warp.Types Network.Wai.Handler.Warp.Windows Network.Wai.Handler.Warp.WithApplication - Paths_warp + + if flag(include-warp-version) + other-modules: Paths_warp default-language: Haskell2010 ghc-options: -Wall @@ -140,6 +149,9 @@ library if impl(ghc >=8) default-extensions: Strict StrictData + if flag(include-warp-version) + cpp-options: -DINCLUDE_WARP_VERSION + test-suite doctest type: exitcode-stdio-1.0 main-is: doctests.hs @@ -208,7 +220,9 @@ test-suite spec Network.Wai.Handler.Warp.Types Network.Wai.Handler.Warp.Windows Network.Wai.Handler.Warp.WithApplication - Paths_warp + + if flag(include-warp-version) + other-modules: Paths_warp default-language: Haskell2010 ghc-options: -Wall -threaded @@ -285,7 +299,9 @@ benchmark parser Network.Wai.Handler.Warp.RequestHeader Network.Wai.Handler.Warp.Settings Network.Wai.Handler.Warp.Types - Paths_warp + + if flag(include-warp-version) + other-modules: Paths_warp default-language: Haskell2010 build-depends: From e2e1bb451c2fb00c814ebcff6b93e6e91962afc0 Mon Sep 17 00:00:00 2001 From: Luke Worth Date: Fri, 29 Aug 2025 15:19:22 +1000 Subject: [PATCH 2/6] refactor: move warpVersion to Settings for reuse --- warp/Network/Wai/Handler/Warp.hs | 1 - warp/Network/Wai/Handler/Warp/Internal.hs | 1 + warp/Network/Wai/Handler/Warp/Response.hs | 15 +-------------- warp/Network/Wai/Handler/Warp/Settings.hs | 16 ++++++++++------ 4 files changed, 12 insertions(+), 21 deletions(-) diff --git a/warp/Network/Wai/Handler/Warp.hs b/warp/Network/Wai/Handler/Warp.hs index fd22f89a5..6bd86e94a 100644 --- a/warp/Network/Wai/Handler/Warp.hs +++ b/warp/Network/Wai/Handler/Warp.hs @@ -159,7 +159,6 @@ import Network.Wai.Handler.Warp.HTTP2.Request ( import Network.Wai.Handler.Warp.HTTP2.Types import Network.Wai.Handler.Warp.Imports import Network.Wai.Handler.Warp.Request -import Network.Wai.Handler.Warp.Response (warpVersion) import Network.Wai.Handler.Warp.Run import Network.Wai.Handler.Warp.Settings import Network.Wai.Handler.Warp.Types hiding (getFileInfo) diff --git a/warp/Network/Wai/Handler/Warp/Internal.hs b/warp/Network/Wai/Handler/Warp/Internal.hs index 79be77248..490c782d4 100644 --- a/warp/Network/Wai/Handler/Warp/Internal.hs +++ b/warp/Network/Wai/Handler/Warp/Internal.hs @@ -107,3 +107,4 @@ import Network.Wai.Handler.Warp.SendFile import Network.Wai.Handler.Warp.Settings import Network.Wai.Handler.Warp.Types import Network.Wai.Handler.Warp.Windows + diff --git a/warp/Network/Wai/Handler/Warp/Response.hs b/warp/Network/Wai/Handler/Warp/Response.hs index e8d5a61bb..83009be35 100644 --- a/warp/Network/Wai/Handler/Warp/Response.hs +++ b/warp/Network/Wai/Handler/Warp/Response.hs @@ -7,6 +7,7 @@ module Network.Wai.Handler.Warp.Response ( sendResponse, sanitizeHeaderValue, -- for testing + -- Provided here for backwards compatibility. warpVersion, hasBody, replaceHeader, @@ -48,11 +49,6 @@ import Network.Wai.Handler.Warp.ResponseHeader import Network.Wai.Handler.Warp.Settings import Network.Wai.Handler.Warp.Types -#ifdef INCLUDE_WARP_VERSION -import Data.Version (showVersion) -import qualified Paths_warp -#endif - -- $setup -- >>> :set -XOverloadedStrings @@ -482,15 +478,6 @@ addDate getdate rspidxhdr hdrs = case rspidxhdr ! fromEnum ResDate of ---------------------------------------------------------------- --- | The version of Warp. -warpVersion :: String -warpVersion = -#ifdef INCLUDE_WARP_VERSION - showVersion Paths_warp.version -#else - "unknown" -#endif - {-# INLINE addServer #-} addServer :: HeaderValue -> IndexedHeader -> H.ResponseHeaders -> H.ResponseHeaders diff --git a/warp/Network/Wai/Handler/Warp/Settings.hs b/warp/Network/Wai/Handler/Warp/Settings.hs index 3a4ecd1e9..6a6a5e97a 100644 --- a/warp/Network/Wai/Handler/Warp/Settings.hs +++ b/warp/Network/Wai/Handler/Warp/Settings.hs @@ -209,12 +209,7 @@ defaultSettings = , settingsAccept = defaultAccept , settingsNoParsePath = False , settingsInstallShutdownHandler = const $ return () - , settingsServerName = C8.pack $ "Warp/" ++ -#ifdef INCLUDE_WARP_VERSION - showVersion Paths_warp.version -#else - "unknown" -#endif + , settingsServerName = C8.pack $ "Warp/" ++ warpVersion , settingsMaximumBodyFlush = Just 8192 , settingsProxyProtocol = ProxyProtocolNone , settingsSlowlorisSize = 2048 @@ -326,3 +321,12 @@ defaultAccept = #else accept #endif + +-- | The version of Warp. +warpVersion :: String +warpVersion = +#ifdef INCLUDE_WARP_VERSION + showVersion Paths_warp.version +#else + "unknown" +#endif From 9552251a3845c50960d7aad6648cc95349109049 Mon Sep 17 00:00:00 2001 From: Luke Worth Date: Sat, 30 Aug 2025 16:47:06 +1000 Subject: [PATCH 3/6] chore: bump version and add Changelog.md entry --- warp/ChangeLog.md | 4 ++++ warp/warp.cabal | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/warp/ChangeLog.md b/warp/ChangeLog.md index a0d8182b7..db9f6f846 100644 --- a/warp/ChangeLog.md +++ b/warp/ChangeLog.md @@ -1,5 +1,9 @@ # ChangeLog for warp +## 3.4.9 + +* New flag `include-warp-version` can be disabled to remove dependency on `Paths_warp`. + ## 3.4.8 * Label the internal hack thread on Windows used to make socket diff --git a/warp/warp.cabal b/warp/warp.cabal index a0bf84d40..f6749fc41 100644 --- a/warp/warp.cabal +++ b/warp/warp.cabal @@ -1,6 +1,6 @@ cabal-version: >=1.10 name: warp -version: 3.4.8 +version: 3.4.9 license: MIT license-file: LICENSE maintainer: michael@snoyman.com From a5a22917d05f88fe5aec3c7e409b9bd4115f312a Mon Sep 17 00:00:00 2001 From: Luke Worth Date: Sat, 30 Aug 2025 16:47:54 +1000 Subject: [PATCH 4/6] chore: link ChangeLog to PR --- warp/ChangeLog.md | 1 + 1 file changed, 1 insertion(+) diff --git a/warp/ChangeLog.md b/warp/ChangeLog.md index db9f6f846..801244b07 100644 --- a/warp/ChangeLog.md +++ b/warp/ChangeLog.md @@ -3,6 +3,7 @@ ## 3.4.9 * New flag `include-warp-version` can be disabled to remove dependency on `Paths_warp`. + [#1044](https://github.com/yesodweb/wai/pull/1044) ## 3.4.8 From a25483cce4571a7cfadcc738f683c70bd237b61a Mon Sep 17 00:00:00 2001 From: Luke Worth Date: Mon, 1 Sep 2025 09:13:53 +1000 Subject: [PATCH 5/6] Add default: True for the new flag --- warp/warp.cabal | 1 + 1 file changed, 1 insertion(+) diff --git a/warp/warp.cabal b/warp/warp.cabal index f6749fc41..063ad6147 100644 --- a/warp/warp.cabal +++ b/warp/warp.cabal @@ -39,6 +39,7 @@ flag include-warp-version Exposes the version in Network.Wai.Handler.Warp.warpVersion. This can cause a large runtime dependency closure due to depending on files shipped with GHC itself. + default: True manual: True flag warp-debug From ebe3753540b44f9cf781c742d1a890bd788f6b56 Mon Sep 17 00:00:00 2001 From: Luke Worth Date: Mon, 1 Sep 2025 10:45:11 +1000 Subject: [PATCH 6/6] chore: explicitly mention nix in flag description --- warp/warp.cabal | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/warp/warp.cabal b/warp/warp.cabal index 063ad6147..45f69e7cf 100644 --- a/warp/warp.cabal +++ b/warp/warp.cabal @@ -37,8 +37,10 @@ flag allow-sendfilefd flag include-warp-version description: Exposes the version in Network.Wai.Handler.Warp.warpVersion. - This can cause a large runtime dependency closure due to depending on - files shipped with GHC itself. + This adds a dependency on Paths_warp so application binaries may + reference subpaths of GHC. For nix users this may result in binaries + with a large transitive runtime dependency closure that includes GHC + itself. default: True manual: True