darcs patch: Fallback onto simpleHTTP when Network.Browser fails

Stephen Hicks sdh33 at cornell.edu
Sat Oct 11 14:51:34 EDT 2008

On Sat, Oct 11, 2008 at 1:51 PM, Duncan Coutts
<duncan.coutts at worc.ox.ac.uk> wrote:
> Thanks for looking into this Stephen. Do you have the details on the bug
> in Network.Browser? We can get that fixed. The current maintainer is
> happy for us to fix stuff if it's clear what needs to be done. I'd much
> rather do that than switch to the simpleHTTP which does not support
> redirects or proxies, both of which we need.

I'll forward the email I sent to Bjorn.  The patch I submitted to
cabal install still attempts to use the redirects and proxies - it
only changes behavior in the case of failure.  I couldn't make heads
or tails of the Browser module, other than the fact that it doesn't
seem to work for me.

---------- Forwarded message ----------
From: Stephen Hicks <sdh33 at cornell.edu>
Date: Sat, Oct 11, 2008 at 11:40 AM
Subject: Bug with Network.Browser
To: bjorn at bringert.net


I've been experiencing problems with cabal update - particularly that
whenever I'm behind NAT, I always get the error
 recv: resource vanished (Connection reset by peer)

I tracked this bug down to the use of (browse . request) in Cabal's
source.  Replacing it with Network.HTTP.simpleHTTP (with appropriate
transformations to the output) fixes the problem.  But this sounds to
me like a bug in Network.Browser, so I'm reporting it to you.

I'm attaching at the bottom of this message a simple example.  Here's
the output I get from behind a NAT router:

simpleHTTP: success
GET http://www.google.com/ HTTP/1.1

Creating new connection to www.google.com
browser: failure: recv: resource vanished (Connection reset by peer)

The same error arises from the example found on
though I didn't fully understand it, so I constructed my own example.

steve hicks
sdh33 at cornell.edu

import Network.URI
import Network.HTTP
import Network.Browser
import Data.Maybe (fromJust)

req = Request{ rqURI = fromJust $ parseURI "http://www.google.com/",
              rqMethod = GET,
              rqHeaders = [],
              rqBody = "" }

main1 = simpleHTTP req

main2 = browse $ request req

try s f = catch (f >>= (\x -> seq x $ putStrLn $ s++": success"))
               (\e -> putStrLn $ s++": failure: "++show e)

main = try "simpleHTTP" main1 >> try "browser" main2
===END CODE===

More information about the cabal-devel mailing list