[web-devel] Raw POST data
Jeremy Hughes
jedahu at gmail.com
Tue May 31 08:42:17 CEST 2011
Hi Michael,
On Tue, May 31, 2011 at 3:11 PM, Michael Snoyman <michael at snoyman.com> wrote:
> Hi Jeremy,
>
> There's an example in the haskell-web-rosetta repo[1] of getting the
> raw content of a request. (Next bit is slightly complicated.) The idea
> is that a Handler is in fact a monad transformer on top of an
> Iteratee. An Iteratee is a streaming data consumer, which allows us to
> parse the request body in constant space. The "consume" function used
> here turns that stream into a (strict) list of bytestrings, i.e.,
> reads them all into memory. The use of lift is to deal with the fact
> that Handler is a monad transformer.
I'm reasonably ok with transformers. The requests in my app run inside
a ReaderT ErrorT stack that uses phantom types to enforce some
security invariants at compile time.
> So the simplest way to read the request body is the one shown in that
> example. But depending on what you want to do, you could also use a
> streaming approach via enumerators and thereby not read the entire
> request body into memory. For example, with JSON, you could use
> aeson[2] and attoparsec-enumerator[3]. But that requires a bit more
> work.
>
> What exactly do you want to do with the raw request body?
Somewhat similar to my previous question to this list: I need to write
a POST/PUT proxy that passes the request body on without parsing it.
Since some of the requests may attach image or video files, a constant
memory solution is needed.
Clearly I need to knuckle down and actually read the Enumerator
documentation. It's a credit to the Yesod API that I haven't needed to
until now :-).
Cheers,
Jeremy
> Michael
>
> [1] https://github.com/snoyberg/haskell-web-rosetta/blob/master/json-request/yesod.hs
> [2] http://hackage.haskell.org/package/aeson
> [3] http://hackage.haskell.org/package/attoparsec-enumerator
>
More information about the web-devel
mailing list