# HG changeset patch # User Igor Sysoev # Date 1276612213 0 # Node ID 3b7e8fa31a00af9f31daa95a445dc7bf0100802a # Parent 633ef29c9881d09dd376753b6dd4e2326cc0a3c4 support CGI-style response diff --git a/src/http/modules/ngx_http_uwsgi_module.c b/src/http/modules/ngx_http_uwsgi_module.c --- a/src/http/modules/ngx_http_uwsgi_module.c +++ b/src/http/modules/ngx_http_uwsgi_module.c @@ -1100,10 +1100,10 @@ ngx_http_uwsgi_process_status_line(ngx_h "upstream sent no valid HTTP/1.0 header"); r->http_version = NGX_HTTP_VERSION_9; - u->headers_in.status_n = NGX_HTTP_OK; - u->state->status = NGX_HTTP_OK; - return NGX_OK; + u->process_header = ngx_http_uwsgi_process_header; + + return ngx_http_uwsgi_process_header(r); } if (u->state) { @@ -1135,8 +1135,10 @@ ngx_http_uwsgi_process_status_line(ngx_h static ngx_int_t ngx_http_uwsgi_process_header(ngx_http_request_t *r) { - ngx_int_t rc; + ngx_str_t *status_line; + ngx_int_t rc, status; ngx_table_elt_t *h; + ngx_http_upstream_t *u; ngx_http_upstream_header_t *hh; ngx_http_upstream_main_conf_t *umcf; @@ -1200,6 +1202,45 @@ ngx_http_uwsgi_process_header(ngx_http_r ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "http uwsgi header done"); + if (r->http_version > NGX_HTTP_VERSION_9) { + return NGX_OK; + } + + u = r->upstream; + + if (u->headers_in.status) { + status_line = &u->headers_in.status->value; + + status = ngx_atoi(status_line->data, 3); + if (status == NGX_ERROR) { + ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, + "upstream sent invalid status \"%V\"", + status_line); + return NGX_HTTP_UPSTREAM_INVALID_HEADER; + } + + r->http_version = NGX_HTTP_VERSION_10; + u->headers_in.status_n = status; + u->headers_in.status_line = *status_line; + + } else if (u->headers_in.location) { + r->http_version = NGX_HTTP_VERSION_10; + u->headers_in.status_n = 302; + ngx_str_set(&u->headers_in.status_line, + "302 Moved Temporarily"); + + } else { + ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, + "upstream sent neither valid HTTP/1.0 header " + "nor \"Status\" header line"); + u->headers_in.status_n = 200; + ngx_str_set(&u->headers_in.status_line, "200 OK"); + } + + if (u->state) { + u->state->status = u->headers_in.status_n; + } + return NGX_OK; }