NGX_AGAIN and POST data

Valery Kholodkov valery+nginxen at grid.net.ru
Mon Oct 6 17:53:40 MSD 2008


Hey, sorry for confusing you. What I do in this case is:

static ngx_int_t some_handler(ngx_http_request_t *r)
{

   [ ...blah... ]

    rc = ngx_http_read_client_request_body(r, my_handler);

    if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {
        return rc;
    }

    return NGX_DONE;
}

So, basically I check the return value of
ngx_http_read_client_request_body and if it is weird, simply return it,
otherwise always return NGX_DONE.

> Using urllib, which causes the NGX_AGAIN return, I get the following
> in the log (the first statement is mine after the call to
> ngx_http_read_client_request_body prior to returning NGX_AGAIN to the
> caller).
>
> 2008/10/06 07:23:37 [alert] 34159#0: *5 failed to read client request
> body, client: 192.168.16.1, server: localhost, request: "POST /sql
> HTTP/1.0", host: "192.168.16.1:8081"
> 2008/10/06 07:23:37 [debug] 34159#0: *5 http finalize request: -2, "/sql?"
> 2008/10/06 07:23:37 [debug] 34159#0: *5 event timer add: 6:
> 60000:3525165053
> 2008/10/06 07:23:37 [debug] 34159#0: timer delta: 1
> 2008/10/06 07:23:37 [debug] 34159#0: posted events 00000000
> 2008/10/06 07:23:37 [debug] 34159#0: worker cycle
> 2008/10/06 07:23:37 [debug] 34159#0: kevent timer: 60000, changes: 0
> 2008/10/06 07:23:37 [debug] 34159#0: kevent events: 1
> 2008/10/06 07:23:37 [debug] 34159#0: kevent: 6: ft:-1 fl:0025
> ff:00000000 d:84 ud:002280B5
> 2008/10/06 07:23:37 [debug] 34159#0: *5 http test reading
> 2008/10/06 07:23:37 [debug] 34159#0: timer delta: 1
> 2008/10/06 07:23:37 [debug] 34159#0: posted events 00000000
> 2008/10/06 07:23:37 [debug] 34159#0: worker cycle
> 2008/10/06 07:23:37 [debug] 34159#0: kevent timer: 59999, changes: 0
>
>
> My request_body_handler never gets called and the client eventually times
> out.
>
> Thanks again,
>
> Brian
>
> 2008/10/6 Valery Kholodkov <valery+nginxen at grid.net.ru>:
>>
>>> The confusing part to me is the following lines from
>>> src/http/ngx_http_core_module.c:
>>>
>>>     if (r->content_handler) {
>>>         r->write_event_handler = ngx_http_request_empty_handler;
>>>         ngx_http_finalize_request(r, r->content_handler(r));
>>>         return NGX_OK;
>>>     }
>>>
>>> which appears to (according the debug stuff in the log) simply close
>>> out the connection regardless of the return value from
>>> content_handler().  Shouldn't my module be getting re-called when more
>>> data is available from the connection or am I misunderstanding
>>> something?
>>
>> No. post_handler (the second argument of
>> ngx_http_read_client_request_body) should be called when the body will
>> be
>> successfully received.
>>
>> ngx_http_finalize_request does not close the connection whenever rc ==
>> NGX_AGAIN. Instead ngx_http_read_client_request_body sets read handler
>> to
>> ngx_http_read_client_request_body_handler. Therefore the read handler
>> will
>> be recalled, not your handler.

-- 
Best regards,
Valery Kholodkov





More information about the nginx mailing list