[web-devel] wai 0.4.0 uprade for warp 0.8.0 breaks hoogle

Mark Wright markwright at internode.on.net
Wed Apr 20 16:38:04 CEST 2011


Hi,

I try to bump warp to 0.8.0 in the gentoo haskell overlay, which
requires wai 0.4.0, this breaks hoogle.  This is my incomplete
and failed attempt to bump wai to 0.4.0 in hoogle:

--- hoogle-4.2.1-orig/hoogle.cabal	2011-01-26 22:16:52.000000000 +1100
+++ hoogle-4.2.1/hoogle.cabal	2011-04-20 23:59:18.021501043 +1000
@@ -35,7 +35,7 @@
         array, bytestring, containers, directory, filepath, process, random,
         safe,
         binary,
-        parsec == 2.1.*,
+        parsec >= 2.1,
         transformers == 0.2.*,
         uniplate == 1.6.*,
         haskell-src-exts >= 1.9 && < 1.11
@@ -107,9 +107,11 @@
         cmdargs == 0.6.*,
         tagsoup >= 0.11 && < 0.13,
         enumerator == 0.4.*,
-        blaze-builder == 0.2.*,
-        wai == 0.3.0,
-        warp == 0.3.0,
+        blaze-builder >= 0.2 && < 0.4,
+        http-types >= 0.6 && < 0.7,
+        case-insensitive >= 0.2 && < 0.3,
+        wai >= 0.4.0 && < 0.5.0,
+        warp >= 0.4.0 && < 0.5.0,
         Cabal >= 1.8 && < 1.11
 
     other-modules:
--- hoogle-4.2.1-orig/src/General/Web.hs	2011-01-26 22:16:52.000000000 +1100
+++ hoogle-4.2.1/src/General/Web.hs	2011-04-21 00:03:49.840705869 +1000
@@ -16,6 +16,8 @@
 import General.System
 import General.Base
 import Network.Wai
+import Network.HTTP.Types
+import Data.CaseInsensitive(original)
 import Blaze.ByteString.Builder(toLazyByteString)
 import Data.Enumerator.List(consume)
 import qualified Data.ByteString.Lazy.Char8 as LBS
@@ -23,13 +25,15 @@
 
 type Args = [(String, String)]
 
+type ResponseHeader = Header
 
 ---------------------------------------------------------------------
 -- WAI STUFF
 
-statusOK = status200
-hdrContentType = fromString "Content-Type" :: ResponseHeader
-hdrCacheControl = fromString "Cache-Control" :: ResponseHeader
+hdrContentType :: Ascii -> Header
+hdrContentType = headerContentType
+hdrCacheControl :: Ascii -> Header
+hdrCacheControl = headerCacheControl
 
 responseOK = responseLBS statusOK
 responseBadRequest x = responseLBS status400 [] $ fromString $ "Bad request: " ++ x
@@ -125,7 +129,7 @@
 cgiResponse r = do
     (status,headers,body) <- responseFlatten r
     LBS.putStr $ LBS.unlines $
-        [LBS.fromChunks [ciOriginal a, fromString ": ", b] | (a,b) <- headers] ++
+        [LBS.fromChunks [original a, fromString ": ", b] | (a,b) <- headers] ++
         [fromString "",body]
 
 
--- hoogle-4.2.1-orig/src/Web/Response.hs	2011-01-26 22:16:52.000000000 +1100
+++ hoogle-4.2.1/src/Web/Response.hs	2011-04-20 23:06:21.128254027 +1000
@@ -15,6 +15,7 @@
 import Data.Time.Format
 import System.Locale
 import Network.Wai
+import Network.HTTP.Types(headerContentType)
 import System.IO.Unsafe(unsafeInterleaveIO)
 
 
@@ -24,7 +25,7 @@
 response :: FilePath -> CmdLine -> IO Response
 response resources q = do
     logMessage q
-    let response x ys z = responseOK ((hdrContentType,fromString x) : ys) (fromString z)
+    let response x ys z = responseOK ((headerContentType $ fromString x) : ys) (fromString z)
 
     dbs <- unsafeInterleaveIO $ case queryParsed q of
         Left _ -> return mempty
--- hoogle-4.2.1-orig/src/Web/Server.hs	2011-01-26 22:16:52.000000000 +1100
+++ hoogle-4.2.1/src/Web/Server.hs	2011-04-20 23:55:34.234388414 +1000
@@ -15,19 +15,18 @@
 import qualified Data.ByteString.Lazy.Char8 as LBS
 import qualified Data.ByteString.Char8 as BS
 
-
 server :: CmdLine -> IO ()
 server q at Server{..} = do
     v <- newMVar ()
     putStrLn $ "Starting Hoogle Server on port " ++ show port
     run port $ \r -> liftIO $ do
-        withMVar v $ const $ putStrLn $ bsUnpack (pathInfo r) ++ bsUnpack (queryString r)
+        withMVar v $ const $ putStrLn $ bsUnpack (rawPathInfo r) ++ bsUnpack (rawQueryString r)
         talk q r
 
 
 -- FIXME: Avoid all the conversions to/from LBS
 talk :: CmdLine -> Request -> IO Response
-talk Server{..} Request{pathInfo=path_, queryString=query_}
+talk Server{..} Request{rawPathInfo=path_, rawQueryString=query_}
     | path `elem` ["/","/hoogle"] = do
         let args = parseHttpQueryArgs $ drop 1 query
         cmd <- cmdLineWeb args

The compiler error is:

[61 of 72] Compiling Web.Server       ( src/Web/Server.hs, dist/build/hoogle/hoogle-tmp/Web/Server.o )

src/Web/Server.hs:46:14:
    Couldn't match expected type `Response'
                with actual type `Maybe FilePart -> Response'
    In the return type of a call of `ResponseFile'
    In the expression: ResponseFile statusOK hdr file
    In the second argument of `($)', namely
      `if not b then
           responseNotFound file
       else
           ResponseFile statusOK hdr file'

I was wondering how to convert from Maybe FilePart to Response,
this looks tricky.

Thanks, Mark

PS: I have built all of yesod 0.8.0 for gentoo, but we would need to somehow fix hoogle
in order for me to apply these changes to the gentoo haskell overlay.



More information about the web-devel mailing list