diff options
Diffstat (limited to 'src/http')
-rw-r--r-- | src/http/ngx_http_core_module.c | 45 | ||||
-rw-r--r-- | src/http/ngx_http_core_module.h | 2 | ||||
-rw-r--r-- | src/http/ngx_http_header_filter.c | 2 | ||||
-rw-r--r-- | src/http/ngx_http_log_handler.c | 16 | ||||
-rw-r--r-- | src/http/ngx_http_parse.c | 6 | ||||
-rw-r--r-- | src/http/ngx_http_request.c | 65 | ||||
-rw-r--r-- | src/http/ngx_http_request.h | 2 |
7 files changed, 92 insertions, 46 deletions
diff --git a/src/http/ngx_http_core_module.c b/src/http/ngx_http_core_module.c index 2f5c92345..6d20fdf7f 100644 --- a/src/http/ngx_http_core_module.c +++ b/src/http/ngx_http_core_module.c @@ -407,14 +407,17 @@ int ngx_http_find_location_config(ngx_http_request_t *r) clcfp = cscf->locations.elts; for (i = 0; i < cscf->locations.nelts; i++) { -#if 1 -ngx_log_debug(r->connection->log, "trans: %s: %d" _ - clcfp[i]->name.data _ clcfp[i]->exact_match); -#endif +#if (HAVE_PCRE) if (clcfp[i]->regex) { break; } +#endif + + ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "find location: %s\"%s\"", + clcfp[i]->exact_match ? "= " : "", + clcfp[i]->name.data); if (clcfp[i]->auto_redirect && r->uri.len == clcfp[i]->name.len - 1 @@ -449,20 +452,23 @@ ngx_log_debug(r->connection->log, "trans: %s: %d" _ } } +#if (HAVE_PCRE) + if (!exact && !auto_redirect) { /* regex matches */ for (/* void */; i < cscf->locations.nelts; i++) { -#if 1 -ngx_log_debug(r->connection->log, "trans: %s: %d" _ - clcfp[i]->name.data _ clcfp[i]->exact_match); -#endif - if (!clcfp[i]->regex) { continue; } + ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "find location: %s\"%s\"", + clcfp[i]->exact_match ? "= " : + clcfp[i]->regex ? "~ " : "", + clcfp[i]->name.data); + rc = ngx_regex_exec(clcfp[i]->regex, &r->uri); if (rc == NGX_DECLINED) { @@ -488,6 +494,8 @@ ngx_log_debug(r->connection->log, "trans: %s: %d" _ } } +#endif /* HAVE_PCRE */ + clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); if (!(ngx_io.flags & NGX_IO_SENDFILE) || !clcf->sendfile) { @@ -504,10 +512,6 @@ ngx_log_debug(r->connection->log, "trans: %s: %d" _ return NGX_HTTP_INTERNAL_SERVER_ERROR; } -#if 0 - r->headers_out.location->key.len = 8; - r->headers_out.location->key.data = "Location"; -#endif r->headers_out.location->value = *auto_redirect; return NGX_HTTP_MOVED_PERMANENTLY; @@ -614,7 +618,8 @@ int ngx_http_internal_redirect(ngx_http_request_t *r, { int i; - ngx_log_debug(r->connection->log, "internal redirect: '%s'" _ uri->data); + ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "internal redirect: \"%s\"", uri->data); r->uri.len = uri->len; r->uri.data = uri->data; @@ -798,6 +803,8 @@ static int ngx_cmp_locations(const void *one, const void *two) ngx_int_t rc; +#if (HAVE_PCRE) + if (first->regex && !second->regex) { /* shift regex matches to the end */ return 1; @@ -808,6 +815,8 @@ static int ngx_cmp_locations(const void *one, const void *two) return 0; } +#endif + rc = ngx_strcmp(first->name.data, second->name.data); if (rc == 0 && second->exact_match) { @@ -876,6 +885,7 @@ static char *ngx_location_block(ngx_conf_t *cf, ngx_command_t *cmd, void *dummy) && value[1].data[0] == '~' && value[1].data[1] == '*')) { +#if (HAVE_PCRE) err.len = NGX_MAX_CONF_ERRSTR; err.data = errstr; @@ -890,6 +900,13 @@ static char *ngx_location_block(ngx_conf_t *cf, ngx_command_t *cmd, void *dummy) clcf->name.len = value[2].len; clcf->name.data = value[2].data; +#else + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "the using of the regex \"%s\" " + "requires PCRE library", + value[2].data); + return NGX_CONF_ERROR; +#endif } else { ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, diff --git a/src/http/ngx_http_core_module.h b/src/http/ngx_http_core_module.h index ed228d791..17ee46fcb 100644 --- a/src/http/ngx_http_core_module.h +++ b/src/http/ngx_http_core_module.h @@ -134,7 +134,9 @@ typedef struct { ngx_http_cache_hash_t *open_files; +#if (HAVE_PCRE) ngx_regex_t *regex; +#endif unsigned exact_match:1; unsigned auto_redirect:1; diff --git a/src/http/ngx_http_header_filter.c b/src/http/ngx_http_header_filter.c index 49f1dba2d..e3731d7ee 100644 --- a/src/http/ngx_http_header_filter.c +++ b/src/http/ngx_http_header_filter.c @@ -340,6 +340,8 @@ static int ngx_http_header_filter(ngx_http_request_t *r) /* the end of HTTP header */ *(h->last++) = CR; *(h->last++) = LF; + r->header_size = h->last - h->pos; + if (r->header_only) { h->type |= NGX_HUNK_LAST; } diff --git a/src/http/ngx_http_log_handler.c b/src/http/ngx_http_log_handler.c index ff943950c..caef96750 100644 --- a/src/http/ngx_http_log_handler.c +++ b/src/http/ngx_http_log_handler.c @@ -19,6 +19,8 @@ static char *ngx_http_log_status(ngx_http_request_t *r, char *buf, uintptr_t data); static char *ngx_http_log_length(ngx_http_request_t *r, char *buf, uintptr_t data); +static char *ngx_http_log_apache_length(ngx_http_request_t *r, char *buf, + uintptr_t data); static char *ngx_http_log_header_in(ngx_http_request_t *r, char *buf, uintptr_t data); static char *ngx_http_log_connection_header_out(ngx_http_request_t *r, @@ -97,7 +99,7 @@ static char *months[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; static ngx_str_t ngx_http_combined_fmt = - ngx_string("%addr - - [%time] \"%request\" %status %length " + ngx_string("%addr - - [%time] \"%request\" %status %apache_length " "\"%{Referer}i\" %{User-Agent}i\""); @@ -110,6 +112,7 @@ ngx_http_log_op_name_t ngx_http_log_fmt_ops[] = { { ngx_string("request"), 0, ngx_http_log_request }, { ngx_string("status"), 3, ngx_http_log_status }, { ngx_string("length"), NGX_OFF_T_LEN, ngx_http_log_length }, + { ngx_string("apache_length"), NGX_OFF_T_LEN, ngx_http_log_apache_length }, { ngx_string("i"), NGX_HTTP_LOG_ARG, ngx_http_log_header_in }, { ngx_string("o"), NGX_HTTP_LOG_ARG, ngx_http_log_header_out }, { ngx_null_string, 0, NULL } @@ -129,7 +132,8 @@ int ngx_http_log_handler(ngx_http_request_t *r) u_int written; #endif - ngx_log_debug(r->connection->log, "log handler"); + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "http log handler"); lcf = ngx_http_get_module_loc_conf(r, ngx_http_log_module); @@ -248,6 +252,14 @@ static char *ngx_http_log_length(ngx_http_request_t *r, char *buf, } +static char *ngx_http_log_apache_length(ngx_http_request_t *r, char *buf, + uintptr_t data) +{ + return buf + ngx_snprintf(buf, NGX_OFF_T_LEN + 1, OFF_T_FMT, + r->connection->sent - r->header_size); +} + + static char *ngx_http_log_header_in(ngx_http_request_t *r, char *buf, uintptr_t data) { diff --git a/src/http/ngx_http_parse.c b/src/http/ngx_http_parse.c index 5dc0bc3bd..599114c49 100644 --- a/src/http/ngx_http_parse.c +++ b/src/http/ngx_http_parse.c @@ -3,7 +3,7 @@ #include <ngx_core.h> #include <ngx_http.h> -int ngx_http_parse_request_line(ngx_http_request_t *r) +ngx_int_t ngx_http_parse_request_line(ngx_http_request_t *r) { char ch, *p; enum { @@ -419,7 +419,7 @@ int ngx_http_parse_request_line(ngx_http_request_t *r) } -int ngx_http_parse_header_line(ngx_http_request_t *r, ngx_hunk_t *h) +ngx_int_t ngx_http_parse_header_line(ngx_http_request_t *r, ngx_hunk_t *h) { char c, ch, *p; enum { @@ -621,7 +621,7 @@ int ngx_http_parse_header_line(ngx_http_request_t *r, ngx_hunk_t *h) } -int ngx_http_parse_complex_uri(ngx_http_request_t *r) +ngx_int_t ngx_http_parse_complex_uri(ngx_http_request_t *r) { char c, ch, decoded, *p, *u; enum { diff --git a/src/http/ngx_http_request.c b/src/http/ngx_http_request.c index 51478c6b1..66bf9be47 100644 --- a/src/http/ngx_http_request.c +++ b/src/http/ngx_http_request.c @@ -42,10 +42,12 @@ static char *client_header_errors[] = { }; +#if 0 static void ngx_http_dummy(ngx_event_t *wev) { return; } +#endif void ngx_http_init_connection(ngx_connection_t *c) @@ -110,7 +112,7 @@ void ngx_http_init_connection(ngx_connection_t *c) static void ngx_http_init_request(ngx_event_t *rev) { - int i; + ngx_int_t i; socklen_t len; struct sockaddr_in addr_in; ngx_connection_t *c; @@ -147,8 +149,6 @@ static void ngx_http_init_request(ngx_event_t *rev) in_port = c->servers; in_addr = in_port->addrs.elts; -ngx_log_debug(rev->log, "IN: %08x" _ in_port); - r->port = in_port->port; r->port_name = &in_port->port_name; @@ -274,8 +274,8 @@ ngx_log_debug(rev->log, "IN: %08x" _ in_port); static void ngx_http_process_request_line(ngx_event_t *rev) { - int rc, offset; ssize_t n; + ngx_int_t rc, offset; ngx_connection_t *c; ngx_http_request_t *r; ngx_http_log_ctx_t *ctx; @@ -439,15 +439,18 @@ static void ngx_http_process_request_line(ngx_event_t *rev) ngx_cpystrn(r->args.data, r->args_start, r->args.len + 1); } -#if 1 /* DEBUG */ - if (r->exten.data == NULL) { r->exten.data = ""; } - if (r->args.data == NULL) { r->args.data = ""; } - ngx_log_debug(c->log, "HTTP: %d, %d, '%s', '%s', '%s'" _ - r->method _ r->http_version _ - r->uri.data _ r->exten.data _ r->args.data); - if (r->exten.data[0] == '\0') { r->exten.data = NULL; } - if (r->args.data[0] == '\0') { r->args.data = NULL; } -#endif + ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, + "http request line: \"%s\"", r->request_line.data); + + ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, + "http uri: \"%s\"", r->uri.data); + + ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, + "http args: \"%s\"", r->args.data ? r->args.data : ""); + + ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, + "http exten: \"%s\"", + r->exten.data ? r->exten.data : ""); if (r->http_version < NGX_HTTP_VERSION_10) { rev->event_handler = ngx_http_block_read; @@ -532,8 +535,8 @@ static void ngx_http_process_request_line(ngx_event_t *rev) static void ngx_http_process_request_headers(ngx_event_t *rev) { - int rc, i, offset; ssize_t n; + ngx_int_t rc, i, offset; ngx_table_elt_t *h; ngx_connection_t *c; ngx_http_request_t *r; @@ -616,8 +619,9 @@ static void ngx_http_process_request_headers(ngx_event_t *rev) } } - ngx_log_debug(r->connection->log, "HTTP header: '%s: %s'" _ - h->key.data _ h->value.data); + ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "http header: \"%s: %s\"'", + h->key.data, h->value.data); if (cscf->large_client_header && r->header_in->pos == r->header_in->last) @@ -631,7 +635,8 @@ static void ngx_http_process_request_headers(ngx_event_t *rev) /* a whole header has been parsed successfully */ - ngx_log_debug(r->connection->log, "HTTP header done"); + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "http header done"); rc = ngx_http_process_request_header(r); @@ -746,10 +751,10 @@ static ssize_t ngx_http_read_request_header(ngx_http_request_t *r) } -static int ngx_http_process_request_header(ngx_http_request_t *r) +static ngx_int_t ngx_http_process_request_header(ngx_http_request_t *r) { - int i; size_t len; + ngx_int_t i; ngx_http_server_name_t *name; ngx_http_core_loc_conf_t *clcf; @@ -828,13 +833,16 @@ static int ngx_http_process_request_header(ngx_http_request_t *r) void ngx_http_finalize_request(ngx_http_request_t *r, int rc) { + ngx_http_core_loc_conf_t *clcf; + /* r can be already destroyed when rc == NGX_DONE */ if (rc == NGX_DONE || r->main) { return; } - ngx_log_debug(r->connection->log, "finalize http request"); + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "http finalize request"); if (rc >= NGX_HTTP_SPECIAL_RESPONSE) { @@ -868,10 +876,12 @@ void ngx_http_finalize_request(ngx_http_request_t *r, int rc) ngx_del_timer(r->connection->write); } - if (r->keepalive != 0) { + clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); + + if (r->keepalive != 0 && clcf->keepalive_timeout > 0) { ngx_http_set_keepalive(r); - } else if (r->lingering_close) { + } else if (r->lingering_close && clcf->lingering_timeout > 0) { ngx_http_set_lingering_close(r); } else { @@ -916,7 +926,7 @@ void ngx_http_writer(ngx_event_t *wev) ngx_http_request_t *r; ngx_http_core_loc_conf_t *clcf; - ngx_log_debug(wev->log, "http writer handler"); + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, wev->log, 0, "http writer handler"); c = wev->data; r = c->data; @@ -934,7 +944,8 @@ void ngx_http_writer(ngx_event_t *wev) rc = ngx_http_output_filter(r, NULL); - ngx_log_debug(c->log, "writer output filter: %d" _ rc); + ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, + "http writer output filter: %d", rc); if (rc == NGX_AGAIN) { if (!wev->ready) { @@ -951,7 +962,7 @@ void ngx_http_writer(ngx_event_t *wev) return; } - ngx_log_debug(c->log, "http writer done"); + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http writer done"); ngx_http_finalize_request(r, rc); } @@ -962,7 +973,7 @@ static void ngx_http_block_read(ngx_event_t *rev) ngx_connection_t *c; ngx_http_request_t *r; - ngx_log_debug(rev->log, "http read blocked"); + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, rev->log, 0, "http read blocked"); /* aio does not call this handler */ @@ -986,7 +997,7 @@ int ngx_http_discard_body(ngx_http_request_t *r) rev = r->connection->read; - ngx_log_debug(rev->log, "set discard body"); + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, rev->log, 0, "http set discard body"); if (rev->timer_set) { ngx_del_timer(rev); diff --git a/src/http/ngx_http_request.h b/src/http/ngx_http_request.h index 82e8bf79b..785c8e16e 100644 --- a/src/http/ngx_http_request.h +++ b/src/http/ngx_http_request.h @@ -217,6 +217,8 @@ struct ngx_http_request_s { ngx_array_t cleanup; + size_t header_size; + char *discarded_buffer; void **err_ctx; int err_status; |