src/http/modules/ngx_http_memcached_module.c:224: error: Integer Overflow L2
  ([0, `r->uri.len`] - 1):unsigned64 by call to `ngx_http_upstream_init`.

src/http/modules/ngx_http_memcached_module.c:168:1: Parameter `r->uri.len`
166. 
167. 
168. static ngx_int_t
     ^
169. ngx_http_memcached_handler(ngx_http_request_t *r)
170. {

src/http/modules/ngx_http_memcached_module.c:190:9: Call
188.     }
189. 
190.     if (ngx_http_upstream_create(r) != NGX_OK) {
             ^
191.         return NGX_HTTP_INTERNAL_SERVER_ERROR;
192.     }

src/http/ngx_http_upstream.c:435:1: Parameter `r->uri.len`
  433. 
  434. 
  435. ngx_int_t
       ^
  436. ngx_http_upstream_create(ngx_http_request_t *r)
  437. {

src/http/modules/ngx_http_memcached_module.c:224:5: Call
222.     r->main->count++;
223. 
224.     ngx_http_upstream_init(r);
         ^
225. 
226.     return NGX_DONE;

src/http/ngx_http_upstream.c:468:1: Parameter `r->uri.len`
  466. 
  467. 
  468. void
       ^
  469. ngx_http_upstream_init(ngx_http_request_t *r)
  470. {

src/http/ngx_http_upstream.c:501:5: Call
  499.     }
  500. 
  501.     ngx_http_upstream_init_request(r);
           ^
  502. }
  503. 

