On Tue, Aug 7, 2012 at 1:28 AM, Felix Halim <[email protected]> wrote:
> I am using (the updated) Ryan Dahl's simple webserver:
>
> https://gist.github.com/1249783
>
> I modify the webserver.c so that instead of responding with a simple
> "hello world", it send a large response about 500KB.
>
> Then these steps below will cause it to silently crash (it just quits
> with error code $? = 141):
> 1. Type http://localhost:8000/hi  to your Chrome browser omnibar.
> 2. Press enter then press escape immediately. This will cause
> premature connection termination in the middle of receiving the
> response (it will take several second to receive the whole response).
>
> However, if I do this in node.js, it's fine. So, I guess this is not a
> bug in libuv.
>
> So, my question are: what causes the crash? and how to send large
> response in libuv correctly so that even when the client terminates
> the connection early, it doesn't silently crash?
>
> Here are my modification to the after_write(), and
> on_headers_complete() to give large dynamic response:
>
>
> void after_write(uv_write_t* req, int status) {
>   CHECK(status, "write");
>   free(req->data);
>   uv_close((uv_handle_t*)req->handle, on_close);
> }
>
> int on_headers_complete(http_parser* parser) {
>   client_t* client = (client_t*) parser->data;
>
>   LOGF("[ %5d ] http message parsed", client->request_num);
>
>   int len = 0, i, j, sz = 50 * 50000;
>   char *s = malloc(sizeof(char) * sz);
>   for (i=0; i<50000; i++){
>     int c = sprintf(s+len, "hello%d", i);
>     len += c;
>     assert(len + 1000 < sz);
>   }
>   client->write_req.data = s;
>   resbuf.base = s;
>   resbuf.len = len;
>
>   uv_write(
>       &client->write_req,
>       (uv_stream_t*)&client->handle,
>       &resbuf,
>       1,
>       after_write);
>
>   return 1;
> }


I sent the above issue to nodejs-dev groups and it doesn't show up in
the googlegroups:

https://groups.google.com/forum/?fromgroups#!forum/nodejs-dev

So, I reposted it again here instead (is nodejs-dev a closed group?).


Additional finding:

Apparently if I send a response with at most 49188 bytes, it is working fine.
The silent crash is only for responses larger than that.

Should I use multiple uv_write for large response?

How node.js writes large response internally?


Felix Halim

-- 
Job Board: http://jobs.nodejs.org/
Posting guidelines: 
https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
You received this message because you are subscribed to the Google
Groups "nodejs" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/nodejs?hl=en?hl=en

Reply via email to