<html><head><style>body{font-family:Helvetica,Arial;font-size:13px}</style></head><body style="word-wrap:break-word"><div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px;color:rgba(0,0,0,1.0);margin:0px;line-height:auto">Hi!</div><div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px;color:rgba(0,0,0,1.0);margin:0px;line-height:auto"><br></div><div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px;color:rgba(0,0,0,1.0);margin:0px;line-height:auto">I think you can debug your code with gdb, maybe some other modules or filters prevent sending the data.</div> <br> <div id="bloop_sign_1499863615693263104" class="bloop_sign"></div> <br><p class="airmail_on">On 11 July 2017 at 22:57:50, Johan Andersson (<a href="mailto:ng23@firemail.cc">ng23@firemail.cc</a>) wrote:</p> <blockquote type="cite" class="clean_bq"><span><div><div></div><div>Hi Andreas and Zhang,<br><br>Thank you for your hint with the http_echo_module! I read through their <br>code to get a hang of how the event loop and the event handling actually <br>works.<br><br>If I replace the hello_world command in my config files with the <br>echo/echo_flush/echo_sleep commands, everything works as expected.<br><br>If I use my modified hello_world module (code below), I still get a <br>three second pause and then all three "hello world" at once.<br><br>So I do not think that my configuration (which is the default Debian <br>Stretch configuration) is at fault.<br><br>I pasted the whole debug log here: <a href="https://pastebin.com/raw/uwuK4UJB">https://pastebin.com/raw/uwuK4UJB</a><br><br>When I look into the debug log, I see four writev lines corresponding to <br>the initial header and the three "helloworld" outputs.<br><br>So I think the socket gets its data, but perhaps I am missing some magic <br>socket options? Which would be strange, as I cannot see the <br>http_echo_module doing such a thing.<br><br>This is my current code (all error handling omitted -- I will take care <br>of that):<br><br>struct ngx_http_hello_world_ctx<br>{<br>     int counter;<br>     ngx_event_t event;<br>};<br><br>static int numberOfMessages = 3;<br><br>static ngx_int_t ngx_http_hello_world_handler(ngx_http_request_t *r)<br>{<br>     struct ngx_http_hello_world_ctx * ctx = ngx_http_get_module_ctx(r, <br>ngx_http_hello_world_module);<br><br>     if(ctx == NULL)<br>     {<br>         ctx = ngx_pcalloc(r->pool, sizeof(struct <br>ngx_http_hello_world_ctx));<br>         ngx_http_set_ctx(r, ctx, ngx_http_hello_world_module);<br>     }<br><br>     ctx->counter = 0;<br>     ctx->event.data = r;<br>     ctx->event.handler = ngx_http_hello_world_event_handler;<br>     ctx->event.log = r->connection->log;<br><br>     r->headers_out.content_type.len = sizeof("text/html") - 1;<br>     r->headers_out.content_type.data = (u_char *) "text/html";<br>     r->headers_out.status = NGX_HTTP_OK;<br>     ngx_http_send_header(r);<br><br>     r->main->count++; // Increments reference count<br>     ngx_add_timer(&ctx->event, 0);<br><br>     return ngx_http_output_filter(r, NULL);<br>}<br><br>static void ngx_http_hello_world_event_handler(ngx_event_t *ev)<br>{<br>     ngx_http_request_t * r = ev->data;<br>     struct ngx_http_hello_world_ctx * ctx = ngx_http_get_module_ctx(r, <br>ngx_http_hello_world_module);<br><br>     if(ctx->counter < numberOfMessages)<br>     {<br>         ngx_buf_t *b;<br>         ngx_chain_t out;<br><br>         b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));<br><br>         out.buf = b;<br>         out.next = NULL;<br><br>         b->pos = ngx_hello_world;<br>         b->last = ngx_hello_world + sizeof(ngx_hello_world);<br>         b->memory = 1;<br>         b->flush = 1;<br>         b->last_buf = (ctx->counter == numberOfMessages);<br><br>         ngx_http_output_filter(r, &out);<br>         ngx_http_send_special(r, NGX_HTTP_FLUSH);<br><br>         ctx->counter++;<br><br>         if(ctx->counter == numberOfMessages)<br>         {<br>             ctx->counter = 0;<br>             ngx_http_send_special(r, NGX_HTTP_LAST);<br>             ngx_http_finalize_request(r, NGX_OK); // Decrements <br>reference count<br>         }<br>         else<br>         {<br>             ngx_add_timer(&ctx->event, 1000);<br>         }<br>     }<br>}<br><br>Cheers<br>Johan<br><br>On 2017-07-10 04:04, Zhang Chao wrote:<br>> Hello!<br>> <br>> You mustn’t use standard sleep function for it will block Nginx’s<br>> events loop, alternatively, you need to put your write event to a<br>> timer, set the proper handler when the timer expires.<br>> BTW, you should always check the return value of ngx_http_send_header<br>> and ngx_http_output_filter.<br>> <br>> On 10 July 2017 at 01:43:46, Johan Andersson (ng23@firemail.cc) wrote:<br>> <br>>> Hi everyone,<br>>> <br>>> I have some issues writing my nginx modules.<br>>> <br>>> I am on Debian Stretch, installed nginx with the default<br>>> configuration,<br>>> and took the hello_world module. It works without a hitch. Then I<br>>> changed the handler to send three "hello world" responses, and sleep<br>>> for<br>>> one second between each response.<br>>> <br>>> However, when I look at the result in my browser, the page loads,<br>>> pauses<br>>> for three seconds, and then displays all three "hello world"<br>>> messages at<br>>> once.<br>>> <br>>> Actually I was flushing each response, so I expected each "hello<br>>> world"<br>>> message to appear one after the other, with one second pause between<br>>> <br>>> them.<br>>> <br>>> Am I doing something wrong? Is this event the correct way to achieve<br>>> <br>>> this? All functions return NGX_OK. This is my code:<br>>> <br>>> static ngx_int_t ngx_http_hello_world_handler(ngx_http_request_t *r)<br>>> <br>>> {<br>>> ngx_buf_t *b;<br>>> ngx_chain_t out;<br>>> ngx_int_t result;<br>>> <br>>> r->headers_out.content_type.len = sizeof("text/html") - 1;<br>>> r->headers_out.content_type.data = (u_char *) "text/html";<br>>> r->headers_out.status = NGX_HTTP_OK;<br>>> //r->headers_out.content_length_n = sizeof(ngx_hello_world);<br>>> ngx_http_send_header(r);<br>>> <br>>> for(int i = 0; i < 3; i++)<br>>> {<br>>> b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));<br>>> <br>>> out.buf = b;<br>>> out.next = NULL;<br>>> <br>>> b->pos = ngx_hello_world;<br>>> b->last = ngx_hello_world + sizeof(ngx_hello_world);<br>>> b->memory = 1;<br>>> b->flush = 1;<br>>> b->last_buf = (i == 2);<br>>> <br>>> result = ngx_http_output_filter(r, &out);<br>>> ngx_http_send_special(r, NGX_HTTP_FLUSH);<br>>> <br>>> sleep(1);<br>>> }<br>>> <br>>> return result;<br>>> }<br>>> <br>>> Cheers<br>>> Johann<br>>> _______________________________________________<br>>> nginx mailing list<br>>> <a href="mailto:nginx@nginx.org">nginx@nginx.org</a><br>>> <a href="http://mailman.nginx.org/mailman/listinfo/nginx">http://mailman.nginx.org/mailman/listinfo/nginx</a><br>> _______________________________________________<br>> nginx mailing list<br>> <a href="mailto:nginx@nginx.org">nginx@nginx.org</a><br>> <a href="http://mailman.nginx.org/mailman/listinfo/nginx">http://mailman.nginx.org/mailman/listinfo/nginx</a><br>_______________________________________________<br>nginx mailing list<br><a href="mailto:nginx@nginx.org">nginx@nginx.org</a><br><a href="http://mailman.nginx.org/mailman/listinfo/nginx">http://mailman.nginx.org/mailman/listinfo/nginx</a></div></div></span></blockquote></body></html>