src/http/ngx_http_upstream.c:505:1: Parameter `r->uri.len`
    503. 
    504. 
    505. static void
         ^
    506. ngx_http_upstream_init_request(ngx_http_request_t *r)
    507. {

src/http/ngx_http_upstream.c:543:18: Call
    541. 
    542.         if (rc == NGX_OK) {
    543.             rc = ngx_http_upstream_cache_send(r, u);
                          ^
    544. 
    545.             if (rc == NGX_DONE) {

src/http/ngx_http_upstream.c:943:1: Parameter `r->uri.len`
      941. 
      942. 
      943. static ngx_int_t
           ^
      944. ngx_http_upstream_cache_send(ngx_http_request_t *r, ngx_http_upstream_t *u)
      945. {

src/http/ngx_http_upstream.c:977:13: Call
      975.     if (rc == NGX_OK) {
      976. 
      977.         if (ngx_http_upstream_process_headers(r, u) != NGX_OK) {
                       ^
      978.             return NGX_DONE;
      979.         }

src/http/ngx_http_upstream.c:2424:1: Parameter `r->uri.len`
        2422. 
        2423. 
        2424. static ngx_int_t
              ^
        2425. ngx_http_upstream_process_headers(ngx_http_request_t *r, ngx_http_upstream_t *u)
        2426. {

src/http/ngx_http_upstream.c:2439:9: Call
        2437.         && !(u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_XA_REDIRECT))
        2438.     {
        2439.         ngx_http_upstream_finalize_request(r, u, NGX_DECLINED);
                      ^
        2440. 
        2441.         part = &u->headers_in.headers.part;

src/http/ngx_http_upstream.c:3926:1: Parameter `r->uri.len`
          3924. 
          3925. 
          3926. static void
                ^
          3927. ngx_http_upstream_finalize_request(ngx_http_request_t *r,
          3928.     ngx_http_upstream_t *u, ngx_int_t rc)

src/http/ngx_http_upstream.c:4066:9: Call
          4064. 
          4065.     if (r->header_only) {
          4066.         ngx_http_finalize_request(r, rc);
                        ^
          4067.         return;
          4068.     }

src/http/ngx_http_request.c:2249:1: Parameter `r->uri.len`
            2247. 
            2248. 
            2249. void
                  ^
            2250. ngx_http_finalize_request(ngx_http_request_t *r, ngx_int_t rc)
            2251. {

src/http/ngx_http_request.c:2321:38: Call
            2319.         c->write->handler = ngx_http_request_handler;
            2320. 
            2321.         ngx_http_finalize_request(r, ngx_http_special_response_handler(r, rc));
                                                       ^
            2322.         return;
            2323.     }

src/http/ngx_http_special_response.c:365:1: Parameter `r->uri.len`
              363. 
              364. 
              365. ngx_int_t
                   ^
              366. ngx_http_special_response_handler(ngx_http_request_t *r, ngx_int_t error)
              367. {

src/http/ngx_http_special_response.c:416:24: Call
              414.         for (i = 0; i < clcf->error_pages->nelts; i++) {
              415.             if (err_page[i].status == error) {
              416.                 return ngx_http_send_error_page(r, &err_page[i]);
                                          ^
              417.             }
              418.         }

src/http/ngx_http_special_response.c:534:1: Parameter `r->uri.len`
                532. 
                533. 
                534. static ngx_int_t
                     ^
                535. ngx_http_send_error_page(ngx_http_request_t *r, ngx_http_err_page_t *err_page)
                536. {

src/http/ngx_http_special_response.c:570:16: Call
                568.         }
                569. 
                570.         return ngx_http_internal_redirect(r, &uri, &args);
                                    ^
                571.     }
                572. 

src/http/ngx_http_core_module.c:2561:1: Parameter `r->uri.len`
                  2559. 
                  2560. 
                  2561. ngx_int_t
                        ^
                  2562. ngx_http_internal_redirect(ngx_http_request_t *r,
                  2563.     ngx_str_t *uri, ngx_str_t *args)

src/http/ngx_http_core_module.c:2591:5: Call
                  2589.                    "internal redirect: \"%V?%V\"", uri, &r->args);
                  2590. 
                  2591.     ngx_http_set_exten(r);
                            ^
                  2592. 
                  2593.     /* clear the modules contexts */

src/http/ngx_http_core_module.c:1750:1: <LHS trace>
1748. 
1749. 
1750. void
      ^
1751. ngx_http_set_exten(ngx_http_request_t *r)
1752. {

src/http/ngx_http_core_module.c:1750:1: Parameter `r->uri.len`
                    1748. 
                    1749. 
                    1750. void
                          ^
                    1751. ngx_http_set_exten(ngx_http_request_t *r)
                    1752. {

src/http/ngx_http_core_module.c:1757:10: Binary operation: ([0, r->uri.len] - 1):unsigned64 by call to `ngx_http_upstream_init` 
                    1755.     ngx_str_null(&r->exten);
                    1756. 
                    1757.     for (i = r->uri.len - 1; i > 1; i--) {
                                   ^
                    1758.         if (r->uri.data[i] == '.' && r->uri.data[i - 1] != '/') {
                    1759. 

void
ngx_http_set_exten(ngx_http_request_t *r)
{
    ngx_int_t  i;
    ngx_str_null(&r->exten);
    for (i = r->uri.len - 1; i > 1; i--) {
        if (r->uri.data[i] == '.' && r->uri.data[i - 1] != '/') {
            r->exten.len = r->uri.len - i - 1;
            r->exten.data = &r->uri.data[i + 1];
            return;
        } else if (r->uri.data[i] == '/') {
            return;
        }
    }
    return;
}
['static ngx_int_t\nngx_http_memcached_handler(ngx_http_request_t *r)\n{\n    ngx_int_t                       rc;\n    ngx_http_upstream_t            *u;\n    ngx_http_memcached_ctx_t       *ctx;\n    ngx_http_memcached_loc_conf_t  *mlcf;\n    if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD))) {\n        return NGX_HTTP_NOT_ALLOWED;\n    }\n    rc = ngx_http_discard_request_body(r);\n    if (rc != NGX_OK) {\n        return rc;\n    }\n    if (ngx_http_set_content_type(r) != NGX_OK) {\n        return NGX_HTTP_INTERNAL_SERVER_ERROR;\n    }\n    if (ngx_http_upstream_create(r) != NGX_OK) {\n        return NGX_HTTP_INTERNAL_SERVER_ERROR;\n    }\n    u = r->upstream;\n    ngx_str_set(&u->schema, "memcached://");\n    u->output.tag = (ngx_buf_tag_t) &ngx_http_memcached_module;\n    mlcf = ngx_http_get_module_loc_conf(r, ngx_http_memcached_module);\n    u->conf = &mlcf->upstream;\n    u->create_request = ngx_http_memcached_create_request;\n    u->reinit_request = ngx_http_memcached_reinit_request;\n    u->process_header = ngx_http_memcached_process_header;\n    u->abort_request = ngx_http_memcached_abort_request;\n    u->finalize_request = ngx_http_memcached_finalize_request;\n    ctx = ngx_palloc(r->pool, sizeof(ngx_http_memcached_ctx_t));\n    if (ctx == NULL) {\n        return NGX_HTTP_INTERNAL_SERVER_ERROR;\n    }\n    ctx->request = r;\n    ngx_http_set_ctx(r, ctx, ngx_http_memcached_module);\n    u->input_filter_init = ngx_http_memcached_filter_init;\n    u->input_filter = ngx_http_memcached_filter;\n    u->input_filter_ctx = ctx;\n    r->main->count++;\n    ngx_http_upstream_init(r);\n    return NGX_DONE;\n}', 'ngx_int_t\nngx_http_upstream_create(ngx_http_request_t *r)\n{\n    ngx_http_upstream_t  *u;\n    u = r->upstream;\n    if (u && u->cleanup) {\n        r->main->count++;\n        ngx_http_upstream_cleanup(r);\n    }\n    u = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_t));\n    if (u == NULL) {\n        return NGX_ERROR;\n    }\n    r->upstream = u;\n    u->peer.log = r->connection->log;\n    u->peer.log_error = NGX_ERROR_ERR;\n#if (NGX_HTTP_CACHE)\n    r->cache = NULL;\n#endif\n    u->headers_in.content_length_n = -1;\n    u->headers_in.last_modified_time = -1;\n    return NGX_OK;\n}', 'void\nngx_http_upstream_init(ngx_http_request_t *r)\n{\n    ngx_connection_t     *c;\n    c = r->connection;\n    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,\n                   "http init upstream, client timer: %d", c->read->timer_set);\n#if (NGX_HTTP_SPDY)\n    if (r->spdy_stream) {\n        ngx_http_upstream_init_request(r);\n        return;\n    }\n#endif\n    if (c->read->timer_set) {\n        ngx_del_timer(c->read);\n    }\n    if (ngx_event_flags & NGX_USE_CLEAR_EVENT) {\n        if (!c->write->active) {\n            if (ngx_add_event(c->write, NGX_WRITE_EVENT, NGX_CLEAR_EVENT)\n                == NGX_ERROR)\n            {\n                ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);\n                return;\n            }\n        }\n    }\n    ngx_http_upstream_init_request(r);\n}', 'static void\nngx_http_upstream_init_request(ngx_http_request_t *r)\n{\n    ngx_str_t                      *host;\n    ngx_uint_t                      i;\n    ngx_resolver_ctx_t             *ctx, temp;\n    ngx_http_cleanup_t             *cln;\n    ngx_http_upstream_t            *u;\n    ngx_http_core_loc_conf_t       *clcf;\n    ngx_http_upstream_srv_conf_t   *uscf, **uscfp;\n    ngx_http_upstream_main_conf_t  *umcf;\n    if (r->aio) {\n        return;\n    }\n    u = r->upstream;\n#if (NGX_HTTP_CACHE)\n    if (u->conf->cache) {\n        ngx_int_t  rc;\n        rc = ngx_http_upstream_cache(r, u);\n        if (rc == NGX_BUSY) {\n            r->write_event_handler = ngx_http_upstream_init_request;\n            return;\n        }\n        r->write_event_handler = ngx_http_request_empty_handler;\n        if (rc == NGX_ERROR) {\n            ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);\n            return;\n        }\n        if (rc == NGX_OK) {\n            rc = ngx_http_upstream_cache_send(r, u);\n            if (rc == NGX_DONE) {\n                return;\n            }\n            if (rc == NGX_HTTP_UPSTREAM_INVALID_HEADER) {\n                rc = NGX_DECLINED;\n                r->cached = 0;\n            }\n        }\n        if (rc != NGX_DECLINED) {\n            ngx_http_finalize_request(r, rc);\n            return;\n        }\n    }\n#endif\n    u->store = u->conf->store;\n    if (!u->store && !r->post_action && !u->conf->ignore_client_abort) {\n        r->read_event_handler = ngx_http_upstream_rd_check_broken_connection;\n        r->write_event_handler = ngx_http_upstream_wr_check_broken_connection;\n    }\n    if (r->request_body) {\n        u->request_bufs = r->request_body->bufs;\n    }\n    if (u->create_request(r) != NGX_OK) {\n        ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);\n        return;\n    }\n    u->peer.local = ngx_http_upstream_get_local(r, u->conf->local);\n    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);\n    u->output.alignment = clcf->directio_alignment;\n    u->output.pool = r->pool;\n    u->output.bufs.num = 1;\n    u->output.bufs.size = clcf->client_body_buffer_size;\n    if (u->output.output_filter == NULL) {\n        u->output.output_filter = ngx_chain_writer;\n        u->output.filter_ctx = &u->writer;\n    }\n    u->writer.pool = r->pool;\n    if (r->upstream_states == NULL) {\n        r->upstream_states = ngx_array_create(r->pool, 1,\n                                            sizeof(ngx_http_upstream_state_t));\n        if (r->upstream_states == NULL) {\n            ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);\n            return;\n        }\n    } else {\n        u->state = ngx_array_push(r->upstream_states);\n        if (u->state == NULL) {\n            ngx_http_upstream_finalize_request(r, u,\n                                               NGX_HTTP_INTERNAL_SERVER_ERROR);\n            return;\n        }\n        ngx_memzero(u->state, sizeof(ngx_http_upstream_state_t));\n    }\n    cln = ngx_http_cleanup_add(r, 0);\n    if (cln == NULL) {\n        ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);\n        return;\n    }\n    cln->handler = ngx_http_upstream_cleanup;\n    cln->data = r;\n    u->cleanup = &cln->handler;\n    if (u->resolved == NULL) {\n        uscf = u->conf->upstream;\n    } else {\n#if (NGX_HTTP_SSL)\n        u->ssl_name = u->resolved->host;\n#endif\n        if (u->resolved->sockaddr) {\n            if (ngx_http_upstream_create_round_robin_peer(r, u->resolved)\n                != NGX_OK)\n            {\n                ngx_http_upstream_finalize_request(r, u,\n                                               NGX_HTTP_INTERNAL_SERVER_ERROR);\n                return;\n            }\n            ngx_http_upstream_connect(r, u);\n            return;\n        }\n        host = &u->resolved->host;\n        umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module);\n        uscfp = umcf->upstreams.elts;\n        for (i = 0; i < umcf->upstreams.nelts; i++) {\n            uscf = uscfp[i];\n            if (uscf->host.len == host->len\n                && ((uscf->port == 0 && u->resolved->no_port)\n                     || uscf->port == u->resolved->port)\n                && ngx_strncasecmp(uscf->host.data, host->data, host->len) == 0)\n            {\n                goto found;\n            }\n        }\n        if (u->resolved->port == 0) {\n            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n                          "no port in upstream \\"%V\\"", host);\n            ngx_http_upstream_finalize_request(r, u,\n                                               NGX_HTTP_INTERNAL_SERVER_ERROR);\n            return;\n        }\n        temp.name = *host;\n        ctx = ngx_resolve_start(clcf->resolver, &temp);\n        if (ctx == NULL) {\n            ngx_http_upstream_finalize_request(r, u,\n                                               NGX_HTTP_INTERNAL_SERVER_ERROR);\n            return;\n        }\n        if (ctx == NGX_NO_RESOLVER) {\n            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n                          "no resolver defined to resolve %V", host);\n            ngx_http_upstream_finalize_request(r, u, NGX_HTTP_BAD_GATEWAY);\n            return;\n        }\n        ctx->name = *host;\n        ctx->handler = ngx_http_upstream_resolve_handler;\n        ctx->data = r;\n        ctx->timeout = clcf->resolver_timeout;\n        u->resolved->ctx = ctx;\n        if (ngx_resolve_name(ctx) != NGX_OK) {\n            u->resolved->ctx = NULL;\n            ngx_http_upstream_finalize_request(r, u,\n                                               NGX_HTTP_INTERNAL_SERVER_ERROR);\n            return;\n        }\n        return;\n    }\nfound:\n    if (uscf == NULL) {\n        ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,\n                      "no upstream configuration");\n        ngx_http_upstream_finalize_request(r, u,\n                                           NGX_HTTP_INTERNAL_SERVER_ERROR);\n        return;\n    }\n#if (NGX_HTTP_SSL)\n    u->ssl_name = uscf->host;\n#endif\n    if (uscf->peer.init(r, uscf) != NGX_OK) {\n        ngx_http_upstream_finalize_request(r, u,\n                                           NGX_HTTP_INTERNAL_SERVER_ERROR);\n        return;\n    }\n    u->peer.start_time = ngx_current_msec;\n    if (u->conf->next_upstream_tries\n        && u->peer.tries > u->conf->next_upstream_tries)\n    {\n        u->peer.tries = u->conf->next_upstream_tries;\n    }\n    ngx_http_upstream_connect(r, u);\n}', 'static ngx_int_t\nngx_http_upstream_cache_send(ngx_http_request_t *r, ngx_http_upstream_t *u)\n{\n    ngx_int_t          rc;\n    ngx_http_cache_t  *c;\n    r->cached = 1;\n    c = r->cache;\n    if (c->header_start == c->body_start) {\n        r->http_version = NGX_HTTP_VERSION_9;\n        return ngx_http_cache_send(r);\n    }\n    u->buffer = *c->buf;\n    u->buffer.pos += c->header_start;\n    ngx_memzero(&u->headers_in, sizeof(ngx_http_upstream_headers_in_t));\n    u->headers_in.content_length_n = -1;\n    u->headers_in.last_modified_time = -1;\n    if (ngx_list_init(&u->headers_in.headers, r->pool, 8,\n                      sizeof(ngx_table_elt_t))\n        != NGX_OK)\n    {\n        return NGX_ERROR;\n    }\n    rc = u->process_header(r);\n    if (rc == NGX_OK) {\n        if (ngx_http_upstream_process_headers(r, u) != NGX_OK) {\n            return NGX_DONE;\n        }\n        return ngx_http_cache_send(r);\n    }\n    if (rc == NGX_ERROR) {\n        return NGX_ERROR;\n    }\n    return rc;\n}', "static ngx_int_t\nngx_http_upstream_process_headers(ngx_http_request_t *r, ngx_http_upstream_t *u)\n{\n    ngx_str_t                       uri, args;\n    ngx_uint_t                      i, flags;\n    ngx_list_part_t                *part;\n    ngx_table_elt_t                *h;\n    ngx_http_upstream_header_t     *hh;\n    ngx_http_upstream_main_conf_t  *umcf;\n    umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module);\n    if (u->headers_in.x_accel_redirect\n        && !(u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_XA_REDIRECT))\n    {\n        ngx_http_upstream_finalize_request(r, u, NGX_DECLINED);\n        part = &u->headers_in.headers.part;\n        h = part->elts;\n        for (i = 0;  ; i++) {\n            if (i >= part->nelts) {\n                if (part->next == NULL) {\n                    break;\n                }\n                part = part->next;\n                h = part->elts;\n                i = 0;\n            }\n            hh = ngx_hash_find(&umcf->headers_in_hash, h[i].hash,\n                               h[i].lowcase_key, h[i].key.len);\n            if (hh && hh->redirect) {\n                if (hh->copy_handler(r, &h[i], hh->conf) != NGX_OK) {\n                    ngx_http_finalize_request(r,\n                                              NGX_HTTP_INTERNAL_SERVER_ERROR);\n                    return NGX_DONE;\n                }\n            }\n        }\n        uri = u->headers_in.x_accel_redirect->value;\n        if (uri.data[0] == '@') {\n            ngx_http_named_location(r, &uri);\n        } else {\n            ngx_str_null(&args);\n            flags = NGX_HTTP_LOG_UNSAFE;\n            if (ngx_http_parse_unsafe_uri(r, &uri, &args, &flags) != NGX_OK) {\n                ngx_http_finalize_request(r, NGX_HTTP_NOT_FOUND);\n                return NGX_DONE;\n            }\n            if (r->method != NGX_HTTP_HEAD) {\n                r->method = NGX_HTTP_GET;\n            }\n            ngx_http_internal_redirect(r, &uri, &args);\n        }\n        ngx_http_finalize_request(r, NGX_DONE);\n        return NGX_DONE;\n    }\n    part = &u->headers_in.headers.part;\n    h = part->elts;\n    for (i = 0;  ; i++) {\n        if (i >= part->nelts) {\n            if (part->next == NULL) {\n                break;\n            }\n            part = part->next;\n            h = part->elts;\n            i = 0;\n        }\n        if (ngx_hash_find(&u->conf->hide_headers_hash, h[i].hash,\n                          h[i].lowcase_key, h[i].key.len))\n        {\n            continue;\n        }\n        hh = ngx_hash_find(&umcf->headers_in_hash, h[i].hash,\n                           h[i].lowcase_key, h[i].key.len);\n        if (hh) {\n            if (hh->copy_handler(r, &h[i], hh->conf) != NGX_OK) {\n                ngx_http_upstream_finalize_request(r, u,\n                                               NGX_HTTP_INTERNAL_SERVER_ERROR);\n                return NGX_DONE;\n            }\n            continue;\n        }\n        if (ngx_http_upstream_copy_header_line(r, &h[i], 0) != NGX_OK) {\n            ngx_http_upstream_finalize_request(r, u,\n                                               NGX_HTTP_INTERNAL_SERVER_ERROR);\n            return NGX_DONE;\n        }\n    }\n    if (r->headers_out.server && r->headers_out.server->value.data == NULL) {\n        r->headers_out.server->hash = 0;\n    }\n    if (r->headers_out.date && r->headers_out.date->value.data == NULL) {\n        r->headers_out.date->hash = 0;\n    }\n    r->headers_out.status = u->headers_in.status_n;\n    r->headers_out.status_line = u->headers_in.status_line;\n    r->headers_out.content_length_n = u->headers_in.content_length_n;\n    r->disable_not_modified = !u->cacheable;\n    if (u->conf->force_ranges) {\n        r->allow_ranges = 1;\n        r->single_range = 1;\n#if (NGX_HTTP_CACHE)\n        if (r->cached) {\n            r->single_range = 0;\n        }\n#endif\n    }\n    u->length = -1;\n    return NGX_OK;\n}", 'static void\nngx_http_upstream_finalize_request(ngx_http_request_t *r,\n    ngx_http_upstream_t *u, ngx_int_t rc)\n{\n    ngx_uint_t  flush;\n    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,\n                   "finalize http upstream request: %i", rc);\n    if (u->cleanup == NULL) {\n        ngx_http_finalize_request(r, NGX_DONE);\n        return;\n    }\n    *u->cleanup = NULL;\n    u->cleanup = NULL;\n    if (u->resolved && u->resolved->ctx) {\n        ngx_resolve_name_done(u->resolved->ctx);\n        u->resolved->ctx = NULL;\n    }\n    if (u->state && u->state->response_time) {\n        u->state->response_time = ngx_current_msec - u->state->response_time;\n        if (u->pipe && u->pipe->read_length) {\n            u->state->response_length = u->pipe->read_length;\n        }\n    }\n    u->finalize_request(r, rc);\n    if (u->peer.free && u->peer.sockaddr) {\n        u->peer.free(&u->peer, u->peer.data, 0);\n        u->peer.sockaddr = NULL;\n    }\n    if (u->peer.connection) {\n#if (NGX_HTTP_SSL)\n        if (u->peer.connection->ssl) {\n            u->peer.connection->ssl->no_wait_shutdown = 1;\n            (void) ngx_ssl_shutdown(u->peer.connection);\n        }\n#endif\n        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,\n                       "close http upstream connection: %d",\n                       u->peer.connection->fd);\n        if (u->peer.connection->pool) {\n            ngx_destroy_pool(u->peer.connection->pool);\n        }\n        ngx_close_connection(u->peer.connection);\n    }\n    u->peer.connection = NULL;\n    if (u->pipe && u->pipe->temp_file) {\n        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,\n                       "http upstream temp fd: %d",\n                       u->pipe->temp_file->file.fd);\n    }\n    if (u->store && u->pipe && u->pipe->temp_file\n        && u->pipe->temp_file->file.fd != NGX_INVALID_FILE)\n    {\n        if (ngx_delete_file(u->pipe->temp_file->file.name.data)\n            == NGX_FILE_ERROR)\n        {\n            ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno,\n                          ngx_delete_file_n " \\"%s\\" failed",\n                          u->pipe->temp_file->file.name.data);\n        }\n    }\n#if (NGX_HTTP_CACHE)\n    if (r->cache) {\n        if (u->cacheable) {\n            if (rc == NGX_HTTP_BAD_GATEWAY || rc == NGX_HTTP_GATEWAY_TIME_OUT) {\n                time_t  valid;\n                valid = ngx_http_file_cache_valid(u->conf->cache_valid, rc);\n                if (valid) {\n                    r->cache->valid_sec = ngx_time() + valid;\n                    r->cache->error = rc;\n                }\n            }\n        }\n        ngx_http_file_cache_free(r->cache, u->pipe->temp_file);\n    }\n#endif\n    if (r->subrequest_in_memory\n        && u->headers_in.status_n >= NGX_HTTP_SPECIAL_RESPONSE)\n    {\n        u->buffer.last = u->buffer.pos;\n    }\n    if (rc == NGX_DECLINED) {\n        return;\n    }\n    r->connection->log->action = "sending to client";\n    if (!u->header_sent\n        || rc == NGX_HTTP_REQUEST_TIME_OUT\n        || rc == NGX_HTTP_CLIENT_CLOSED_REQUEST)\n    {\n        ngx_http_finalize_request(r, rc);\n        return;\n    }\n    flush = 0;\n    if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {\n        rc = NGX_ERROR;\n        flush = 1;\n    }\n    if (r->header_only) {\n        ngx_http_finalize_request(r, rc);\n        return;\n    }\n    if (rc == 0) {\n        rc = ngx_http_send_special(r, NGX_HTTP_LAST);\n    } else if (flush) {\n        r->keepalive = 0;\n        rc = ngx_http_send_special(r, NGX_HTTP_FLUSH);\n    }\n    ngx_http_finalize_request(r, rc);\n}', 'void\nngx_http_finalize_request(ngx_http_request_t *r, ngx_int_t rc)\n{\n    ngx_connection_t          *c;\n    ngx_http_request_t        *pr;\n    ngx_http_core_loc_conf_t  *clcf;\n    c = r->connection;\n    ngx_log_debug5(NGX_LOG_DEBUG_HTTP, c->log, 0,\n                   "http finalize request: %d, \\"%V?%V\\" a:%d, c:%d",\n                   rc, &r->uri, &r->args, r == c->data, r->main->count);\n    if (rc == NGX_DONE) {\n        ngx_http_finalize_connection(r);\n        return;\n    }\n    if (rc == NGX_OK && r->filter_finalize) {\n        c->error = 1;\n    }\n    if (rc == NGX_DECLINED) {\n        r->content_handler = NULL;\n        r->write_event_handler = ngx_http_core_run_phases;\n        ngx_http_core_run_phases(r);\n        return;\n    }\n    if (r != r->main && r->post_subrequest) {\n        rc = r->post_subrequest->handler(r, r->post_subrequest->data, rc);\n    }\n    if (rc == NGX_ERROR\n        || rc == NGX_HTTP_REQUEST_TIME_OUT\n        || rc == NGX_HTTP_CLIENT_CLOSED_REQUEST\n        || c->error)\n    {\n        if (ngx_http_post_action(r) == NGX_OK) {\n            return;\n        }\n        if (r->main->blocked) {\n            r->write_event_handler = ngx_http_request_finalizer;\n        }\n        ngx_http_terminate_request(r, rc);\n        return;\n    }\n    if (rc >= NGX_HTTP_SPECIAL_RESPONSE\n        || rc == NGX_HTTP_CREATED\n        || rc == NGX_HTTP_NO_CONTENT)\n    {\n        if (rc == NGX_HTTP_CLOSE) {\n            ngx_http_terminate_request(r, rc);\n            return;\n        }\n        if (r == r->main) {\n            if (c->read->timer_set) {\n                ngx_del_timer(c->read);\n            }\n            if (c->write->timer_set) {\n                ngx_del_timer(c->write);\n            }\n        }\n        c->read->handler = ngx_http_request_handler;\n        c->write->handler = ngx_http_request_handler;\n        ngx_http_finalize_request(r, ngx_http_special_response_handler(r, rc));\n        return;\n    }\n    if (r != r->main) {\n        if (r->buffered || r->postponed) {\n            if (ngx_http_set_write_handler(r) != NGX_OK) {\n                ngx_http_terminate_request(r, 0);\n            }\n            return;\n        }\n        pr = r->parent;\n        if (r == c->data) {\n            r->main->count--;\n            if (!r->logged) {\n                clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);\n                if (clcf->log_subrequest) {\n                    ngx_http_log_request(r);\n                }\n                r->logged = 1;\n            } else {\n                ngx_log_error(NGX_LOG_ALERT, c->log, 0,\n                              "subrequest: \\"%V?%V\\" logged again",\n                              &r->uri, &r->args);\n            }\n            r->done = 1;\n            if (pr->postponed && pr->postponed->request == r) {\n                pr->postponed = pr->postponed->next;\n            }\n            c->data = pr;\n        } else {\n            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,\n                           "http finalize non-active request: \\"%V?%V\\"",\n                           &r->uri, &r->args);\n            r->write_event_handler = ngx_http_request_finalizer;\n            if (r->waited) {\n                r->done = 1;\n            }\n        }\n        if (ngx_http_post_request(pr, NULL) != NGX_OK) {\n            r->main->count++;\n            ngx_http_terminate_request(r, 0);\n            return;\n        }\n        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,\n                       "http wake parent request: \\"%V?%V\\"",\n                       &pr->uri, &pr->args);\n        return;\n    }\n    if (r->buffered || c->buffered || r->postponed || r->blocked) {\n        if (ngx_http_set_write_handler(r) != NGX_OK) {\n            ngx_http_terminate_request(r, 0);\n        }\n        return;\n    }\n    if (r != c->data) {\n        ngx_log_error(NGX_LOG_ALERT, c->log, 0,\n                      "http finalize non-active request: \\"%V?%V\\"",\n                      &r->uri, &r->args);\n        return;\n    }\n    r->done = 1;\n    r->write_event_handler = ngx_http_request_empty_handler;\n    if (!r->post_action) {\n        r->request_complete = 1;\n    }\n    if (ngx_http_post_action(r) == NGX_OK) {\n        return;\n    }\n    if (c->read->timer_set) {\n        ngx_del_timer(c->read);\n    }\n    if (c->write->timer_set) {\n        c->write->delayed = 0;\n        ngx_del_timer(c->write);\n    }\n    if (c->read->eof) {\n        ngx_http_close_request(r, 0);\n        return;\n    }\n    ngx_http_finalize_connection(r);\n}', 'ngx_int_t\nngx_http_special_response_handler(ngx_http_request_t *r, ngx_int_t error)\n{\n    ngx_uint_t                 i, err;\n    ngx_http_err_page_t       *err_page;\n    ngx_http_core_loc_conf_t  *clcf;\n    ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,\n                   "http special response: %i, \\"%V?%V\\"",\n                   error, &r->uri, &r->args);\n    r->err_status = error;\n    if (r->keepalive) {\n        switch (error) {\n            case NGX_HTTP_BAD_REQUEST:\n            case NGX_HTTP_REQUEST_ENTITY_TOO_LARGE:\n            case NGX_HTTP_REQUEST_URI_TOO_LARGE:\n            case NGX_HTTP_TO_HTTPS:\n            case NGX_HTTPS_CERT_ERROR:\n            case NGX_HTTPS_NO_CERT:\n            case NGX_HTTP_INTERNAL_SERVER_ERROR:\n            case NGX_HTTP_NOT_IMPLEMENTED:\n                r->keepalive = 0;\n        }\n    }\n    if (r->lingering_close) {\n        switch (error) {\n            case NGX_HTTP_BAD_REQUEST:\n            case NGX_HTTP_TO_HTTPS:\n            case NGX_HTTPS_CERT_ERROR:\n            case NGX_HTTPS_NO_CERT:\n                r->lingering_close = 0;\n        }\n    }\n    r->headers_out.content_type.len = 0;\n    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);\n    if (!r->error_page && clcf->error_pages && r->uri_changes != 0) {\n        if (clcf->recursive_error_pages == 0) {\n            r->error_page = 1;\n        }\n        err_page = clcf->error_pages->elts;\n        for (i = 0; i < clcf->error_pages->nelts; i++) {\n            if (err_page[i].status == error) {\n                return ngx_http_send_error_page(r, &err_page[i]);\n            }\n        }\n    }\n    r->expect_tested = 1;\n    if (ngx_http_discard_request_body(r) != NGX_OK) {\n        r->keepalive = 0;\n    }\n    if (clcf->msie_refresh\n        && r->headers_in.msie\n        && (error == NGX_HTTP_MOVED_PERMANENTLY\n            || error == NGX_HTTP_MOVED_TEMPORARILY))\n    {\n        return ngx_http_send_refresh(r);\n    }\n    if (error == NGX_HTTP_CREATED) {\n        err = 0;\n    } else if (error == NGX_HTTP_NO_CONTENT) {\n        err = 0;\n    } else if (error >= NGX_HTTP_MOVED_PERMANENTLY\n               && error < NGX_HTTP_LAST_3XX)\n    {\n        err = error - NGX_HTTP_MOVED_PERMANENTLY + NGX_HTTP_OFF_3XX;\n    } else if (error >= NGX_HTTP_BAD_REQUEST\n               && error < NGX_HTTP_LAST_4XX)\n    {\n        err = error - NGX_HTTP_BAD_REQUEST + NGX_HTTP_OFF_4XX;\n    } else if (error >= NGX_HTTP_NGINX_CODES\n               && error < NGX_HTTP_LAST_5XX)\n    {\n        err = error - NGX_HTTP_NGINX_CODES + NGX_HTTP_OFF_5XX;\n        switch (error) {\n            case NGX_HTTP_TO_HTTPS:\n            case NGX_HTTPS_CERT_ERROR:\n            case NGX_HTTPS_NO_CERT:\n            case NGX_HTTP_REQUEST_HEADER_TOO_LARGE:\n                r->err_status = NGX_HTTP_BAD_REQUEST;\n                break;\n        }\n    } else {\n        err = 0;\n    }\n    return ngx_http_send_special_response(r, clcf, err);\n}', 'static ngx_int_t\nngx_http_send_error_page(ngx_http_request_t *r, ngx_http_err_page_t *err_page)\n{\n    ngx_int_t                  overwrite;\n    ngx_str_t                  uri, args;\n    ngx_table_elt_t           *location;\n    ngx_http_core_loc_conf_t  *clcf;\n    overwrite = err_page->overwrite;\n    if (overwrite && overwrite != NGX_HTTP_OK) {\n        r->expect_tested = 1;\n    }\n    if (overwrite >= 0) {\n        r->err_status = overwrite;\n    }\n    if (ngx_http_complex_value(r, &err_page->value, &uri) != NGX_OK) {\n        return NGX_ERROR;\n    }\n    if (uri.len && uri.data[0] == \'/\') {\n        if (err_page->value.lengths) {\n            ngx_http_split_args(r, &uri, &args);\n        } else {\n            args = err_page->args;\n        }\n        if (r->method != NGX_HTTP_HEAD) {\n            r->method = NGX_HTTP_GET;\n            r->method_name = ngx_http_get_name;\n        }\n        return ngx_http_internal_redirect(r, &uri, &args);\n    }\n    if (uri.len && uri.data[0] == \'@\') {\n        return ngx_http_named_location(r, &uri);\n    }\n    location = ngx_list_push(&r->headers_out.headers);\n    if (location == NULL) {\n        return NGX_ERROR;\n    }\n    if (overwrite != NGX_HTTP_MOVED_PERMANENTLY\n        && overwrite != NGX_HTTP_MOVED_TEMPORARILY\n        && overwrite != NGX_HTTP_SEE_OTHER\n        && overwrite != NGX_HTTP_TEMPORARY_REDIRECT)\n    {\n        r->err_status = NGX_HTTP_MOVED_TEMPORARILY;\n    }\n    location->hash = 1;\n    ngx_str_set(&location->key, "Location");\n    location->value = uri;\n    ngx_http_clear_location(r);\n    r->headers_out.location = location;\n    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);\n    if (clcf->msie_refresh && r->headers_in.msie) {\n        return ngx_http_send_refresh(r);\n    }\n    return ngx_http_send_special_response(r, clcf, r->err_status\n                                                   - NGX_HTTP_MOVED_PERMANENTLY\n                                                   + NGX_HTTP_OFF_3XX);\n}', 'ngx_int_t\nngx_http_internal_redirect(ngx_http_request_t *r,\n    ngx_str_t *uri, ngx_str_t *args)\n{\n    ngx_http_core_srv_conf_t  *cscf;\n    r->uri_changes--;\n    if (r->uri_changes == 0) {\n        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n                      "rewrite or internal redirection cycle "\n                      "while internally redirecting to \\"%V\\"", uri);\n        r->main->count++;\n        ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);\n        return NGX_DONE;\n    }\n    r->uri = *uri;\n    if (args) {\n        r->args = *args;\n    } else {\n        ngx_str_null(&r->args);\n    }\n    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,\n                   "internal redirect: \\"%V?%V\\"", uri, &r->args);\n    ngx_http_set_exten(r);\n    ngx_memzero(r->ctx, sizeof(void *) * ngx_http_max_module);\n    cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);\n    r->loc_conf = cscf->ctx->loc_conf;\n    ngx_http_update_location_config(r);\n#if (NGX_HTTP_CACHE)\n    r->cache = NULL;\n#endif\n    r->internal = 1;\n    r->valid_unparsed_uri = 0;\n    r->add_uri_to_alias = 0;\n    r->main->count++;\n    ngx_http_handler(r);\n    return NGX_DONE;\n}', "void\nngx_http_set_exten(ngx_http_request_t *r)\n{\n    ngx_int_t  i;\n    ngx_str_null(&r->exten);\n    for (i = r->uri.len - 1; i > 1; i--) {\n        if (r->uri.data[i] == '.' && r->uri.data[i - 1] != '/') {\n            r->exten.len = r->uri.len - i - 1;\n            r->exten.data = &r->uri.data[i + 1];\n            return;\n        } else if (r->uri.data[i] == '/') {\n            return;\n        }\n    }\n    return;\n}"]