фильтр

Maxim Dounin mdounin at mdounin.ru
Sun Mar 30 06:30:18 MSD 2008


Hello!

On Sun, Mar 30, 2008 at 05:44:53AM +0400, Maxim Dounin wrote:

> Hello!
>
> On Sun, Mar 30, 2008 at 03:03:29AM +0200, Alexander Dolgarev wrote:
>
>> В чем принципиальная неправильность следующего фрагмента кода (если
>> допустить что in != NULL и in->next == NULL)? Клиент просто ждет и
>> ничего не получает в ответ.
>>
>>
>> static ngx_int_t
>> ngx_http_*_body_filter(ngx_http_request_t *r, ngx_chain_t *in)
>> {
>>    ngx_chain_t *out;
>>    ngx_buf_t *b;
>>
>>    out = ngx_pcalloc(r->pool, sizeof(ngx_chain_t));
>>    b = ngx_create_temp_buf(r->pool, in->buf->last - in->buf->pos);
>>    memcpy (b->pos, in->buf->pos, in->buf->last - in->buf->pos);
>>    b->last_buf = in->buf->last_buf;
>>    out->buf = b;
>>
>>    return ngx_http_next_body_filter(r, out);
>> }
>
> Старый буфер помечен как отправленный, соответственно если ответ будет 

s/помечен/не помечен/

Maxim Dounin

> более чем output_buffers - его не отошлют.  Как минимум надо ещё сделать:
>
>     in->buf->pos = in->buf->last;
>
> Плюс к тому - никто не обещал, что буфер будет в памяти.  Чтобы он таки там 
> был - об этом надо специально попросить, поставив в 
> ngx_http_*_header_filter()
>
>     r->filter_need_in_memory = 1;
>
> Maxim Dounin
>





More information about the nginx-ru mailing list