Content does not get replaced

Adelino Monteiro adelino at ainou.net
Tue May 31 20:22:36 MSD 2011


Thanks, that information was priceless ;-)
It works like a charm now.

AM

On 30 May 2011 23:27, Maxim Dounin <mdounin at mdounin.ru> wrote:

> Hello!
>
> On Mon, May 30, 2011 at 07:35:17PM +0100, Adelino Monteiro wrote:
>
> > Hello,
> >
> > I'm writing my first module (actually a copy from mod_strip with some
> simple
> > modifications)
> >
> > I have this simple function that for testing purposes should simply make
> a
> > simple substitution of all chars to A. I used gdb and
> chain_link->buf->start
> > indeed has all the  characters replaced with A. However the output in the
> > end is the original file without any other modification.
> >
> > Could someone shed some light on this mistery?
> >
> > Thanks
> >
> > AM
> >
> > static ngx_int_t
> > ngx_http_strip_body_filter(ngx_http_request_t *r, ngx_chain_t *in)
> > {
> >     ngx_http_strip_ctx_t *ctx;
> >     ngx_chain_t          *chain_link;
> >
> >
> >     u_char *reader;
> >     u_char *writer;
> >
> >     ngx_log_t   *log;
> >
> >     log = r->connection->log;
> >
> >     ngx_log_debug0(NGX_LOG_DEBUG_HTTP, log, 0, "In strip strip body
> filter 1
> > ");
> >
> >     ctx = ngx_http_get_module_ctx(r, ngx_http_strip_filter_module);
> >     if (ctx == NULL) {
> >         ngx_log_debug0(NGX_LOG_DEBUG_HTTP, log, 0, "In strip strip body
> > filter 2 ");
> >         return ngx_http_next_body_filter(r, in);
> >     }
> >     ngx_log_debug0(NGX_LOG_DEBUG_HTTP, log, 0, "In strip strip body
> filter 3
> > ");
> >
> >
> >     for (chain_link = in; chain_link; chain_link = chain_link->next) {
> >         for (writer = chain_link->buf->pos, reader =
> chain_link->buf->pos;
> > reader < chain_link->buf->last; reader++) {
> >             ngx_log_debug1(NGX_LOG_DEBUG_HTTP, log, 0, "w: \"%c\"",
> > *reader);
> >
> >             *reader = 'A' ;
> >             if (reader < chain_link->buf->last)
> >                         *writer++ = *reader;
> >         }
> >             ngx_log_debug1(NGX_LOG_DEBUG_HTTP, log, 0, "In
> strip_body_filter
> > writer: \"%s\"", writer);
> >
> >         chain_link->buf->last = writer;
> >
> >     }
> >
> >     return ngx_http_next_body_filter(r, in);
> > }
>
> If you want to modify buffer data in place, you have to:
>
> 1. Request buffers to be in memory via r->filter_need_in_memory
> flag.
>
> 2. Request buffers to be in temporary (i.e. modifiable) memory
> buffers via r->filter_need_temporary flag.
>
> Both (1) and (2) must be done at header filter stage.
>
> 3. Reset buf->in_file flag as long as you modified data to stop
> nginx from sending file data (if any and enabled via sendfile
> directive) instead of corresponding memory contents.
>
> Please refer to charset filter sources for an example.
>
> Maxim Dounin
>
> _______________________________________________
> nginx-devel mailing list
> nginx-devel at nginx.org
> http://nginx.org/mailman/listinfo/nginx-devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://nginx.org/pipermail/nginx-devel/attachments/20110531/a0ebfb36/attachment.html>


More information about the nginx-devel mailing list