On 16/01/18 18:13, Jesus Cea wrote:
> Thanks for your time, Graham. Much appreciated.

Reading source code, I see things I don't understand and could be the issue:

When a request is processed, if it preemptively marked as "error 500".
This code will be changed to the right result code when the request
finishs. This is a good approach, because any oversight will be shown as
"error 500". Good so far.

File "mod_wsgi.c", line 3175.

"Adapter_output" will return "0" if the client closed the connection. In
that case, source code set "aborted=1". Cool.

A few lines later we have this:

"""
            if (!PyErr_Occurred() && !aborted) {
                if (Adapter_output(self, "", 0, NULL, 0))
                    self->result = OK;
            }
"""

I am not sure why "Adapter_output()" is called with NOOP operation
(maybe to signal "end of stream", but then I don't know why it is only
done when no python error occurred), but "self->result=OK" requires
"aborted==0". This is not going to happen if we have "aborted==1".

I think that if we have "abort != 0" and "!PyErr_Occurred()", we should
do "self->result = OK;" unconditionally.

Maybe better something like this:

if(!PyErr_Occurred()) {
    if(aborted) {
        self->result = OK;
    } else {
        if (Adapter_output(self, "", 0, NULL, 0))
            self->result = OK;
    }
 }

Or even:

if(!PyErr_Occurred()) {
    if(!aborted)
        Adapter_output(self, "", 0, NULL, 0);
    self->result = OK;
}

Or even:

if(!aborted)
    Adapter_output(self, "", 0, NULL, 0); // ?? Signal end of string???

if(!PyErr_Occurred())
    self->result = OK;

A while later we will log an error (at debug level, you usually don't
see it) if data length we send is not the same than the "content-length"
header. That would be a mistake if "aborted==1". In that case we should
ONLY log an error if "content-length>actual data length sent".

This is only code inspection, without knowing about mod_wsgi internals.
I didn't even try to compile. What do you think, Graham?.

Apparently this takes care of the "embedded mode". Didn't check, really.

Reading more source code, I find "wsgi_transfer_response", returning 500
for almost everything that. I changed there all "return
HTTP_INTERNAL_SERVER_ERROR;" to:

"""
if (r->connection->aborted)
    return OK;
else
    return HTTP_INTERNAL_SERVER_ERROR;
"""

This seems to get rid of the problem!. Now I have "200" and "206" in my
server log! :).

I didn't take care of logging details, specially the "content-length"
mismatch described before in this text.

Do you agree with this patch?. Do you want a pull request in github?.

PS: I have been testing these changes in last couple of hours.
Everything seems good so far.

-- 
Jesús Cea Avión                         _/_/      _/_/_/        _/_/_/
j...@jcea.es - http://www.jcea.es/     _/_/    _/_/  _/_/    _/_/  _/_/
Twitter: @jcea                        _/_/    _/_/          _/_/_/_/_/
jabber / xmpp:j...@jabber.org  _/_/  _/_/    _/_/          _/_/  _/_/
"Things are not so easy"      _/_/  _/_/    _/_/  _/_/    _/_/  _/_/
"My name is Dump, Core Dump"   _/_/_/        _/_/_/      _/_/  _/_/
"El amor es poner tu felicidad en la felicidad de otro" - Leibniz

-- 
You received this message because you are subscribed to the Google Groups 
"modwsgi" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to modwsgi+unsubscr...@googlegroups.com.
To post to this group, send email to modwsgi@googlegroups.com.
Visit this group at https://groups.google.com/group/modwsgi.
For more options, visit https://groups.google.com/d/optout.

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to