nginx_http_write_filter_module.c

Maxim Dounin mdounin at mdounin.ru
Wed Jun 21 16:01:26 UTC 2023


Hello!

On Wed, Jun 21, 2023 at 11:36:54AM +0000, Yuval Abadi via nginx wrote:

> Nginx 1.23.2
> 
> The cpi ngx_http_write_filter(ngx_http_request_t *r, ngx_chain_t *in)
> 
> Loop over the request out buffers  and   in chain
> 
> If calculate size of combined buffer to write.
> 
> I  add  body replacement on  chain.
> It have value, but ngx_buf_size(cl->buf);
> Return it have 0. Size.
> 
> (l->buf->last - cl->buf->pos) give the correct size
> 
> So the buffer  not written.
> 
> Only the header part send back to client
> 
> Any idea?
> 
> 2023/06/21 10:45:31 [debug] 22962#22962: *3 write old buf t:1 f:0 00005600970D81E0, pos 00005600970D81E0, size: 179 file: 0, size: 0
> 2023/06/21 10:45:31 [debug] 22962#22962: *3 write new buf t:0 f:0 00005600970D8098, pos 00005600970D8098, size: 247 file: 0, size: 0
> 2023/06/21 10:45:31 [debug] 22962#22962: *3 http write filter: l:1 f:0 s:179
> 2023/06/21 10:45:31 [debug] 22962#22962: *3 http write filter limit 2097152
> 2023/06/21 10:45:31 [debug] 22962#22962: *3 writev: 179 of 179

Note the "t:0" part in the relevant debug log line: it suggests 
that the cl->buf->temporary flag is not set.

If the cl->buf->memory flag isn't set as well, this basically 
means that buffer does not reference any memory at all (even if 
cl->buf->post / cl->buf->last pointers are set).  For such a 
buffer ngx_buf_size() will return the file size.  And, since the 
buffer does not reference file data as well (note "f:0"), it is 
expected to be 0 (and it is, as per "file: 0, size: 0").

So it looks like the behaviour you observe is the result of 
forgotten cl->buf->memory (or cl->buf->temporary) flag.  Check 
your code to see if the buffer flags are set correctly, it looks 
like they aren't.

See

http://nginx.org/en/docs/dev/development_guide.html#buffer

for basic information about memory buffers and some basic 
examples.  For additional information, check nginx code.

-- 
Maxim Dounin
http://mdounin.ru/


More information about the nginx mailing list