diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,3 +1,7 @@
+## 3.0.19
+
+* Add a new function basicAuth', which passes request to the CheckCreds argument.
+
 ## 3.0.18
 
 * ForceSSL: preserve port number when redirecting to https. [#582](https://github.com/yesodweb/wai/pull/582)
diff --git a/Network/Wai/Middleware/ForceSSL.hs b/Network/Wai/Middleware/ForceSSL.hs
--- a/Network/Wai/Middleware/ForceSSL.hs
+++ b/Network/Wai/Middleware/ForceSSL.hs
@@ -17,8 +17,6 @@
 import Data.Monoid ((<>))
 import Network.HTTP.Types (hLocation, methodGet, status301, status307)
 
-import Data.Word8 (_colon)
-
 -- | For requests that don't appear secure, redirect to https
 --
 -- Since 3.0.7
diff --git a/Network/Wai/Middleware/HttpAuth.hs b/Network/Wai/Middleware/HttpAuth.hs
--- a/Network/Wai/Middleware/HttpAuth.hs
+++ b/Network/Wai/Middleware/HttpAuth.hs
@@ -5,6 +5,7 @@
 module Network.Wai.Middleware.HttpAuth
     ( -- * Middleware
       basicAuth
+    , basicAuth'
     , CheckCreds
     , AuthSettings
     , authRealm
@@ -36,11 +37,19 @@
 --
 -- > basicAuth (\u p -> return $ u == "michael" && p == "mypass") "My Realm"
 --
--- Since 1.3.4
+-- @since 1.3.4
 basicAuth :: CheckCreds
           -> AuthSettings
           -> Middleware
-basicAuth checkCreds AuthSettings {..} app req sendResponse = do
+basicAuth checkCreds = basicAuth' (\_ -> checkCreds)
+
+-- | Like 'basicAuth', but also passes a request to the authentication function.
+--
+-- @since 3.0.19
+basicAuth' :: (Request -> CheckCreds)
+           -> AuthSettings
+           -> Middleware
+basicAuth' checkCreds AuthSettings {..} app req sendResponse = do
     isProtected <- authIsProtected req
     allowed <- if isProtected then check else return True
     if allowed
@@ -51,8 +60,7 @@
         case (lookup hAuthorization $ requestHeaders req)
              >>= extractBasicAuth of
             Nothing -> return False
-            Just (username, password) -> checkCreds username password
-
+            Just (username, password) -> checkCreds req username password
 
 -- | Basic authentication settings. This value is an instance of
 -- @IsString@, so the recommended approach to create a value is to
@@ -61,23 +69,23 @@
 --
 -- > "My Realm" { authIsProtected = someFunc } :: AuthSettings
 --
--- Since 1.3.4
+-- @since 1.3.4
 data AuthSettings = AuthSettings
     { authRealm :: !ByteString
     -- ^
     --
-    -- Since 1.3.4
+    -- @since 1.3.4
     , authOnNoAuth :: !(ByteString -> Application)
     -- ^ Takes the realm and returns an appropriate 401 response when
     -- authentication is not provided.
     --
-    -- Since 1.3.4
+    -- @since 1.3.4
     , authIsProtected :: !(Request -> IO Bool)
     -- ^ Determine if access to the requested resource is restricted.
     --
     -- Default: always returns @True@.
     --
-    -- Since 1.3.4
+    -- @since 1.3.4
     }
 
 instance IsString AuthSettings where
@@ -99,7 +107,7 @@
 -- | Extract basic authentication data from usually __Authorization__
 -- header value. Returns username and password
 --
--- Since 3.0.5
+-- @since 3.0.5
 extractBasicAuth :: ByteString -> Maybe (ByteString, ByteString)
 extractBasicAuth bs =
     let (x, y) = S.break isSpace bs
@@ -115,7 +123,7 @@
 -- | Extract bearer authentication data from __Authorization__ header
 -- value. Returns bearer token
 --
--- Since 3.0.5
+-- @since 3.0.5
 extractBearerAuth :: ByteString -> Maybe ByteString
 extractBearerAuth bs =
     let (x, y) = S.break isSpace bs
diff --git a/Network/Wai/Parse.hs b/Network/Wai/Parse.hs
--- a/Network/Wai/Parse.hs
+++ b/Network/Wai/Parse.hs
@@ -184,7 +184,7 @@
 clearMaxRequestNumFiles :: ParseRequestBodyOptions -> ParseRequestBodyOptions
 clearMaxRequestNumFiles p = p { prboMaxNumFiles=Nothing }
 
--- | Set the maximum filesize per file.
+-- | Set the maximum filesize per file (in bytes).
 --
 -- @since 3.0.16.0
 setMaxRequestFileSize :: Int64 -> ParseRequestBodyOptions -> ParseRequestBodyOptions
@@ -320,7 +320,7 @@
 -- | Parse a content type value, turning a single @ByteString@ into the actual
 -- content type and a list of pairs of attributes.
 --
--- Since 1.3.2
+-- @since 1.3.2
 parseContentType :: S.ByteString -> (S.ByteString, [(S.ByteString, S.ByteString)])
 parseContentType a = do
     let (ctype, b) = S.break (== semicolon) a
@@ -346,7 +346,7 @@
 -- Note: This function does not limit the memory it allocates.
 -- When dealing with untrusted data (as is usually the case when
 -- receiving input from the internet), it is recommended to
--- use the parseRequestBodyEx function instead.
+-- use the 'parseRequestBodyEx' function instead.
 parseRequestBody :: BackEnd y
                  -> Request
                  -> IO ([Param], [File y])
diff --git a/wai-extra.cabal b/wai-extra.cabal
--- a/wai-extra.cabal
+++ b/wai-extra.cabal
@@ -1,5 +1,5 @@
 Name:                wai-extra
-Version:             3.0.18
+Version:             3.0.19
 Synopsis:            Provides some basic WAI handlers and middleware.
 description:
   Provides basic WAI handler and middleware functionality:
