If the first response line was split across reads and it didn't appear
a status line, the portion already processed was lost. To preserve ABI,
the change reuses r->header_name_start for proper backtracking on status
line fallback.
u = r->upstream;
+ if (r->state == 0) {
+ r->header_name_start = u->buffer.pos;
+ }
+
rc = ngx_http_parse_status_line(r, &u->buffer, &ctx->status);
if (rc == NGX_AGAIN) {
}
if (rc == NGX_ERROR) {
+ u->buffer.pos = r->header_name_start;
#if (NGX_HTTP_CACHE)
u = r->upstream;
+ if (r->state == 0) {
+ r->header_name_start = u->buffer.pos;
+ }
+
rc = ngx_http_parse_status_line(r, &u->buffer, status);
if (rc == NGX_AGAIN) {
if (rc == NGX_ERROR) {
u->process_header = ngx_http_scgi_process_header;
+ u->buffer.pos = r->header_name_start;
r->state = 0;
return ngx_http_scgi_process_header(r);
}
u = r->upstream;
+ if (r->state == 0) {
+ r->header_name_start = u->buffer.pos;
+ }
+
rc = ngx_http_parse_status_line(r, &u->buffer, status);
if (rc == NGX_AGAIN) {
if (rc == NGX_ERROR) {
u->process_header = ngx_http_uwsgi_process_header;
+ u->buffer.pos = r->header_name_start;
r->state = 0;
return ngx_http_uwsgi_process_header(r);
}