Looking for developer to fix a NginX test case module
Julien Zefi
jzefip at gmail.com
Tue Jul 30 01:07:10 UTC 2013
hi Maxim,
thanks so much for the code provided, i have merged that code in my module
and it worked as expected!. Would you please send me the details to send
you the money ?
thanks
On Fri, Jul 26, 2013 at 7:31 AM, Maxim Dounin <mdounin at mdounin.ru> wrote:
> Hello!
>
> On Fri, Jul 26, 2013 at 12:05:11AM -0600, Julien Zefi wrote:
>
> > Hi,
> >
> > As i am not able to fix a problem for a NginX module that i am writing,
> and
> > after iterate a couple of times in the mailing list, i am still not able
> to
> > solve the problem. So i would like to offer 100 USD for who is able to
> help
> > me to fix the problem in my test case module.
> >
> > As a reference please check the following thread:
> >
> > http://mailman.nginx.org/pipermail/nginx-devel/2013-July/003923.html
> >
> > If you think you can fix it, please reply me back in private so we can
> > discuss how to proceed,
>
> Below is working example of what you've tried to do. It still
> lacks various things like request body handling which should be
> here in real module, but it's expected to work.
>
> Notable problems in your code:
>
> 1) You tried to set low-level event handlers. That's not what
> you are supposed to do.
>
> 2) On the other hand, after handling a requests's write event you
> are responsible to call ngx_handle_write_event().
>
> 3) The r->count++ operation was done too many times, it's just wrong.
>
> 4) For some unknown reason r->header_only was set. It's just wrong.
>
> 5) Return code from ngx_http_send_header() wasn't handled.
>
> 6) Code returned from the ngx_http_test_handler() was NGX_OK
> instead of NGX_DONE which is expected to be used if want to
> continue processing.
>
> 7) ... (there were many others, but I'm to lazy to remember all of
> them)
>
> Overral, I would recommend you to read and understand at least
> several standard modules _before_ you'll start further coding.
>
>
> #include <ngx_config.h>
> #include <ngx_core.h>
> #include <ngx_http.h>
>
>
> typedef struct {
> ngx_buf_t *buf;
> } ngx_http_test_ctx_t;
>
>
> static void ngx_http_test_stream_handler(ngx_http_request_t *r);
> static char *ngx_http_test(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
>
>
> static u_char message[] =
> "AAAAAAAAAABBBBBBBBBBCCCCCCCCCCDDDDDDDDDDEEEEEEEEEEFFFFFFFFFF"
> "AAAAAAAAAABBBBBBBBBBCCCCCCCCCCDDDDDDDDDDEEEEEEEEEEFFFFFFFFFF"
> "AAAAAAAAAABBBBBBBBBBCCCCCCCCCCDDDDDDDDDDEEEEEEEEEEFFFFFFFFFF"
> "AAAAAAAAAABBBBBBBBBBCCCCCCCCCCDDDDDDDDDDEEEEEEEEEEFFFFFFFFFF"
> "AAAAAAAAAABBBBBBBBBBCCCCCCCCCCDDDDDDDDDDEEEEEEEEEEFFFFFFFFFF"
> "\r\n";
>
>
> static ngx_command_t ngx_http_test_case_commands[] = {
> { ngx_string("test_module"),
> NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS,
> ngx_http_test,
> 0,
> 0,
> NULL },
>
> ngx_null_command
> };
>
>
> static ngx_http_module_t ngx_http_test_case_ctx = {
> NULL, /* preconfiguration */
> NULL, /* postconfiguration */
>
> NULL, /* create main configuration */
> NULL, /* init main configuration */
>
> NULL, /* create server configuration */
> NULL, /* merge server configuration */
>
> NULL, /* create location configuration */
> NULL /* merge location configuration */
> };
>
>
> ngx_module_t ngx_http_test_module = {
> NGX_MODULE_V1,
> &ngx_http_test_case_ctx, /* module context */
> ngx_http_test_case_commands, /* module directives */
> NGX_HTTP_MODULE, /* module type */
> NULL, /* init master */
> NULL, /* init module */
> NULL, /* init process */
> NULL, /* init thread */
> NULL, /* exit thread */
> NULL, /* exit process */
> NULL, /* exit master */
> NGX_MODULE_V1_PADDING
> };
>
>
> static void
> ngx_http_test_stream_handler(ngx_http_request_t *r)
> {
> ngx_int_t rc;
> ngx_buf_t *b;
> ngx_chain_t *out, cl;
> ngx_http_test_ctx_t *ctx;
>
> ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
> "test stream handler");
>
> ctx = ngx_http_get_module_ctx(r, ngx_http_test_module);
>
> if (ctx == NULL) {
> /*
> * create new context and a buffer we will use to send
> * our data
> */
>
> ctx = ngx_palloc(r->pool, sizeof(ngx_http_test_ctx_t));
> if (ctx == NULL) {
> ngx_http_finalize_request(r, NGX_ERROR);
> return;
> }
>
> ctx->buf = ngx_create_temp_buf(r->pool, sizeof(message));
>
> ngx_http_set_ctx(r, ctx, ngx_http_test_module);
> }
>
> out = NULL;
> b = ctx->buf;
>
> if (ngx_buf_size(b) == 0) {
> /* new buffer or everything send, start over */
>
> b->pos = b->start;
> b->last = ngx_cpymem(b->pos, message, sizeof(message) - 1);
> b->flush = 1;
>
> cl.buf = b;
> cl.next = NULL;
>
> out = &cl;
> }
>
> rc = ngx_http_output_filter(r, out);
>
> if (rc == NGX_ERROR) {
> ngx_http_finalize_request(r, rc);
> return;
> }
>
> if (ngx_buf_size(b) == 0) {
> ngx_add_timer(r->connection->write, 1);
> }
>
> if (ngx_handle_write_event(r->connection->write, 0) != NGX_OK) {
> ngx_http_finalize_request(r, NGX_ERROR);
> return;
> }
> }
>
>
> static ngx_int_t
> ngx_http_test_handler(ngx_http_request_t *r)
> {
> ngx_int_t rc;
>
> /* set response headers */
>
> r->headers_out.content_type.len = sizeof("video/mp2t") - 1;
> r->headers_out.content_type.data = (u_char *) "video/mp2t";
> r->headers_out.status = NGX_HTTP_OK;
>
> r->write_event_handler = ngx_http_test_stream_handler;
>
> rc = ngx_http_send_header(r);
>
> if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {
> return rc;
> }
>
> r->main->count++;
> ngx_http_test_stream_handler(r);
>
> return NGX_DONE;
> }
>
>
> static char *
> ngx_http_test(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
> {
> ngx_http_core_loc_conf_t *clcf;
>
> clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);
> clcf->handler = ngx_http_test_handler;
>
> return NGX_CONF_OK;
> }
>
>
> --
> Maxim Dounin
> http://nginx.org/en/donation.html
>
> _______________________________________________
> nginx-devel mailing list
> nginx-devel at nginx.org
> http://mailman.nginx.org/mailman/listinfo/nginx-devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.nginx.org/pipermail/nginx-devel/attachments/20130729/f8cc30a2/attachment.html>
More information about the nginx-devel
mailing list