[dev] synchronous write

Manlio Perillo manlio_perillo at libero.it
Tue Oct 16 23:57:15 MSD 2007


Igor Sysoev ha scritto:
> On Tue, Oct 16, 2007 at 09:33:00PM +0200, Manlio Perillo wrote:
> 
>> Igor Sysoev ha scritto:
>>> On Tue, Oct 16, 2007 at 12:32:53PM +0200, Manlio Perillo wrote:
>>>
>>>> The mod_wsgi implementation is almost complete.
>>>> The only feature that I have to implement is the write callable:
>>>> http://www.python.org/dev/peps/pep-0333/#the-write-callable
>>>>
>>>>
>>>> The problem is that the WSGI spec *requires* the passed-in string to be 
>>>> completely sent to the client when the write function returns.
>>>>
>>>> Is this possible with Nginx?
>>>> It does not matter that the entire process is blocked.
>>>>
>>>> Fortunately not so many WSGI applications use the write callable, and it 
>>>> is going to be removed from the next revision of WSGI.
>>> In general socket API does not allow to say exactly whether data was
>>> sent completely to a client. The single way is close() with SO_LINGER.
>>>
>> No, the problem is not really whether data was sent completely to a peer 
>> (it is sufficient that the data is in OS buffer)
>>
>> My problem is how to handle NGX_AGAIN in the write callable, since I 
>> can't return control to Nginx (and setting the event handlers).
>>
>> As an example (pseudo code):
>>   while ((rc = ngx_http_output_filter(r, &out) == NGX_AGAIN) {
>>       sleep(...)
>>
>>
>> But this does not works.
> 
> This code should be as:
> 
> my_handler(ngx_event_t *wev)
> {
>     ...
> 
>     rc = ngx_http_output_filter(...);
> 
>     if (rc == NGX_AGAIN) {
>         r->write_handler = my_handler;
>         ngx_handle_write_event(wev)
>         add_timer(wev, XXX)
>         return;
>     }
> 

But if control does not return to Nginx, how can my handler be called?


Thanks  Manlio Perillo





More information about the nginx mailing list