diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,3 +1,7 @@
+## 3.0.1
+
+* Improved connection close logic
+
 ## 3.0.0.9
 
 * Clean up stream resources when websockets completes [#549](https://github.com/yesodweb/wai/pull/549)
diff --git a/Network/Wai/Handler/WebSockets.hs b/Network/Wai/Handler/WebSockets.hs
--- a/Network/Wai/Handler/WebSockets.hs
+++ b/Network/Wai/Handler/WebSockets.hs
@@ -7,7 +7,7 @@
     , runWebSockets
     ) where
 
-import              Control.Exception               (bracket)
+import              Control.Exception               (bracket, tryJust)
 import              Data.ByteString                 (ByteString)
 import qualified    Data.ByteString.Char8           as BC
 import qualified    Data.ByteString.Lazy            as BL
@@ -95,8 +95,12 @@
               -> IO ByteString
               -> (ByteString -> IO ())
               -> IO a
-runWebSockets opts req app src sink = bracket mkStream WS.close (app . pc)
+runWebSockets opts req app src sink = bracket mkStream ensureClose (app . pc)
   where
+    ensureClose = tryJust onConnectionException . WS.close
+    onConnectionException :: WS.ConnectionException -> Maybe ()
+    onConnectionException WS.ConnectionClosed = Just ()
+    onConnectionException _                   = Nothing
     mkStream =
         WS.makeStream
             (do
diff --git a/wai-websockets.cabal b/wai-websockets.cabal
--- a/wai-websockets.cabal
+++ b/wai-websockets.cabal
@@ -1,5 +1,5 @@
 Name:                wai-websockets
-Version:             3.0.0.9
+Version:             3.0.1
 Synopsis:            Provide a bridge between WAI and the websockets package.
 License:             MIT
 License-file:        LICENSE
