diff --git a/Network/Wai/Handler/Warp.hs b/Network/Wai/Handler/Warp.hs
--- a/Network/Wai/Handler/Warp.hs
+++ b/Network/Wai/Handler/Warp.hs
@@ -32,6 +32,8 @@
     , settingsPort
     , settingsHost
     , settingsOnException
+    , settingsOnOpen
+    , settingsOnClose
     , settingsTimeout
     , settingsIntercept
     , settingsManager
@@ -76,7 +78,7 @@
     , Exception, SomeException
     , fromException, AsyncException (ThreadKilled)
     , try
-#if GLASGOW_HASKELL >= 721
+#if __GLASGOW_HASKELL__ >= 702
     , allowInterrupt
 #else
     , unblock
@@ -134,7 +136,7 @@
 warpVersion :: String
 warpVersion = showVersion Paths_warp.version
 
-#if GLASGOW_HASKELL < 721
+#if __GLASGOW_HASKELL__ < 702
 allowInterrupt :: IO ()
 allowInterrupt = unblock $ return ()
 #endif
@@ -219,6 +221,8 @@
 runSettingsConnection set getConn app = do
     let onE = settingsOnException set
         port = settingsPort set
+        onOpen = settingsOnOpen set
+        onClose = settingsOnClose set
     tm <- maybe (T.initialize $ settingsTimeout set * 1000000) return
         $ settingsManager set
     mask $ \restore -> forever $ do
@@ -226,9 +230,10 @@
         (conn, addr) <- getConn
         void $ forkIO $ do
             th <- T.registerKillThread tm
-            handle onE $ (do restore $ serveConnection set th port app conn addr
-                             connClose conn >> T.cancel th
-                         ) `onException` (T.cancel th >> connClose conn)
+            handle onE $ (do onOpen
+                             restore $ serveConnection set th port app conn addr
+                             connClose conn >> T.cancel th >> onClose
+                         ) `onException` (T.cancel th >> connClose conn >> onClose)
 
 -- | Contains a @Source@ and a byte count that is still to be read in.
 newtype IsolatedBSSource = IsolatedBSSource (I.IORef (Int, C.Source (ResourceT IO) ByteString))
@@ -694,6 +699,8 @@
     { settingsPort :: Int -- ^ Port to listen on. Default value: 3000
     , settingsHost :: HostPreference -- ^ Default value: HostIPv4
     , settingsOnException :: SomeException -> IO () -- ^ What to do with exceptions thrown by either the application or server. Default: ignore server-generated exceptions (see 'InvalidRequest') and print application-generated applications to stderr.
+    , settingsOnOpen :: IO () -- ^ What to do when a connection is open. Default: do nothing.
+    , settingsOnClose :: IO ()  -- ^ What to do when a connection is close. Default: do nothing.
     , settingsTimeout :: Int -- ^ Timeout value in seconds. Default value: 30
     , settingsIntercept :: Request -> Maybe (C.Source (ResourceT IO) S.ByteString -> Connection -> ResourceT IO ())
     , settingsManager :: Maybe Manager -- ^ Use an existing timeout manager instead of spawning a new one. If used, 'settingsTimeout' is ignored. Default is 'Nothing'
@@ -711,6 +718,8 @@
             Nothing ->
                 when (go' $ fromException e) $
                     hPrint stderr e
+    , settingsOnOpen = return ()
+    , settingsOnClose = return ()
     , settingsTimeout = 30
     , settingsIntercept = const Nothing
     , settingsManager = Nothing
diff --git a/warp.cabal b/warp.cabal
--- a/warp.cabal
+++ b/warp.cabal
@@ -1,5 +1,5 @@
 Name:                warp
-Version:             1.2.1
+Version:             1.2.1.1
 Synopsis:            A fast, light-weight web server for WAI applications.
 License:             MIT
 License-file:        LICENSE
