
Bjorn, I'm trying to add an HTTP entity retrieval capability to HaXml using simpleHTTP as the basis of a new function, readHTTP [1], that works very similarly to prelude.readFile (except that its argument is a Network.URI value). Function simpleHTTP still leaves a fair amount of result analysis to be done by the calling program. I'm thinking that it might be convenient to provide a simple function, say: hasResponseData :: Response -> Bool that can be used to drive a simple binary decision along the lines of: return $ if hasResponseData response then (Right $ rspBody response) else (Left $ show response) where hasResponseData rsp = case rspCode rsp of (2,_,_) -> True otherwise -> False I'm not sure if I've got the condition right here, but it seems about right. Do you think this would be a reasonable addition to the HTTP module, to make it very easy for a program to issue a simple HTTP GET to retrieve a resource? ... Another thought I wanted to raise with you concerns the URI authority parser that is currently part of the HTTP module. My revised version of URI already does most of what this micro-parser does (apart from not separating the username and password in userinfo). When the revised URI specification (successor to RFC2396) looks stable, I'm planning to update the Network.URI module in the hierarchical libraries. It occurs to me that the added functionality here could mean that module HTTP might be simplified. A copy of the current state of my Network.URI module can be found here: http://www.ninebynine.org/Software/HaskellUtils/Network/URI.hs There is also a test program and a test suite, described here: http://www.ninebynine.org/Software/HaskellUtils/Network/URITestDescriptions.... An earlier, stand-alone, test suite is here: http://www.ninebynine.org/Software/HaskellUtils/Network/URITest.hs #g -- [1] here's a simple readHTTP function I've cooked up... does it look workable?: [[ readHTTP :: URI -> IO String readHTTP uri = withSocketsDo $ do { res <- simpleHTTP (defaultGETRequest uri) ; case res of Left err -> return ("\nError! failed to read "++show uri++": "++show err++"\n") Right rsp -> return $ if hasResponseData rsp then rspBody rsp else show rsp } hasResponseData :: Response -> Bool hasResponseData rsp = case rspCode rsp of (2,_,_) -> True otherwise -> False defaultGETRequest uri = Request { rqURI=uri , rqBody="" , rqHeaders=[ Header HdrContentLength "0" , Header HdrUserAgent "haskell-haxml/0.1" ] , rqMethod=GET } ]] ------------ Graham Klyne For email: http://www.ninebynine.org/#Contact