# Transfer-Encoding: Chunked

**URL:** <https://www.ruby-forum.com/t/transfer-encoding-chunked/129264>\
**Category:** Mongrel\
**Created:** [February 15, 2008, 9:37pm UTC](https://www.ruby-forum.com/t/transfer-encoding-chunked/129264 "2008-02-15T21:37:22Z")\
**Posts on this page:** 11\
**Page:** 1

<div class="post-metadata">

**Author:** ![Zachary\_R](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/z/a9a28c/32.png) [@Zachary\_R](https://www.ruby-forum.com/u/Zachary_R)\
**Post date:** [February 15, 2008, 9:37pm UTC](https://www.ruby-forum.com/t/transfer-encoding-chunked/129264/1 "2008-02-15T21:37:22Z")

</div>

I’m working with someone who is having issues with a Transfer-  
Encoding: Chunked upload. With out a content-length set in the  
request, everything is treating the content length as 0 and the file  
is more or less getting sent to the bit bucket. Does anyone have any  
experience with this kind of issue? We started proxying with  
nginx(returned a HTTP Error 411), then we tried to directly expose a  
mongrel and ended up getting strange results, and errors in the  
mongrel logs. The client is uploading with a mobile phone using J2ME.

Zachary R.

---

<div class="post-metadata">

**Author:** ![Zachary\_R](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/z/a9a28c/32.png) [@Zachary\_R](https://www.ruby-forum.com/u/Zachary_R)\
**Post date:** [February 16, 2008, 12:54am UTC](https://www.ruby-forum.com/t/transfer-encoding-chunked/129264/2 "2008-02-16T00:54:41Z")

</div>

> With out a content-length set in the  
> request, everything is treating the content length as 0 and the file  
> is more or less getting sent to the bit bucket.

Is the content length header really not getting set? Mongrel  
automatically sets this. If you do something like while writing the  
response code. You might have to overload mongrel’s  
HttpResponse#send\_status method to explicitly not send this header.

I think [http://merb.devjavu.com/ticket/121](http://merb.devjavu.com/ticket/121) might have some useful hints  
too.

ry

---

<div class="post-metadata">

**Author:** ![Zachary\_R](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/z/a9a28c/32.png) [@Zachary\_R](https://www.ruby-forum.com/u/Zachary_R)\
**Post date:** [February 16, 2008, 5:40am UTC](https://www.ruby-forum.com/t/transfer-encoding-chunked/129264/3 "2008-02-16T05:40:08Z")

</div>

Looks like mongrel can’t handle chunked posts (see  
[http://mongrel.rubyforge.org/svn/trunk/lib/mongrel/http\_request.rb](http://mongrel.rubyforge.org/svn/trunk/lib/mongrel/http_request.rb)  
line 29). You’ll need to put another web server (other than nginx) in  
front of it to handle this, or you could file a bug in the mongrel  
tracker to get them to add this support (or you could code it up  
yourself :).

---

<div class="post-metadata">

**Author:** ![Zachary\_R](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/z/a9a28c/32.png) [@Zachary\_R](https://www.ruby-forum.com/u/Zachary_R)\
**Post date:** [February 18, 2008, 1:40pm UTC](https://www.ruby-forum.com/t/transfer-encoding-chunked/129264/4 "2008-02-18T13:40:18Z")

</div>

The upload is coming from a mobile device with J2ME, and it does this  
by default with anything over 2K, and apparently there’s no way to  
turn it off.

On Feb 17, 2008, at 8:18 PM, Zed A. Shaw wrote:

> > mongrel logs. The client is uploading with a mobile phone using
> 
> 1. My recommendation is that you just don’t do this. The value add  
> C) Your handler would detect the CE via the normal headers and such,  
> Zed A. Shaw
> 
> - Hate: [http://savingtheinternetwithhate.com/](http://savingtheinternetwithhate.com/)
> - Good: [http://www.zedshaw.com/](http://www.zedshaw.com/)
> - Evil: [http://yearofevil.com/](http://yearofevil.com/)
> 
> * * *
> 
> Mongrel-users mailing list  
> removed\_email\_address@domain.invalid  
> [http://rubyforge.org/mailman/listinfo/mongrel-users](http://rubyforge.org/mailman/listinfo/mongrel-users)

Zachary R.  
removed\_email\_address@domain.invalid

---

<div class="post-metadata">

**Author:** ![Zachary\_R](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/z/a9a28c/32.png) [@Zachary\_R](https://www.ruby-forum.com/u/Zachary_R)\
**Post date:** [February 17, 2008, 3:23am UTC](https://www.ruby-forum.com/t/transfer-encoding-chunked/129264/5 "2008-02-17T03:23:42Z")

</div>

On Fri, 15 Feb 2008 14:35:04 -0600  
Zachary R. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> I’m working with someone who is having issues with a Transfer-  
> Encoding: Chunked upload. With out a content-length set in the  
> request, everything is treating the content length as 0 and the file  
> is more or less getting sent to the bit bucket. Does anyone have any  
> experience with this kind of issue? We started proxying with  
> nginx(returned a HTTP Error 411), then we tried to directly expose a  
> mongrel and ended up getting strange results, and errors in the  
> mongrel logs. The client is uploading with a mobile phone using J2ME.

Uh, you aren’t allowed to set a Content-Length AND use CE in the same  
request. That would let the two contradict so it’s an RFC violation.  
Actually, WebLogic makes this mistake and we had to school them about  
it until they told us to turn it off. (WebLogic is such a piece of  
shit).

My RFC knowledge on CE is rusty since I banished that shitty part of  
HTTP from my mind when I implemented it in RFuzz, but my thoughts are:

1. CE wasn’t designed for clients to upload, since no browser does it.
2. It’s originally for a server to send periodic parts of a request  
without having to know it’s total final size.
3. Anyone doing a CE as a client is seriously screwing with the RFC and  
really exercising the corners of it for no apparent reason since CE  
isn’t needed by a client (the client knows the size, or better).
4. This puts a burden on the server to process the CE as it comes  
over, which has the same problems as mime boundaries but with a more  
horribly designed part of the RFC.
5. My recommendation is that you just don’t do this. The value add for  
a client (or even modern servers really) is quite minimal.

Now, how you go about implementing it:

A) Read up on how to write a Mongrel handler.  
B) Register it at the front of your web app or create a separate server  
that runs just mongrel (probably your best if you want any kind of  
performance).  
C) Your handler would detect the CE via the normal headers and such,  
and then process the final request body as it comes in for each chunk.  
D) This might involve subclassing the Http processing parts that handle  
the body and doing a bit of other hacking, and it’s seriously fucking  
dumb because after that you’ve gotta process mime boundaries and other  
stuff, which will punish your server heavily.

Enjoy!

–  
Zed A. Shaw

- Hate: [http://savingtheinternetwithhate.com/](http://savingtheinternetwithhate.com/)
- Good: [http://www.zedshaw.com/](http://www.zedshaw.com/)
- Evil: [http://yearofevil.com/](http://yearofevil.com/)

---

<div class="post-metadata">

**Author:** ![Zachary\_R](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/z/a9a28c/32.png) [@Zachary\_R](https://www.ruby-forum.com/u/Zachary_R)\
**Post date:** [February 18, 2008, 9:45pm UTC](https://www.ruby-forum.com/t/transfer-encoding-chunked/129264/6 "2008-02-18T21:45:32Z")

</div>

I implemented a chunked transfer encoding to handle ESI in pages… Each  
fragment is sent as a chunk… Since, I can’t determine ahead of time  
what  
the content-length would be as the individual ESI fragments are of  
unknown  
length until the page is assembled…  
I can see where a mobile device might want to do this because of memory  
constraints, however… if the device has what’s it’s sending stored  
somewhere one would hope it can measure that something’s length, ahead  
of  
time - writing the Content-length first… Then connect the write end of  
the  
socket to the read end of the file… and away it goes never storing  
more  
then the OS decides to keep in memory…

This page might be helpful…

> **[HTTP Made Really Easy](https://www.jmarshall.com/easy/http/)**
>
> Tutorial: Quickly learn how to use HTTP in your network 
> applications, if you know basic sockets programming. Covers 
> HTTP 1.0 and HTTP 1.1. Includes sample clients in Perl.

---

<div class="post-metadata">

**Author:** ![Zachary\_R](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/z/a9a28c/32.png) [@Zachary\_R](https://www.ruby-forum.com/u/Zachary_R)\
**Post date:** [February 16, 2008, 5:46am UTC](https://www.ruby-forum.com/t/transfer-encoding-chunked/129264/7 "2008-02-16T05:46:00Z")

</div>

On Feb 15, 2008 9:53 PM, ry dahl [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> > With out a content-length set in the  
> > request, everything is treating the content length as 0 and the file  
> > is more or less getting sent to the bit bucket.
> 
> I think [http://merb.devjavu.com/ticket/121](http://merb.devjavu.com/ticket/121) might have some useful hints too.

Oh, got lost, there is [merb.devjavu.com](http://merb.devjavu.com) and also [merb.lighthouseapp.com](http://merb.lighthouseapp.com)  
?  
😛

## – Luis L. Multimedia systems

A common mistake that people make when trying to design  
something completely foolproof is to underestimate  
the ingenuity of complete fools.  
Douglas Adams

---

<div class="post-metadata">

**Author:** ![Zachary\_R](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/z/a9a28c/32.png) [@Zachary\_R](https://www.ruby-forum.com/u/Zachary_R)\
**Post date:** [February 19, 2008, 6:09am UTC](https://www.ruby-forum.com/t/transfer-encoding-chunked/129264/8 "2008-02-19T06:09:52Z")

</div>

On Tue, 19 Feb 2008 08:36:43 +0800  
Eden Li [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> Mind posting a patch?
> 
> As an aside, the j2me people seem to think CE requests are part the  
> http 1.1 spec (rfc2616):
> 
> [Oracle Java Technologies | Oracle](http://developers.sun.com/mobility/midp/questions/chunking/)
> 
> and the minimal justification they give is that “interactive  
> applications may not know ahead of time how much data they’re going to  
> send” (paraphrase).

Alright, let’s see the code being used. If this is truly the only way  
to submit a request from a memory constrained device, and I can’t find  
an alternative that’s simpler then I’ll add CE to the Mongrel handler.  
CE is already in the RFuzz handler so it’d be nothing more than putting  
the same code in the Mongrel parser. Of course this will just be an  
exercise and I’ll let the mongrel crew decide if they want it in or not.

And when I say “see the code” I don’t mean a toy version, I mean the  
actual code being used to do the upload that I can work with and test.  
Doesn’t have to be the full app, but enough for me to run in a MIDP  
emulator and try out.

–  
Zed A. Shaw

- Hate: [http://savingtheinternetwithhate.com/](http://savingtheinternetwithhate.com/)
- Good: [http://www.zedshaw.com/](http://www.zedshaw.com/)
- Evil: [http://yearofevil.com/](http://yearofevil.com/)

---

<div class="post-metadata">

**Author:** ![Zachary\_R](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/z/a9a28c/32.png) [@Zachary\_R](https://www.ruby-forum.com/u/Zachary_R)\
**Post date:** [February 20, 2008, 4:04am UTC](https://www.ruby-forum.com/t/transfer-encoding-chunked/129264/9 "2008-02-20T04:04:47Z")

</div>

Zachary, mind posting some of the code you’re using in J2ME? I’ve got  
no dog in this fight.

---

<div class="post-metadata">

**Author:** ![Zachary\_R](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/z/a9a28c/32.png) [@Zachary\_R](https://www.ruby-forum.com/u/Zachary_R)\
**Post date:** [February 19, 2008, 1:37am UTC](https://www.ruby-forum.com/t/transfer-encoding-chunked/129264/10 "2008-02-19T01:37:47Z")

</div>

Mind posting a patch?

As an aside, the j2me people seem to think CE requests are part the  
http 1.1 spec (rfc2616):

[Oracle Java Technologies | Oracle](http://developers.sun.com/mobility/midp/questions/chunking/)

and the minimal justification they give is that “interactive  
applications may not know ahead of time how much data they’re going to  
send” (paraphrase).

---

<div class="post-metadata">

**Author:** ![Zachary\_R](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/z/a9a28c/32.png) [@Zachary\_R](https://www.ruby-forum.com/u/Zachary_R)\
**Post date:** [February 20, 2008, 1:53pm UTC](https://www.ruby-forum.com/t/transfer-encoding-chunked/129264/11 "2008-02-20T13:53:25Z")

</div>

I’ll have to see what I can do since the code isn’t mine.

On Feb 19, 2008, at 9:03 PM, Eden Li wrote:

> > > As an aside, the j2me people seem to think CE requests are part the  
> > > way  
> > > And when I say “see the code” I don’t mean a toy version, I mean the
> > 
> > * * *
> > 
> > Mongrel-users mailing list  
> > removed\_email\_address@domain.invalid  
> > [http://rubyforge.org/mailman/listinfo/mongrel-users](http://rubyforge.org/mailman/listinfo/mongrel-users)

Zachary R.  
removed\_email\_address@domain.invalid
