
A simple, can be done immediately would be to put a note in the Haddocks for
sendFile: "warning, does not set the content-length http header which will
break some proxies such as amazons ELB. if you are using a proxy, please
set the header manually.
Does hFileSize in System.IO not work on windows? I'm not at the office now,
but IIRC, this is how we fixed it:
sendFileWithLength ct fp = do
hSize <- liftIO $ withFile fp ReadMode hFileSize -- All System.IO
setHeader "Content-Length" (fromString $ show hSize)
sendFile ct fp
i think this could be combined into one line if you wanna be slick, but dont
have GHC here to check..
sendFileWithLength ct fp =
(liftIO $ withFile fp ReadMode hFileSize) >>= setHeader "Content-Length"
. (fromString . show) >> sendFile ct fp
I know i'm kind of abusing fromString here, but it was 2 am and we were
tired..
On Wed, Jun 15, 2011 at 3:10 AM, David Pollak wrote: On Tue, Jun 14, 2011 at 12:06 PM, Michael Snoyman On Tue, Jun 14, 2011 at 9:55 PM, David Pollak
On Tue, Jun 14, 2011 at 11:50 AM, Michael Snoyman I think the reason we didn't include the header is because, when I
wrote it, I didn't know of a cross-platform way to get file sizes. Now
that I know about unix-compat, this seems like a reasonable thing to
add. Anyone know a reason we *shouldn't* do this? In Lift, we do not automatically populate the Content-Length for generic
BLOB responses because if the response is streaming, then we have to
strictly evaluate the stream to determine the length. For returning large items (e.g., a 2 GB AVI), this can cause issues. We break the Response
types into "In Memory" which are strict and we include the
Content-Length
header, but for responses that are not strict, it's up to the coder. My 2 cents. Nubis was referring specifically to sending files. Yesod has a similar
breakdown where some datatypes (strict ByteStrings for instance) have
a content-length attached, while others (lazy ByteStrings) do not. We
achieve this via the optional Int argument in the ContentBuilder
constructor[1]. Various instances of ToContent simply handle this
differently. In the case of files, we would either use the length specified by the
FilePart parameter, or simply get the file size from the file system. Sorry for the newbie mistake and thanks for correction me! Rock on. Michael [1]
http://hackage.haskell.org/packages/archive/yesod-core/0.8.2/doc/html/Yesod-... Michael On Tue, Jun 14, 2011 at 8:16 PM, Nubis Hi guys,
Just wanted to give you a heads up that yesod's sendFile is not the
Content-Length header, which 'breaks' some proxies and load
balancers.
(in
our case, amazon elastic load balancer).
I don't know if that's by design, I'm not 100% sure but not setting header would be only useful for 'long pooling' of binary files for
doing
some sort of hackish http streaming, which I don't think is yesod's
purpose
anyways :)
A workaround is setting the Content-Length header before calling
sendFile, I
guess it may be something easy to add, I was going to propose a patch
that
just wraps the current implementation in a do block that sets the
header,
but then I noticed a number of optimizations being made that hint setting
the
there should be a 'better' way. cheers!
----nubis :) _______________________________________________
web-devel mailing list
web-devel@haskell.org
http://www.haskell.org/mailman/listinfo/web-devel _______________________________________________
web-devel mailing list
web-devel@haskell.org
http://www.haskell.org/mailman/listinfo/web-devel --
Lift, the simply functional web framework http://liftweb.net
Simply Lift http://simply.liftweb.net
Follow me: http://twitter.com/dpp
Blog: http://goodstuff.im --
Lift, the simply functional web framework http://liftweb.net
Simply Lift http://simply.liftweb.net
Follow me: http://twitter.com/dpp
Blog: http://goodstuff.im _______________________________________________
web-devel mailing list
web-devel@haskell.org
http://www.haskell.org/mailman/listinfo/web-devel