Take a look at the Gerbil std/net/request library, it is probably very close to what you want.
It looks good, but I would prefer to separate the creation of the request object from the making of the request. In other words, I would like for one piece of code to be able to construct a request, then pass it through some other code, and only then issue the request. That could facilitate special handling of redirects, authentication, etc.