[Haskell-cafe] [web-devel] http-enumerator: redirects, streaming and keep-alive
aslatter at gmail.com
Wed Feb 2 21:30:41 CET 2011
On Wed, Feb 2, 2011 at 2:28 PM, Michael Snoyman <michael at snoyman.com> wrote:
> On Wed, Feb 2, 2011 at 10:15 PM, Felipe Almeida Lessa
> <felipe.lessa at gmail.com> wrote:
>> On Wed, Feb 2, 2011 at 11:57 AM, Michael Snoyman <michael at snoyman.com> wrote:
>>> As far as keep-alive goes, I still need to do a bit more research, but
>>> my basic idea (with credit to Bryan O'Sullivan):
>>> * http (and family) will all take an extra argument, Maybe Manager.
>>> * Manager will be an abstract type that will keep an MVar (Map (Host,
>>> Port, IsSecure) Socket).
>>> * If http is provided with a Manager, then it uses the Socket
>>> available in the Manager. If none is available, it creates a new
>>> Socket and places it in the Manager.
>>> * If http is *not* provided with a Manager, then it creates a new
>>> socket and closes it before returning.
>>> * There will be a newManager :: IO Manager, and a closeManager ::
>>> Manager -> IO (), which closes all Sockets in the Manager and empties
>>> out the inner Map.
>> How about concurrent use of Manager? Should we do
>> do m <- newManager
>> forM xs $ forkIO $ doSomething m
>> forM xs $ forkIO $ do
>> m <- newManager
>> doSomething m
>> While B) should work with any sane Manager implementation, it is not
>> optimal. If all your connections are to the same host, than both
>> approaches are the same. But if access hosts O and P, for example,
>> than it is possible that Manager m1 has an open connection to O, but
>> you try connect to O using another Manager m2. That means that
>> ideally we should support approach A) as well. However, to support A
>> a simple Map inside an MVar isn't sufficient.
> Good point: it should be a MVar (Map HostInfo (MVar Socket)) I think*
Or you could remove the socket from the map while it's in use.
More information about the Haskell-Cafe