<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN">
<html><body style='font-size: 10pt; font-family: Verdana,Geneva,sans-serif'>
<p>Hi,</p>
<p>I have a question: how an upstream could be properly "detached" from request in case it gets closed by client?</p>
<p>Some time ago I have implemented a FastCGI multiplexing for nginx, which would work pretty well, excepting the case if a request gets closed by client side. In such a case <em>ngx_http_upstream_finalize_request</em> would close the upstream connection.<br />This may not be worse for a single connect per request, but very annoying in case of multiplexing, since closing of such upstream connect means a simultaneous close for N requests not involved by the client, but serving through the same upstream pipe.</p>
<p>So I was trying to implement abortive "close", using send of ABORT_REQUEST (2) packet, corresponding FastCGI protocol.<br />Since <em>upstream->abort_request</em> handler is not yet implemented in nginx, my first attempt was just to extend <em>ngx_http_fastcgi_finalize_request</em> in order to create new send buffer there and restore <em>r->upstream->keepalive </em>so that <em>u->peer.free </em>in <em>ngx_http_upstream_finalize_request</em> would retain the upstream connect.</p>
<p>So I see "free keepalive peer: saving connection" logged (and connect is not closed), but probably because <em>ngx_http_upstream_free_keepalive_peer</em> moved it to cached queue, it does not send ABORT_REQUEST packet to the fastcgi side.<br /><br />Is there some proper way to retain an upstream connection (able to send) which is detached from request by close or before close, so such an abortive "disconnect" can be handled through upstream pipe? With other words avoid an upstream close or saving keepalive connection in <em>ngx_http_fastcgi_finalize_request</em>.</p>
<p>Regards,<br />Sergey.</p>
</body></html>