handle NGX_AGAIN properly

Yichun Zhang (agentzh) agentzh at gmail.com
Mon Jul 15 04:57:33 UTC 2013


On Sun, Jul 14, 2013 at 8:43 PM, Julien Zefi wrote:
> Sorry by bother you again but i still cannot figure out how some internals
> are not working as i expect. I have take in count your suggestions and wrote
> a new test case (file attached).

1. You should simply call  ngx_http_output_filter(r, NULL); in your
r->write_event_handler, but you set r->write_event_handler to
ngx_http_test_stream_handler which always emits brand new data. I'm
guessing you don't really understand how the ngx_http_writer and
ngx_http_set_write_handler functions are implemented in the Nginx
core. Look harder.

2. You should not set r->header_only = 1 in your case because you're
actually sending out the response body. Ensure that you know how a
flag works before you start using it.

3. Another obvious mistake is that you incorrectly perform


without decrementing it by calling ngx_http_finalize_request, which
will certainly lead to request hang. Ensure that you understand this
flag before using it.

> The test case writes 12.3KB of data every 1ms, at some point it will raise
> NGX_AGAIN but from there is not recovering, it keeps in the same state
> forever, do you see any specific problem when handling the exception ?

This is trivial to implement by writing some Lua code using ngx_lua module:

    location /t {
        content_by_lua '
           local message = "..."
           for i = 1, 100 do

Maybe you can just use ngx_lua for your purposes without all the pain
of understanding the nginx internals (you seem to lack a lot of
knowledge here). If you insist in writing your own nginx C module,
then just check out how ngx_lua implements all the APIs demonstrated
in the example above. You can also check out the official
documentation of ngx_lua:


Best regards,

More information about the nginx-devel mailing list