src/http/ngx_http_upstream.c:938: error: Integer Overflow L2
  ([0, +oo] - 1):unsigned64 by call to `ngx_http_upstream_connect`.

src/http/ngx_http_upstream.c:938:5: Call
936.     ur->ctx = NULL;
937. 
938.     ngx_http_upstream_connect(r, u);
         ^
939. 
940. failed:

src/http/ngx_http_upstream.c:1132:1: Parameter `r->uri.len`
  1130. 
  1131. 
  1132. static void
        ^
  1133. ngx_http_upstream_connect(ngx_http_request_t *r, ngx_http_upstream_t *u)
  1134. {

src/http/ngx_http_upstream.c:1273:5: Call
  1271. #endif
  1272. 
  1273.     ngx_http_upstream_send_request(r, u);
            ^
  1274. }
  1275. 

src/http/ngx_http_upstream.c:1416:1: Parameter `r->uri.len`
    1414. 
    1415. 
    1416. static void
          ^
    1417. ngx_http_upstream_send_request(ngx_http_request_t *r, ngx_http_upstream_t *u)
    1418. {

src/http/ngx_http_upstream.c:1476:9: Call
    1474. 
    1475.     if (c->read->ready) {
    1476.         ngx_http_upstream_process_header(r, u);
                  ^
    1477.         return;
    1478.     }

src/http/ngx_http_upstream.c:1527:1: Parameter `r->uri.len`
      1525. 
      1526. 
      1527. static void
            ^
      1528. ngx_http_upstream_process_header(ngx_http_request_t *r, ngx_http_upstream_t *u)
      1529. {

src/http/ngx_http_upstream.c:1672:9: Call
      1670. 
      1671.     if (!r->subrequest_in_memory) {
      1672.         ngx_http_upstream_send_response(r, u);
                    ^
      1673.         return;
      1674.     }

src/http/ngx_http_upstream.c:2081:1: Parameter `r->uri.len`
        2079. 
        2080. 
        2081. static void
              ^
        2082. ngx_http_upstream_send_response(ngx_http_request_t *r, ngx_http_upstream_t *u)
        2083. {

src/http/ngx_http_upstream.c:2094:9: Call
        2092. 
        2093.     if (rc == NGX_ERROR || rc > NGX_OK || r->post_action) {
        2094.         ngx_http_upstream_finalize_request(r, u, rc);
                      ^
        2095.         return;
        2096.     }

src/http/ngx_http_upstream.c:3268:1: Parameter `r->uri.len`
          3266. 
          3267. 
          3268. static void
                ^
          3269. ngx_http_upstream_finalize_request(ngx_http_request_t *r,
          3270.     ngx_http_upstream_t *u, ngx_int_t rc)

src/http/ngx_http_upstream.c:3401:5: Call
          3399.     }
          3400. 
          3401.     ngx_http_finalize_request(r, rc);
                    ^
          3402. }
          3403. 

src/http/ngx_http_request.c:2198:1: Parameter `r->uri.len`
            2196. 
            2197. 
            2198. void
                  ^
            2199. ngx_http_finalize_request(ngx_http_request_t *r, ngx_int_t rc)
            2200. {

src/http/ngx_http_request.c:2270:38: Call
            2268.         c->write->handler = ngx_http_request_handler;
            2269. 
            2270.         ngx_http_finalize_request(r, ngx_http_special_response_handler(r, rc));
                                                       ^
            2271.         return;
            2272.     }

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:2551:1: Parameter `r->uri.len`
                  2549. 
                  2550. 
                  2551. ngx_int_t
                        ^
                  2552. ngx_http_internal_redirect(ngx_http_request_t *r,
                  2553.     ngx_str_t *uri, ngx_str_t *args)

src/http/ngx_http_core_module.c:2581:5: Call
                  2579.                    "internal redirect: \"%V?%V\"", uri, &r->args);
                  2580. 
                  2581.     ngx_http_set_exten(r);
                            ^
                  2582. 
                  2583.     /* clear the modules contexts */

