]> git.kaiwu.me - nginx.git/commitdiff
Protocol version parsing in ngx_http_parse_status_line().
authorMaxim Dounin <mdounin@mdounin.ru>
Thu, 15 Sep 2011 19:22:35 +0000 (19:22 +0000)
committerMaxim Dounin <mdounin@mdounin.ru>
Thu, 15 Sep 2011 19:22:35 +0000 (19:22 +0000)
Once we know protocol version, set u->headers_in.connection_close to indicate
implicitly assumed connection close with HTTP before 1.1.

src/http/modules/ngx_http_proxy_module.c
src/http/ngx_http.h
src/http/ngx_http_parse.c

index 902cfb8f2916ac2171de41726bd3002dfb112711..0dfa16d1700410d874abc0fb7423eb6ecbea9550 100644 (file)
@@ -1210,6 +1210,7 @@ ngx_http_proxy_process_status_line(ngx_http_request_t *r)
 
         r->http_version = NGX_HTTP_VERSION_9;
         u->state->status = NGX_HTTP_OK;
+        u->headers_in.connection_close = 1;
 
         return NGX_OK;
     }
@@ -1234,6 +1235,10 @@ ngx_http_proxy_process_status_line(ngx_http_request_t *r)
                    "http proxy status %ui \"%V\"",
                    u->headers_in.status_n, &u->headers_in.status_line);
 
+    if (ctx->status.http_version < NGX_HTTP_VERSION_11) {
+        u->headers_in.connection_close = 1;
+    }
+
     u->process_header = ngx_http_proxy_process_header;
 
     return ngx_http_proxy_process_header(r);
index e3619e148b4bb97b1faad5e9724c51824f86e583..3c1a9d275ada8c06d881bc45c69590d5e5be8785 100644 (file)
@@ -52,6 +52,7 @@ struct ngx_http_log_ctx_s {
 
 
 typedef struct {
+    ngx_uint_t           http_version;
     ngx_uint_t           code;
     ngx_uint_t           count;
     u_char              *start;
index 949006b47a24aa4252727444b59b3e0070ae8bd7..a7a4c6ee639910e260de58055ff31890226d1808 100644 (file)
@@ -1403,6 +1403,7 @@ ngx_http_parse_status_line(ngx_http_request_t *r, ngx_buf_t *b,
                 return NGX_ERROR;
             }
 
+            r->http_major = ch - '0';
             state = sw_major_digit;
             break;
 
@@ -1417,6 +1418,7 @@ ngx_http_parse_status_line(ngx_http_request_t *r, ngx_buf_t *b,
                 return NGX_ERROR;
             }
 
+            r->http_major = r->http_major * 10 + ch - '0';
             break;
 
         /* the first digit of minor HTTP version */
@@ -1425,6 +1427,7 @@ ngx_http_parse_status_line(ngx_http_request_t *r, ngx_buf_t *b,
                 return NGX_ERROR;
             }
 
+            r->http_minor = ch - '0';
             state = sw_minor_digit;
             break;
 
@@ -1439,6 +1442,7 @@ ngx_http_parse_status_line(ngx_http_request_t *r, ngx_buf_t *b,
                 return NGX_ERROR;
             }
 
+            r->http_minor = r->http_minor * 10 + ch - '0';
             break;
 
         /* HTTP status code */
@@ -1516,6 +1520,7 @@ done:
         status->end = p;
     }
 
+    status->http_version = r->http_major * 1000 + r->http_minor;
     r->state = sw_start;
 
     return NGX_OK;