[Haskell-cafe] Contributing to http-conduit

Michael Snoyman michael at snoyman.com
Sat Jan 21 17:56:30 CET 2012


Hi Myles,

These sound like two solid features, and I'd be happy to merge in code to
support it. Some comments below.

On Sat, Jan 21, 2012 at 8:38 AM, Myles C. Maxfield <myles.maxfield at gmail.com
> wrote:

> To: Michael Snoyman, author and maintainer of http-conduit
> CC: haskell-cafe
>
> Hello!
>
> I am interested in contributing to the http-conduit library. I've been
> using it for a little while and reading through its source, but have felt
> that it could be improved with two features:
>
>    - Allowing the caller to know the final URL that ultimately resulted
>    in the HTTP Source. Because httpRaw is not exported, the caller can't even
>    re-implement the redirect-following code themselves. Ideally, the caller
>    would be able to know not only the final URL, but also the entire chain of
>    URLs that led to the final request. I was thinking that it would be even
>    cooler if the caller could be notified of these redirects as they happen in
>    another thread. There are a couple ways to implement this that I have been
>    thinking about:
>       - A straightforward way would be to add a [W.Ascii] to the type of
>       Response, and getResponse can fill in this extra field. getResponse already
>       knows about the Request so it can tell if the response should be gunzipped.
>
> What would be in the [W.Ascii], a list of all paths redirected to? Also,
I'm not sure what gunzipping has to do with here, can you clarify?


>
>    - It would be nice for the caller to be able to know in real time what
>       URLs the request is being redirected to. A possible way to do this would be
>       for the 'http' function to take an extra argument of type (Maybe
>       (Control.Concurrent.Chan W.Ascii)) which httpRaw can push URLs into. If the
>       caller doesn't want to use this variable, they can simply pass Nothing.
>       Otherwise, the caller can create an IO thread which reads the Chan until
>       some termination condition is met (Perhaps this will change the type of the
>       extra argument to (Maybe (Chan (Maybe W.Ascii)))). I like this solution,
>       though I can see how it could be considered too heavyweight.
>
>
I do think it's too heavyweight. I think if people really want lower-level
control of the redirects, they should turn off automatic redirect and allow
3xx responses.

>
>    - Making the redirection aware of cookies. There are redirects around
>    the web where the first URL returns a Set-Cookie header and a 3xx code
>    which redirects to another site that expects the cookie that the first HTTP
>    transaction set. I propose to add an (IORef to a Data.Set of Cookies) to
>    the Manager datatype, letting the Manager act as a cookie store as well as
>    a repository of available TCP connections. httpRaw could deal with the
>    cookie store. Network.HTTP.Types does not declare a Cookie datatype, so I
>    would probably be adding one. I would probably take it directly from
>    Network.HTTP.Cookie.
>
> Actually, we already have the cookie package for this. I'm not sure if
putting the cookie store in the manager is necessarily the right approach,
since I can imagine wanting to have separate sessions while reusing the
same connections. A different approach could be adding a list of Cookies to
both the Request and Response.

>
>
> I'd be happy to do both of these things, but I'm hoping for your input on
> how to go about this endeavor. Are these features even good to be pursuing?
> Should I be going about this entirely differently?
>
> Thanks,
> Myles C. Maxfield
>
> P.S. I'm curious about the lack of Network.URI throughout
> Network.HTTP.Conduit. Is there a particular design decision that led you to
> use raw ascii strings?
>

Because there are plenty of URIs that are valid that we don't handle at
all, e.g., ftp.

Michael
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/haskell-cafe/attachments/20120121/751ea8f8/attachment.htm>


More information about the Haskell-Cafe mailing list