src/http/ngx_http_core_module.c:1795:1: <LHS trace>
1793. 
1794. 
1795. void
      ^
1796. ngx_http_set_exten(ngx_http_request_t *r)
1797. {

src/http/ngx_http_core_module.c:1795:1: Parameter `r->uri.len`
                    1793. 
                    1794. 
                    1795. void
                          ^
                    1796. ngx_http_set_exten(ngx_http_request_t *r)
                    1797. {

src/http/ngx_http_core_module.c:1802:10: Binary operation: ([0, +oo] - 1):unsigned64 by call to `ngx_http_upstream_connect` 
                    1800.     ngx_str_null(&r->exten);
                    1801. 
                    1802.     for (i = r->uri.len - 1; i > 1; i--) {
                                   ^
                    1803.         if (r->uri.data[i] == '.' && r->uri.data[i - 1] != '/') {
                    1804. 

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 void\nngx_http_upstream_resolve_handler(ngx_resolver_ctx_t *ctx)\n{\n    ngx_connection_t              *c;\n    ngx_http_request_t            *r;\n    ngx_http_upstream_t           *u;\n    ngx_http_upstream_resolved_t  *ur;\n    r = ctx->data;\n    c = r->connection;\n    u = r->upstream;\n    ur = u->resolved;\n    if (ctx->state) {\n        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n                      "%V could not be resolved (%i: %s)",\n                      &ctx->name, ctx->state,\n                      ngx_resolver_strerror(ctx->state));\n        ngx_http_upstream_finalize_request(r, u, NGX_HTTP_BAD_GATEWAY);\n        goto failed;\n    }\n    ur->naddrs = ctx->naddrs;\n    ur->addrs = ctx->addrs;\n#if (NGX_DEBUG)\n    {\n    in_addr_t   addr;\n    ngx_uint_t  i;\n    for (i = 0; i < ctx->naddrs; i++) {\n        addr = ntohl(ur->addrs[i]);\n        ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,\n                       "name was resolved to %ud.%ud.%ud.%ud",\n                       (addr >> 24) & 0xff, (addr >> 16) & 0xff,\n                       (addr >> 8) & 0xff, addr & 0xff);\n    }\n    }\n#endif\n    if (ngx_http_upstream_create_round_robin_peer(r, ur) != NGX_OK) {\n        ngx_http_upstream_finalize_request(r, u,\n                                           NGX_HTTP_INTERNAL_SERVER_ERROR);\n        goto failed;\n    }\n    ngx_resolve_name_done(ctx);\n    ur->ctx = NULL;\n    ngx_http_upstream_connect(r, u);\nfailed:\n    ngx_http_run_posted_requests(c);\n}', 'static void\nngx_http_upstream_connect(ngx_http_request_t *r, ngx_http_upstream_t *u)\n{\n    ngx_int_t          rc;\n    ngx_time_t        *tp;\n    ngx_connection_t  *c;\n    r->connection->log->action = "connecting to upstream";\n    if (u->state && u->state->response_sec) {\n        tp = ngx_timeofday();\n        u->state->response_sec = tp->sec - u->state->response_sec;\n        u->state->response_msec = tp->msec - u->state->response_msec;\n    }\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    tp = ngx_timeofday();\n    u->state->response_sec = tp->sec;\n    u->state->response_msec = tp->msec;\n    rc = ngx_event_connect_peer(&u->peer);\n    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,\n                   "http upstream connect: %i", rc);\n    if (rc == NGX_ERROR) {\n        ngx_http_upstream_finalize_request(r, u,\n                                           NGX_HTTP_INTERNAL_SERVER_ERROR);\n        return;\n    }\n    u->state->peer = u->peer.name;\n    if (rc == NGX_BUSY) {\n        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "no live upstreams");\n        ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_NOLIVE);\n        return;\n    }\n    if (rc == NGX_DECLINED) {\n        ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);\n        return;\n    }\n    c = u->peer.connection;\n    c->data = r;\n    c->write->handler = ngx_http_upstream_handler;\n    c->read->handler = ngx_http_upstream_handler;\n    u->write_event_handler = ngx_http_upstream_send_request_handler;\n    u->read_event_handler = ngx_http_upstream_process_header;\n    c->sendfile &= r->connection->sendfile;\n    u->output.sendfile = c->sendfile;\n    if (c->pool == NULL) {\n        c->pool = ngx_create_pool(128, r->connection->log);\n        if (c->pool == NULL) {\n            ngx_http_upstream_finalize_request(r, u,\n                                               NGX_HTTP_INTERNAL_SERVER_ERROR);\n            return;\n        }\n    }\n    c->log = r->connection->log;\n    c->pool->log = c->log;\n    c->read->log = c->log;\n    c->write->log = c->log;\n    u->writer.out = NULL;\n    u->writer.last = &u->writer.out;\n    u->writer.connection = c;\n    u->writer.limit = 0;\n    if (u->request_sent) {\n        if (ngx_http_upstream_reinit(r, u) != NGX_OK) {\n            ngx_http_upstream_finalize_request(r, u,\n                                               NGX_HTTP_INTERNAL_SERVER_ERROR);\n            return;\n        }\n    }\n    if (r->request_body\n        && r->request_body->buf\n        && r->request_body->temp_file\n        && r == r->main)\n    {\n        u->output.free = ngx_alloc_chain_link(r->pool);\n        if (u->output.free == NULL) {\n            ngx_http_upstream_finalize_request(r, u,\n                                               NGX_HTTP_INTERNAL_SERVER_ERROR);\n            return;\n        }\n        u->output.free->buf = r->request_body->buf;\n        u->output.free->next = NULL;\n        u->output.allocated = 1;\n        r->request_body->buf->pos = r->request_body->buf->start;\n        r->request_body->buf->last = r->request_body->buf->start;\n        r->request_body->buf->tag = u->output.tag;\n    }\n    u->request_sent = 0;\n    if (rc == NGX_AGAIN) {\n        ngx_add_timer(c->write, u->conf->connect_timeout);\n        return;\n    }\n#if (NGX_HTTP_SSL)\n    if (u->ssl && c->ssl == NULL) {\n        ngx_http_upstream_ssl_init_connection(r, u, c);\n        return;\n    }\n#endif\n    ngx_http_upstream_send_request(r, u);\n}', 'static void\nngx_http_upstream_send_request(ngx_http_request_t *r, ngx_http_upstream_t *u)\n{\n    ngx_int_t          rc;\n    ngx_connection_t  *c;\n    c = u->peer.connection;\n    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,\n                   "http upstream send request");\n    if (!u->request_sent && ngx_http_upstream_test_connect(c) != NGX_OK) {\n        ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);\n        return;\n    }\n    c->log->action = "sending request to upstream";\n    rc = ngx_output_chain(&u->output, u->request_sent ? NULL : u->request_bufs);\n    u->request_sent = 1;\n    if (rc == NGX_ERROR) {\n        ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);\n        return;\n    }\n    if (c->write->timer_set) {\n        ngx_del_timer(c->write);\n    }\n    if (rc == NGX_AGAIN) {\n        ngx_add_timer(c->write, u->conf->send_timeout);\n        if (ngx_handle_write_event(c->write, u->conf->send_lowat) != NGX_OK) {\n            ngx_http_upstream_finalize_request(r, u,\n                                               NGX_HTTP_INTERNAL_SERVER_ERROR);\n            return;\n        }\n        return;\n    }\n    if (c->tcp_nopush == NGX_TCP_NOPUSH_SET) {\n        if (ngx_tcp_push(c->fd) == NGX_ERROR) {\n            ngx_log_error(NGX_LOG_CRIT, c->log, ngx_socket_errno,\n                          ngx_tcp_push_n " failed");\n            ngx_http_upstream_finalize_request(r, u,\n                                               NGX_HTTP_INTERNAL_SERVER_ERROR);\n            return;\n        }\n        c->tcp_nopush = NGX_TCP_NOPUSH_UNSET;\n    }\n    ngx_add_timer(c->read, u->conf->read_timeout);\n    if (c->read->ready) {\n        ngx_http_upstream_process_header(r, u);\n        return;\n    }\n    u->write_event_handler = ngx_http_upstream_dummy_handler;\n    if (ngx_handle_write_event(c->write, 0) != NGX_OK) {\n        ngx_http_upstream_finalize_request(r, u,\n                                           NGX_HTTP_INTERNAL_SERVER_ERROR);\n        return;\n    }\n}', 'static void\nngx_http_upstream_process_header(ngx_http_request_t *r, ngx_http_upstream_t *u)\n{\n    ssize_t            n;\n    ngx_int_t          rc;\n    ngx_connection_t  *c;\n    c = u->peer.connection;\n    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,\n                   "http upstream process header");\n    c->log->action = "reading response header from upstream";\n    if (c->read->timedout) {\n        ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_TIMEOUT);\n        return;\n    }\n    if (!u->request_sent && ngx_http_upstream_test_connect(c) != NGX_OK) {\n        ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);\n        return;\n    }\n    if (u->buffer.start == NULL) {\n        u->buffer.start = ngx_palloc(r->pool, u->conf->buffer_size);\n        if (u->buffer.start == NULL) {\n            ngx_http_upstream_finalize_request(r, u,\n                                               NGX_HTTP_INTERNAL_SERVER_ERROR);\n            return;\n        }\n        u->buffer.pos = u->buffer.start;\n        u->buffer.last = u->buffer.start;\n        u->buffer.end = u->buffer.start + u->conf->buffer_size;\n        u->buffer.temporary = 1;\n        u->buffer.tag = u->output.tag;\n        if (ngx_list_init(&u->headers_in.headers, r->pool, 8,\n                          sizeof(ngx_table_elt_t))\n            != NGX_OK)\n        {\n            ngx_http_upstream_finalize_request(r, u,\n                                               NGX_HTTP_INTERNAL_SERVER_ERROR);\n            return;\n        }\n#if (NGX_HTTP_CACHE)\n        if (r->cache) {\n            u->buffer.pos += r->cache->header_start;\n            u->buffer.last = u->buffer.pos;\n        }\n#endif\n    }\n    for ( ;; ) {\n        n = c->recv(c, u->buffer.last, u->buffer.end - u->buffer.last);\n        if (n == NGX_AGAIN) {\n#if 0\n            ngx_add_timer(rev, u->read_timeout);\n#endif\n            if (ngx_handle_read_event(c->read, 0) != NGX_OK) {\n                ngx_http_upstream_finalize_request(r, u,\n                                               NGX_HTTP_INTERNAL_SERVER_ERROR);\n                return;\n            }\n            return;\n        }\n        if (n == 0) {\n            ngx_log_error(NGX_LOG_ERR, c->log, 0,\n                          "upstream prematurely closed connection");\n        }\n        if (n == NGX_ERROR || n == 0) {\n            ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);\n            return;\n        }\n        u->buffer.last += n;\n#if 0\n        u->valid_header_in = 0;\n        u->peer.cached = 0;\n#endif\n        rc = u->process_header(r);\n        if (rc == NGX_AGAIN) {\n            if (u->buffer.last == u->buffer.end) {\n                ngx_log_error(NGX_LOG_ERR, c->log, 0,\n                              "upstream sent too big header");\n                ngx_http_upstream_next(r, u,\n                                       NGX_HTTP_UPSTREAM_FT_INVALID_HEADER);\n                return;\n            }\n            continue;\n        }\n        break;\n    }\n    if (rc == NGX_HTTP_UPSTREAM_INVALID_HEADER) {\n        ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_INVALID_HEADER);\n        return;\n    }\n    if (rc == NGX_ERROR) {\n        ngx_http_upstream_finalize_request(r, u,\n                                           NGX_HTTP_INTERNAL_SERVER_ERROR);\n        return;\n    }\n    if (u->headers_in.status_n >= NGX_HTTP_SPECIAL_RESPONSE) {\n        if (r->subrequest_in_memory) {\n            u->buffer.last = u->buffer.pos;\n        }\n        if (ngx_http_upstream_test_next(r, u) == NGX_OK) {\n            return;\n        }\n        if (ngx_http_upstream_intercept_errors(r, u) == NGX_OK) {\n            return;\n        }\n    }\n    if (ngx_http_upstream_process_headers(r, u) != NGX_OK) {\n        return;\n    }\n    if (!r->subrequest_in_memory) {\n        ngx_http_upstream_send_response(r, u);\n        return;\n    }\n    if (u->input_filter == NULL) {\n        u->input_filter_init = ngx_http_upstream_non_buffered_filter_init;\n        u->input_filter = ngx_http_upstream_non_buffered_filter;\n        u->input_filter_ctx = r;\n    }\n    if (u->input_filter_init(u->input_filter_ctx) == NGX_ERROR) {\n        ngx_http_upstream_finalize_request(r, u,\n                                           NGX_HTTP_INTERNAL_SERVER_ERROR);\n        return;\n    }\n    n = u->buffer.last - u->buffer.pos;\n    if (n) {\n        u->buffer.last = u->buffer.pos;\n        u->state->response_length += n;\n        if (u->input_filter(u->input_filter_ctx, n) == NGX_ERROR) {\n            ngx_http_upstream_finalize_request(r, u, NGX_ERROR);\n            return;\n        }\n    }\n    if (u->length == 0) {\n        ngx_http_upstream_finalize_request(r, u, 0);\n        return;\n    }\n    u->read_event_handler = ngx_http_upstream_process_body_in_memory;\n    ngx_http_upstream_process_body_in_memory(r, u);\n}', 'static void\nngx_http_upstream_send_response(ngx_http_request_t *r, ngx_http_upstream_t *u)\n{\n    int                        tcp_nodelay;\n    ssize_t                    n;\n    ngx_int_t                  rc;\n    ngx_event_pipe_t          *p;\n    ngx_connection_t          *c;\n    ngx_http_core_loc_conf_t  *clcf;\n    rc = ngx_http_send_header(r);\n    if (rc == NGX_ERROR || rc > NGX_OK || r->post_action) {\n        ngx_http_upstream_finalize_request(r, u, rc);\n        return;\n    }\n    if (u->upgrade) {\n        ngx_http_upstream_upgrade(r, u);\n        return;\n    }\n    c = r->connection;\n    if (r->header_only) {\n        if (u->cacheable || u->store) {\n            if (ngx_shutdown_socket(c->fd, NGX_WRITE_SHUTDOWN) == -1) {\n                ngx_connection_error(c, ngx_socket_errno,\n                                     ngx_shutdown_socket_n " failed");\n            }\n            r->read_event_handler = ngx_http_request_empty_handler;\n            r->write_event_handler = ngx_http_request_empty_handler;\n            c->error = 1;\n        } else {\n            ngx_http_upstream_finalize_request(r, u, rc);\n            return;\n        }\n    }\n    u->header_sent = 1;\n    if (r->request_body && r->request_body->temp_file) {\n        ngx_pool_run_cleanup_file(r->pool, r->request_body->temp_file->file.fd);\n        r->request_body->temp_file->file.fd = NGX_INVALID_FILE;\n    }\n    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);\n    if (!u->buffering) {\n        if (u->input_filter == NULL) {\n            u->input_filter_init = ngx_http_upstream_non_buffered_filter_init;\n            u->input_filter = ngx_http_upstream_non_buffered_filter;\n            u->input_filter_ctx = r;\n        }\n        u->read_event_handler = ngx_http_upstream_process_non_buffered_upstream;\n        r->write_event_handler =\n                             ngx_http_upstream_process_non_buffered_downstream;\n        r->limit_rate = 0;\n        if (u->input_filter_init(u->input_filter_ctx) == NGX_ERROR) {\n            ngx_http_upstream_finalize_request(r, u, 0);\n            return;\n        }\n        if (clcf->tcp_nodelay && c->tcp_nodelay == NGX_TCP_NODELAY_UNSET) {\n            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "tcp_nodelay");\n            tcp_nodelay = 1;\n            if (setsockopt(c->fd, IPPROTO_TCP, TCP_NODELAY,\n                               (const void *) &tcp_nodelay, sizeof(int)) == -1)\n            {\n                ngx_connection_error(c, ngx_socket_errno,\n                                     "setsockopt(TCP_NODELAY) failed");\n                ngx_http_upstream_finalize_request(r, u, 0);\n                return;\n            }\n            c->tcp_nodelay = NGX_TCP_NODELAY_SET;\n        }\n        n = u->buffer.last - u->buffer.pos;\n        if (n) {\n            u->buffer.last = u->buffer.pos;\n            u->state->response_length += n;\n            if (u->input_filter(u->input_filter_ctx, n) == NGX_ERROR) {\n                ngx_http_upstream_finalize_request(r, u, 0);\n                return;\n            }\n            ngx_http_upstream_process_non_buffered_downstream(r);\n        } else {\n            u->buffer.pos = u->buffer.start;\n            u->buffer.last = u->buffer.start;\n            if (ngx_http_send_special(r, NGX_HTTP_FLUSH) == NGX_ERROR) {\n                ngx_http_upstream_finalize_request(r, u, 0);\n                return;\n            }\n            if (u->peer.connection->read->ready || u->length == 0) {\n                ngx_http_upstream_process_non_buffered_upstream(r, u);\n            }\n        }\n        return;\n    }\n#if (NGX_HTTP_CACHE)\n    if (r->cache && r->cache->file.fd != NGX_INVALID_FILE) {\n        ngx_pool_run_cleanup_file(r->pool, r->cache->file.fd);\n        r->cache->file.fd = NGX_INVALID_FILE;\n    }\n    switch (ngx_http_test_predicates(r, u->conf->no_cache)) {\n    case NGX_ERROR:\n        ngx_http_upstream_finalize_request(r, u, 0);\n        return;\n    case NGX_DECLINED:\n        u->cacheable = 0;\n        break;\n    default:\n        if (u->cache_status == NGX_HTTP_CACHE_BYPASS) {\n            r->cache->min_uses = u->conf->cache_min_uses;\n            r->cache->body_start = u->conf->buffer_size;\n            r->cache->file_cache = u->conf->cache->data;\n            if (ngx_http_file_cache_create(r) != NGX_OK) {\n                ngx_http_upstream_finalize_request(r, u, 0);\n                return;\n            }\n        }\n        break;\n    }\n    if (u->cacheable) {\n        time_t  now, valid;\n        now = ngx_time();\n        valid = r->cache->valid_sec;\n        if (valid == 0) {\n            valid = ngx_http_file_cache_valid(u->conf->cache_valid,\n                                              u->headers_in.status_n);\n            if (valid) {\n                r->cache->valid_sec = now + valid;\n            }\n        }\n        if (valid) {\n            r->cache->last_modified = r->headers_out.last_modified_time;\n            r->cache->date = now;\n            r->cache->body_start = (u_short) (u->buffer.pos - u->buffer.start);\n            ngx_http_file_cache_set_header(r, u->buffer.start);\n        } else {\n            u->cacheable = 0;\n            r->headers_out.last_modified_time = -1;\n        }\n    }\n    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,\n                   "http cacheable: %d", u->cacheable);\n    if (u->cacheable == 0 && r->cache) {\n        ngx_http_file_cache_free(r->cache, u->pipe->temp_file);\n    }\n#endif\n    p = u->pipe;\n    p->output_filter = (ngx_event_pipe_output_filter_pt) ngx_http_output_filter;\n    p->output_ctx = r;\n    p->tag = u->output.tag;\n    p->bufs = u->conf->bufs;\n    p->busy_size = u->conf->busy_buffers_size;\n    p->upstream = u->peer.connection;\n    p->downstream = c;\n    p->pool = r->pool;\n    p->log = c->log;\n    p->cacheable = u->cacheable || u->store;\n    p->temp_file = ngx_pcalloc(r->pool, sizeof(ngx_temp_file_t));\n    if (p->temp_file == NULL) {\n        ngx_http_upstream_finalize_request(r, u, 0);\n        return;\n    }\n    p->temp_file->file.fd = NGX_INVALID_FILE;\n    p->temp_file->file.log = c->log;\n    p->temp_file->path = u->conf->temp_path;\n    p->temp_file->pool = r->pool;\n    if (p->cacheable) {\n        p->temp_file->persistent = 1;\n    } else {\n        p->temp_file->log_level = NGX_LOG_WARN;\n        p->temp_file->warn = "an upstream response is buffered "\n                             "to a temporary file";\n    }\n    p->max_temp_file_size = u->conf->max_temp_file_size;\n    p->temp_file_write_size = u->conf->temp_file_write_size;\n    p->preread_bufs = ngx_alloc_chain_link(r->pool);\n    if (p->preread_bufs == NULL) {\n        ngx_http_upstream_finalize_request(r, u, 0);\n        return;\n    }\n    p->preread_bufs->buf = &u->buffer;\n    p->preread_bufs->next = NULL;\n    u->buffer.recycled = 1;\n    p->preread_size = u->buffer.last - u->buffer.pos;\n    if (u->cacheable) {\n        p->buf_to_file = ngx_calloc_buf(r->pool);\n        if (p->buf_to_file == NULL) {\n            ngx_http_upstream_finalize_request(r, u, 0);\n            return;\n        }\n        p->buf_to_file->start = u->buffer.start;\n        p->buf_to_file->pos = u->buffer.start;\n        p->buf_to_file->last = u->buffer.pos;\n        p->buf_to_file->temporary = 1;\n    }\n    if (ngx_event_flags & NGX_USE_AIO_EVENT) {\n        p->single_buf = 1;\n    }\n    p->free_bufs = 1;\n    u->buffer.last = u->buffer.pos;\n    if (u->conf->cyclic_temp_file) {\n        p->cyclic_temp_file = 1;\n        c->sendfile = 0;\n    } else {\n        p->cyclic_temp_file = 0;\n    }\n    p->read_timeout = u->conf->read_timeout;\n    p->send_timeout = clcf->send_timeout;\n    p->send_lowat = clcf->send_lowat;\n    p->length = -1;\n    if (u->input_filter_init\n        && u->input_filter_init(p->input_ctx) != NGX_OK)\n    {\n        ngx_http_upstream_finalize_request(r, u, 0);\n        return;\n    }\n    u->read_event_handler = ngx_http_upstream_process_upstream;\n    r->write_event_handler = ngx_http_upstream_process_downstream;\n    ngx_http_upstream_process_upstream(r, u);\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_time_t  *tp;\n    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,\n                   "finalize http upstream request: %i", rc);\n    if (u->cleanup) {\n        *u->cleanup = NULL;\n        u->cleanup = NULL;\n    }\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_sec) {\n        tp = ngx_timeofday();\n        u->state->response_sec = tp->sec - u->state->response_sec;\n        u->state->response_msec = tp->msec - u->state->response_msec;\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 (u->header_sent\n        && rc != NGX_HTTP_REQUEST_TIME_OUT\n        && (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE))\n    {\n        rc = 0;\n    }\n    if (rc == NGX_DECLINED) {\n        return;\n    }\n    r->connection->log->action = "sending to client";\n    if (rc == 0\n        && !r->header_only\n#if (NGX_HTTP_CACHE)\n        && !r->cached\n#endif\n       )\n    {\n        rc = ngx_http_send_special(r, NGX_HTTP_LAST);\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            r->main->subrequests++;\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: %d, \\"%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.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.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}"]