Sending empty response from http_upstream

Jeff Heisz jmheisz at gmail.com
Sun Jan 15 03:28:29 UTC 2023


Ah, ok.  I'm not sure where I got that line to mark header_only from,
probably looking at some other code.  Once I commented that out, I
discovered where the content length was coming from, I had an error
page for the 302 response that I hadn't realized I'd put in there and
of course it makes sense in this case that there was a response length
but no body because I had forced the flag.  Code adjusted, no more
invalid response errors on i-devices!  Thanks for the help Maxim.

jmh

On Fri, Jan 13, 2023 at 11:19 PM Jeff Heisz <jmheisz at gmail.com> wrote:
>
> Hello!
>
> I've been trying to debug an issue with a custom nginx module, which
> is working 'properly' with desktop browsers but failing on Apple
> browsers with an 'invalid response' error message.
>
> I don't know exactly what it doesn't like (so much fun debugging on
> i-devices)  but I am seeing one specific oddity when tracing the
> response from nginx through the desktop debugging console that might
> be the cause.
>
> My module communicates with an upstream manager process that signals
> the kind of response to be sent along with associated data.  The
> response that has the issue is when the manager signals a redirect
> instead of a content response.
>
> The module extracts the data from the upstream buffer and pushes a
> req->headers_out.location header record with the URL from the
> upstream.  It then sets up the response as:
>
>        upstr->headers_in.content_length_n = 0;
>        // (tried this) ngx_http_clear_content_length(req);
>        upstr->headers_in.status_n = NGX_HTTP_MOVED_TEMPORARILY;
>        upstr->state->status = NGX_HTTP_MOVED_TEMPORARILY;
>        upstr->buffer.pos += url_len;
>        req->header_only = 1;
>        upstr->keepalive = 1;
>
> Basically, a response of zero length and a 302 response code,
> advancing the upstream buffer position to the end of the URL (no
> additional data in the upstream buffer to be processed).
>
> However, when I examine the response through the debugger, I see the
> appropriate location header but the content-length is always 32677!
> Not zero.  Attempting to look at the response shows no data.  This is
> highly suspicious as to why an error is occuring on the i-device.  I
> should also mention that the upstream response with the redirect URL
> is only 489 bytes, so that's not the source of the value.
>
> What I don't understand is where that content-length is coming from.
> Other cases where I set a non-zero length and have data in the
> upstream buffer works properly.  But for the zero case it doesn't send
> any content but sends this non-zero length.  From the code above you
> can see that I tried deleting the response content length information
> in case it was already in place from somewhere but that had no effect.
>
> Any thoughts?  I've tried doing some tracing in the nginx core code
> itself but so far have not been able to see where this length is
> originating from.
>
> Many thanks for any input,
>
> jmh


More information about the nginx-devel mailing list