aboutsummaryrefslogtreecommitdiff
path: root/src/http/ngx_http_core_module.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/http/ngx_http_core_module.c')
-rw-r--r--src/http/ngx_http_core_module.c438
1 files changed, 286 insertions, 152 deletions
diff --git a/src/http/ngx_http_core_module.c b/src/http/ngx_http_core_module.c
index bf455d867..10fcb8790 100644
--- a/src/http/ngx_http_core_module.c
+++ b/src/http/ngx_http_core_module.c
@@ -17,10 +17,10 @@
#define NGX_HTTP_LOCATION_REGEX 4
-static void ngx_http_phase_event_handler(ngx_event_t *rev);
-static void ngx_http_run_phases(ngx_http_request_t *r);
-static ngx_int_t ngx_http_find_location(ngx_http_request_t *r,
- ngx_array_t *locations, size_t len);
+static void ngx_http_core_phase_event_handler(ngx_event_t *rev);
+static void ngx_http_core_run_phases(ngx_http_request_t *r);
+static ngx_int_t ngx_http_core_find_location(ngx_http_request_t *r,
+ ngx_array_t *locations, size_t len);
static void *ngx_http_core_create_main_conf(ngx_conf_t *cf);
static char *ngx_http_core_init_main_conf(ngx_conf_t *cf, void *conf);
@@ -31,23 +31,33 @@ static void *ngx_http_core_create_loc_conf(ngx_conf_t *cf);
static char *ngx_http_core_merge_loc_conf(ngx_conf_t *cf,
void *parent, void *child);
-static char *ngx_server_block(ngx_conf_t *cf, ngx_command_t *cmd, void *dummy);
-static int ngx_cmp_locations(const void *first, const void *second);
-static char *ngx_location_block(ngx_conf_t *cf, ngx_command_t *cmd,
- void *dummy);
-static char *ngx_types_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
-static char *ngx_set_type(ngx_conf_t *cf, ngx_command_t *dummy, void *conf);
-static char *ngx_http_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
-static char *ngx_set_server_name(ngx_conf_t *cf, ngx_command_t *cmd,
+static char *ngx_http_core_server(ngx_conf_t *cf, ngx_command_t *cmd,
+ void *dummy);
+static char *ngx_http_core_location(ngx_conf_t *cf, ngx_command_t *cmd,
+ void *dummy);
+static int ngx_http_core_cmp_locations(const void *first, const void *second);
+
+static char *ngx_http_core_types(ngx_conf_t *cf, ngx_command_t *cmd,
void *conf);
-static char *ngx_set_root(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
-static char *ngx_set_error_page(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
-static char *ngx_set_error_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
-static char *ngx_set_keepalive(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
+static char *ngx_http_core_type(ngx_conf_t *cf, ngx_command_t *dummy,
+ void *conf);
+
+static char *ngx_http_core_listen(ngx_conf_t *cf, ngx_command_t *cmd,
+ void *conf);
+static char *ngx_http_core_server_name(ngx_conf_t *cf, ngx_command_t *cmd,
+ void *conf);
+static char *ngx_http_core_root(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
+static char *ngx_http_core_error_page(ngx_conf_t *cf, ngx_command_t *cmd,
+ void *conf);
+static char *ngx_http_core_error_log(ngx_conf_t *cf, ngx_command_t *cmd,
+ void *conf);
+static char *ngx_http_core_keepalive(ngx_conf_t *cf, ngx_command_t *cmd,
+ void *conf);
-static char *ngx_http_lowat_check(ngx_conf_t *cf, void *post, void *data);
+static char *ngx_http_core_lowat_check(ngx_conf_t *cf, void *post, void *data);
-static ngx_conf_post_t ngx_http_lowat_post = { ngx_http_lowat_check } ;
+static ngx_conf_post_t ngx_http_core_lowat_post =
+ { ngx_http_core_lowat_check };
static ngx_conf_enum_t ngx_http_restrict_host_names[] = {
@@ -76,7 +86,7 @@ static ngx_command_t ngx_http_core_commands[] = {
{ ngx_string("server"),
NGX_HTTP_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,
- ngx_server_block,
+ ngx_http_core_server,
0,
0,
NULL },
@@ -132,7 +142,7 @@ static ngx_command_t ngx_http_core_commands[] = {
{ ngx_string("location"),
NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_BLOCK|NGX_CONF_TAKE12,
- ngx_location_block,
+ ngx_http_core_location,
NGX_HTTP_SRV_CONF_OFFSET,
0,
NULL },
@@ -143,14 +153,14 @@ static ngx_command_t ngx_http_core_commands[] = {
#else
NGX_HTTP_SRV_CONF|NGX_CONF_TAKE12,
#endif
- ngx_http_listen,
+ ngx_http_core_listen,
NGX_HTTP_SRV_CONF_OFFSET,
0,
NULL },
{ ngx_string("server_name"),
NGX_HTTP_SRV_CONF|NGX_CONF_1MORE,
- ngx_set_server_name,
+ ngx_http_core_server_name,
NGX_HTTP_SRV_CONF_OFFSET,
0,
NULL },
@@ -158,7 +168,7 @@ static ngx_command_t ngx_http_core_commands[] = {
{ ngx_string("types"),
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF
|NGX_CONF_BLOCK|NGX_CONF_NOARGS,
- ngx_types_block,
+ ngx_http_core_types,
NGX_HTTP_LOC_CONF_OFFSET,
0,
NULL },
@@ -172,14 +182,14 @@ static ngx_command_t ngx_http_core_commands[] = {
{ ngx_string("root"),
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
- ngx_set_root,
+ ngx_http_core_root,
NGX_HTTP_LOC_CONF_OFFSET,
0,
NULL },
{ ngx_string("alias"),
NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
- ngx_set_root,
+ ngx_http_core_root,
NGX_HTTP_LOC_CONF_OFFSET,
0,
NULL },
@@ -245,7 +255,7 @@ static ngx_command_t ngx_http_core_commands[] = {
ngx_conf_set_size_slot,
NGX_HTTP_LOC_CONF_OFFSET,
offsetof(ngx_http_core_loc_conf_t, send_lowat),
- &ngx_http_lowat_post },
+ &ngx_http_core_lowat_post },
{ ngx_string("postpone_output"),
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
@@ -255,7 +265,8 @@ static ngx_command_t ngx_http_core_commands[] = {
NULL },
{ ngx_string("limit_rate"),
- NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
+ NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF
+ |NGX_CONF_TAKE1,
ngx_conf_set_size_slot,
NGX_HTTP_LOC_CONF_OFFSET,
offsetof(ngx_http_core_loc_conf_t, limit_rate),
@@ -263,7 +274,7 @@ static ngx_command_t ngx_http_core_commands[] = {
{ ngx_string("keepalive_timeout"),
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,
- ngx_set_keepalive,
+ ngx_http_core_keepalive,
NGX_HTTP_LOC_CONF_OFFSET,
0,
NULL },
@@ -298,14 +309,14 @@ static ngx_command_t ngx_http_core_commands[] = {
{ ngx_string("error_page"),
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_2MORE,
- ngx_set_error_page,
+ ngx_http_core_error_page,
NGX_HTTP_LOC_CONF_OFFSET,
0,
NULL },
{ ngx_string("error_log"),
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,
- ngx_set_error_log,
+ ngx_http_core_error_log,
NGX_HTTP_LOC_CONF_OFFSET,
0,
NULL },
@@ -399,15 +410,18 @@ void ngx_http_handler(ngx_http_request_t *r)
/* TEST STUB */ r->lingering_close = 1;
#endif
- r->connection->write->event_handler = ngx_http_phase_event_handler;
+ r->connection->write->event_handler = ngx_http_core_phase_event_handler;
- ngx_http_run_phases(r);
+ r->uri_changed = 1;
+ r->uri_changes = 11;
+
+ ngx_http_core_run_phases(r);
return;
}
-static void ngx_http_phase_event_handler(ngx_event_t *ev)
+static void ngx_http_core_phase_event_handler(ngx_event_t *ev)
{
ngx_connection_t *c;
ngx_http_request_t *r;
@@ -417,15 +431,14 @@ static void ngx_http_phase_event_handler(ngx_event_t *ev)
ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ev->log, 0, "phase event handler");
- ngx_http_run_phases(r);
+ ngx_http_core_run_phases(r);
return;
}
-static void ngx_http_run_phases(ngx_http_request_t *r)
+static void ngx_http_core_run_phases(ngx_http_request_t *r)
{
- char *path;
ngx_int_t rc;
ngx_http_handler_pt *h;
ngx_http_core_loc_conf_t *clcf;
@@ -435,10 +448,38 @@ static void ngx_http_run_phases(ngx_http_request_t *r)
for (/* void */; r->phase < NGX_HTTP_LAST_PHASE; r->phase++) {
+ if (r->phase == NGX_HTTP_FIND_CONFIG_PHASE && !r->uri_changed) {
+ continue;
+ }
+
+ if (r->phase == NGX_HTTP_FIND_CONFIG_PHASE + 1 && r->uri_changed) {
+
+ ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
+ "uri changes: %d", r->uri_changes);
+
+ /*
+ * gcc before 3.3 compiles the broken code for
+ * if (r->uri_changes-- == 0)
+ * if the r->uri_changes is defined as
+ * unsigned uri_changes:4
+ */
+
+ r->uri_changes--;
+
+ if (r->uri_changes == 0) {
+ ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
+ "rewrite cycle");
+ ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
+ return;
+ }
+
+ r->uri_changed = 0;
+ r->phase = NGX_HTTP_REWRITE_PHASE;
+ }
+
if (r->phase == NGX_HTTP_CONTENT_PHASE && r->content_handler) {
r->connection->write->event_handler = ngx_http_empty_handler;
- rc = r->content_handler(r);
- ngx_http_finalize_request(r, rc);
+ ngx_http_finalize_request(r, r->content_handler(r));
return;
}
@@ -483,21 +524,15 @@ static void ngx_http_run_phases(ngx_http_request_t *r)
}
}
+ /* no content handler was found */
if (r->uri.data[r->uri.len - 1] == '/') {
clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
- if (!(path = ngx_palloc(r->pool, clcf->root.len + r->uri.len))) {
- ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
- return;
- }
-
- ngx_cpystrn(ngx_cpymem(path, clcf->root.data, clcf->root.len),
- r->uri.data, r->uri.len + 1);
-
ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
- "directory index of \"%s\" is forbidden", path);
+ "directory index of \"%V%V\" is forbidden",
+ &clcf->root, &r->uri);
ngx_http_finalize_request(r, NGX_HTTP_FORBIDDEN);
return;
@@ -518,7 +553,7 @@ ngx_int_t ngx_http_find_location_config(ngx_http_request_t *r)
cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);
- rc = ngx_http_find_location(r, &cscf->locations, 0);
+ rc = ngx_http_core_find_location(r, &cscf->locations, 0);
if (rc == NGX_HTTP_INTERNAL_SERVER_ERROR) {
return rc;
@@ -583,8 +618,8 @@ ngx_int_t ngx_http_find_location_config(ngx_http_request_t *r)
}
-static ngx_int_t ngx_http_find_location(ngx_http_request_t *r,
- ngx_array_t *locations, size_t len)
+static ngx_int_t ngx_http_core_find_location(ngx_http_request_t *r,
+ ngx_array_t *locations, size_t len)
{
ngx_int_t n, rc;
ngx_uint_t i, found, noregex;
@@ -604,6 +639,10 @@ static ngx_int_t ngx_http_find_location(ngx_http_request_t *r,
}
#endif
+ if (clcfp[i]->noname) {
+ break;
+ }
+
ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
"find location: %s\"%V\"",
clcfp[i]->exact_match ? "= " : "", &clcfp[i]->name);
@@ -632,9 +671,14 @@ static ngx_int_t ngx_http_find_location(ngx_http_request_t *r,
}
if (n == 0) {
- if (clcfp[i]->exact_match && r->uri.len == clcfp[i]->name.len) {
- r->loc_conf = clcfp[i]->loc_conf;
- return NGX_HTTP_LOCATION_EXACT;
+ if (clcfp[i]->exact_match) {
+
+ if (r->uri.len == clcfp[i]->name.len) {
+ r->loc_conf = clcfp[i]->loc_conf;
+ return NGX_HTTP_LOCATION_EXACT;
+ }
+
+ continue;
}
if (len > clcfp[i]->name.len) {
@@ -652,7 +696,7 @@ static ngx_int_t ngx_http_find_location(ngx_http_request_t *r,
clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
if (clcf->locations.nelts) {
- rc = ngx_http_find_location(r, &clcf->locations, len);
+ rc = ngx_http_core_find_location(r, &clcf->locations, len);
if (rc != NGX_OK) {
return rc;
@@ -674,6 +718,10 @@ static ngx_int_t ngx_http_find_location(ngx_http_request_t *r,
continue;
}
+ if (clcfp[i]->noname) {
+ break;
+ }
+
ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
"find location: ~ \"%V\"", &clcfp[i]->name);
@@ -706,6 +754,7 @@ static ngx_int_t ngx_http_find_location(ngx_http_request_t *r,
ngx_int_t ngx_http_set_content_type(ngx_http_request_t *r)
{
+ u_char c, *p, *exten;
uint32_t key;
ngx_uint_t i;
ngx_http_type_t *type;
@@ -724,6 +773,37 @@ ngx_int_t ngx_http_set_content_type(ngx_http_request_t *r)
clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
if (r->exten.len) {
+
+ if (!r->low_case_exten) {
+ for (i = 0; i < r->exten.len; i++) {
+ c = r->exten.data[i];
+ if (c >= 'A' && c <= 'Z') {
+ break;
+ }
+ }
+
+ if (i < r->exten.len) {
+ if (!(p = ngx_palloc(r->pool, r->exten.len))) {
+ return NGX_HTTP_INTERNAL_SERVER_ERROR;
+ }
+
+ exten = p;
+
+ for (i = 0; i < r->exten.len; i++) {
+ c = r->exten.data[i];
+ if (c >= 'A' && c <= 'Z') {
+ *p++ = (u_char) (c | 0x20);
+ } else {
+ *p++ = c;
+ }
+ }
+
+ r->exten.data = exten;
+ }
+
+ r->low_case_exten = 1;
+ }
+
#if 0
key = ngx_crc(r->exten.data, r->exten.key);
#endif
@@ -826,6 +906,8 @@ ngx_int_t ngx_http_set_exten(ngx_http_request_t *r)
}
}
+ r->low_case_exten = 0;
+
return NGX_OK;
}
@@ -864,6 +946,7 @@ ngx_int_t ngx_http_internal_redirect(ngx_http_request_t *r,
r->phase = 0;
r->phase_handler = 0;
+ r->content_handler = NULL;
ngx_http_handler(r);
@@ -893,48 +976,60 @@ int ngx_http_delay_handler(ngx_http_request_t *r)
#endif
-#if 0
-
-static ngx_int_t ngx_http_core_init_process(ngx_cycle_t *cycle)
+ngx_http_variable_t *ngx_http_add_variable(ngx_conf_t *cf)
{
- ngx_uint_t i;
- ngx_http_core_srv_conf_t **cscfp;
- ngx_http_core_main_conf_t *cmcf;
+ ngx_http_variable_t *var;
+ ngx_http_core_main_conf_t *cmcf;
- cmcf = ngx_http_cycle_get_module_main_conf(cycle, ngx_http_core_module);
+ cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);
-#if 0
- ngx_http_core_init_module:
+ if (cmcf->variables.elts == NULL) {
+ if (ngx_array_init(&cmcf->variables, cf->pool, 5,
+ sizeof(ngx_http_variable_t)) == NGX_ERROR)
+ {
+ return NULL;
+ }
+ }
- ngx_http_handler_pt *h;
+ if (!(var = ngx_array_push(&cmcf->variables))) {
+ return NULL;
+ }
- ngx_test_null(h, ngx_push_array(
- &cmcf->phases[NGX_HTTP_TRANSLATE_PHASE].handlers),
- NGX_ERROR);
- *h = ngx_http_delay_handler;
-#endif
+ var->index = cmcf->variables.nelts - 1;
+
+ return var;
+}
- cscfp = cmcf->servers.elts;
- for (i = 0; i < cmcf->servers.nelts; i++) {
- if (cscfp[i]->recv == NULL) {
- cscfp[i]->recv = ngx_io.recv;
- cscfp[i]->send_chain = ngx_io.send_chain;
- }
+ngx_http_variable_value_t *ngx_http_get_variable(ngx_http_request_t *r,
+ ngx_uint_t index)
+{
+ ngx_http_variable_t *v;
+ ngx_http_core_main_conf_t *cmcf;
+
+ /* TODO: cached variables */
+
+ cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);
+
+ if (cmcf->variables.elts == NULL || cmcf->variables.nelts <= index) {
+ ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,
+ "unknown variable index: %d", index);
+ return NULL;
}
- return NGX_OK;
-}
+ v = cmcf->variables.elts;
-#endif
+ return v[index].handler(r, v[index].data);
+}
-static char *ngx_server_block(ngx_conf_t *cf, ngx_command_t *cmd, void *dummy)
+static char *ngx_http_core_server(ngx_conf_t *cf, ngx_command_t *cmd,
+ void *dummy)
{
int m;
char *rv;
ngx_http_module_t *module;
- ngx_conf_t pvcf;
+ ngx_conf_t save;
ngx_http_conf_ctx_t *ctx, *http_ctx;
ngx_http_core_main_conf_t *cmcf;
ngx_http_core_srv_conf_t *cscf, **cscfp;
@@ -989,67 +1084,32 @@ static char *ngx_server_block(ngx_conf_t *cf, ngx_command_t *cmd, void *dummy)
/* parse inside server{} */
- pvcf = *cf;
+ save = *cf;
cf->ctx = ctx;
cf->cmd_type = NGX_HTTP_SRV_CONF;
+
rv = ngx_conf_parse(cf, NULL);
- *cf = pvcf;
+
+ *cf = save;
if (rv != NGX_CONF_OK) {
return rv;
}
ngx_qsort(cscf->locations.elts, (size_t) cscf->locations.nelts,
- sizeof(ngx_http_core_loc_conf_t *), ngx_cmp_locations);
+ sizeof(ngx_http_core_loc_conf_t *), ngx_http_core_cmp_locations);
return rv;
}
-static int ngx_cmp_locations(const void *one, const void *two)
-{
- ngx_int_t rc;
- ngx_http_core_loc_conf_t *first, *second;
-
- first = *(ngx_http_core_loc_conf_t **) one;
- second = *(ngx_http_core_loc_conf_t **) two;
-
-#if (NGX_PCRE)
-
- if (first->regex && !second->regex) {
- /* shift the regex matches to the end */
- return 1;
- }
-
- if (!first->regex && second->regex) {
- /* shift the regex matches to the end */
- return -1;
- }
-
- if (first->regex || second->regex) {
- /* do not sort the regex matches */
- return 0;
- }
-
-#endif
-
- rc = ngx_strcmp(first->name.data, second->name.data);
-
- if (rc == 0 && second->exact_match) {
- /* an exact match must be before the same inclusive one */
- return 1;
- }
-
- return (int) rc;
-}
-
-
-static char *ngx_location_block(ngx_conf_t *cf, ngx_command_t *cmd, void *dummy)
+static char *ngx_http_core_location(ngx_conf_t *cf, ngx_command_t *cmd,
+ void *dummy)
{
char *rv;
ngx_int_t m;
ngx_str_t *value;
- ngx_conf_t pcf;
+ ngx_conf_t save;
ngx_http_module_t *module;
ngx_http_conf_ctx_t *ctx, *pctx;
ngx_http_core_srv_conf_t *cscf;
@@ -1150,7 +1210,9 @@ static char *ngx_location_block(ngx_conf_t *cf, ngx_command_t *cmd, void *dummy)
}
} else {
+#if 0
clcf->prev_location = pclcf;
+#endif
if (pclcf->exact_match) {
ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
@@ -1176,7 +1238,7 @@ static char *ngx_location_block(ngx_conf_t *cf, ngx_command_t *cmd, void *dummy)
}
if (pclcf->locations.elts == NULL) {
- ngx_init_array(pclcf->locations, cf->pool, 5, sizeof(void *),
+ ngx_init_array(pclcf->locations, cf->pool, 4, sizeof(void *),
NGX_CONF_ERROR);
}
@@ -1187,38 +1249,103 @@ static char *ngx_location_block(ngx_conf_t *cf, ngx_command_t *cmd, void *dummy)
*clcfp = clcf;
- pcf = *cf;
+ save = *cf;
cf->ctx = ctx;
cf->cmd_type = NGX_HTTP_LOC_CONF;
+
rv = ngx_conf_parse(cf, NULL);
- *cf = pcf;
+
+ *cf = save;
+
+ if (rv != NGX_CONF_OK) {
+ return rv;
+ }
+
+ ngx_qsort(clcf->locations.elts, (size_t) clcf->locations.nelts,
+ sizeof(ngx_http_core_loc_conf_t *), ngx_http_core_cmp_locations);
return rv;
}
-static char *ngx_types_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
+static int ngx_http_core_cmp_locations(const void *one, const void *two)
+{
+ ngx_int_t rc;
+ ngx_http_core_loc_conf_t *first, *second;
+
+ first = *(ngx_http_core_loc_conf_t **) one;
+ second = *(ngx_http_core_loc_conf_t **) two;
+
+ if (first->noname && !second->noname) {
+ /* shift no named locations to the end */
+ return 1;
+ }
+
+ if (!first->noname && second->noname) {
+ /* shift no named locations to the end */
+ return -1;
+ }
+
+ if (first->noname || second->noname) {
+ /* do not sort no named locations */
+ return 0;
+ }
+
+#if (NGX_PCRE)
+
+ if (first->regex && !second->regex) {
+ /* shift the regex matches to the end */
+ return 1;
+ }
+
+ if (!first->regex && second->regex) {
+ /* shift the regex matches to the end */
+ return -1;
+ }
+
+ if (first->regex || second->regex) {
+ /* do not sort the regex matches */
+ return 0;
+ }
+
+#endif
+
+ rc = ngx_strcmp(first->name.data, second->name.data);
+
+ if (rc == 0 && second->exact_match) {
+ /* an exact match must be before the same inclusive one */
+ return 1;
+ }
+
+ return (int) rc;
+}
+
+
+static char *ngx_http_core_types(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
char *rv;
- ngx_conf_t pcf;
+ ngx_conf_t save;
- pcf = *cf;
- cf->handler = ngx_set_type;
+ save = *cf;
+ cf->handler = ngx_http_core_type;
cf->handler_conf = conf;
+
rv = ngx_conf_parse(cf, NULL);
- *cf = pcf;
+
+ *cf = save;
return rv;
}
-static char *ngx_set_type(ngx_conf_t *cf, ngx_command_t *dummy, void *conf)
+static char *ngx_http_core_type(ngx_conf_t *cf, ngx_command_t *dummy,
+ void *conf)
{
ngx_http_core_loc_conf_t *lcf = conf;
uint32_t key;
ngx_uint_t i;
- ngx_str_t *args;
+ ngx_str_t *value;
ngx_http_type_t *type;
if (lcf->types == NULL) {
@@ -1237,17 +1364,17 @@ static char *ngx_set_type(ngx_conf_t *cf, ngx_command_t *dummy, void *conf)
}
}
- args = (ngx_str_t *) cf->args->elts;
+ value = cf->args->elts;
for (i = 1; i < cf->args->nelts; i++) {
- ngx_http_types_hash_key(key, args[i]);
+ ngx_http_types_hash_key(key, value[i]);
if (!(type = ngx_array_push(&lcf->types[key]))) {
return NGX_CONF_ERROR;
}
- type->exten = args[i];
- type->type = args[0];
+ type->exten = value[i];
+ type->type = value[0];
}
return NGX_CONF_OK;
@@ -1256,15 +1383,17 @@ static char *ngx_set_type(ngx_conf_t *cf, ngx_command_t *dummy, void *conf)
static void *ngx_http_core_create_main_conf(ngx_conf_t *cf)
{
- ngx_http_core_main_conf_t *cmcf;
+ ngx_http_core_main_conf_t *cmcf;
- ngx_test_null(cmcf,
- ngx_pcalloc(cf->pool, sizeof(ngx_http_core_main_conf_t)),
- NGX_CONF_ERROR);
+ if (!(cmcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_core_main_conf_t)))) {
+ return NGX_CONF_ERROR;
+ }
- ngx_init_array(cmcf->servers, cf->pool,
- 5, sizeof(ngx_http_core_srv_conf_t *),
- NGX_CONF_ERROR);
+ if (ngx_array_init(&cmcf->servers, cf->pool, 5,
+ sizeof(ngx_http_core_srv_conf_t *)) == NGX_ERROR)
+ {
+ return NGX_CONF_ERROR;
+ }
cmcf->server_names_hash = NGX_CONF_UNSET_UINT;
cmcf->server_names_hash_threshold = NGX_CONF_UNSET_UINT;
@@ -1396,7 +1525,7 @@ static char *ngx_http_core_merge_srv_conf(ngx_conf_t *cf,
static void *ngx_http_core_create_loc_conf(ngx_conf_t *cf)
{
- ngx_http_core_loc_conf_t *lcf;
+ ngx_http_core_loc_conf_t *lcf;
ngx_test_null(lcf,
ngx_pcalloc(cf->pool, sizeof(ngx_http_core_loc_conf_t)),
@@ -1547,7 +1676,8 @@ static char *ngx_http_core_merge_loc_conf(ngx_conf_t *cf,
}
-static char *ngx_http_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
+static char *ngx_http_core_listen(ngx_conf_t *cf, ngx_command_t *cmd,
+ void *conf)
{
ngx_http_core_srv_conf_t *scf = conf;
@@ -1633,7 +1763,8 @@ static char *ngx_http_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
}
-static char *ngx_set_server_name(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
+static char *ngx_http_core_server_name(ngx_conf_t *cf, ngx_command_t *cmd,
+ void *conf)
{
ngx_http_core_srv_conf_t *scf = conf;
@@ -1683,7 +1814,7 @@ static char *ngx_set_server_name(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
}
-static char *ngx_set_root(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
+static char *ngx_http_core_root(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
ngx_http_core_loc_conf_t *lcf = conf;
@@ -1723,7 +1854,8 @@ static char *ngx_set_root(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
}
-static char *ngx_set_error_page(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
+static char *ngx_http_core_error_page(ngx_conf_t *cf, ngx_command_t *cmd,
+ void *conf)
{
ngx_http_core_loc_conf_t *lcf = conf;
@@ -1793,7 +1925,8 @@ static char *ngx_set_error_page(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
}
-static char *ngx_set_keepalive(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
+static char *ngx_http_core_keepalive(ngx_conf_t *cf, ngx_command_t *cmd,
+ void *conf)
{
ngx_http_core_loc_conf_t *lcf = conf;
@@ -1831,7 +1964,8 @@ static char *ngx_set_keepalive(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
}
-static char *ngx_set_error_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
+static char *ngx_http_core_error_log(ngx_conf_t *cf, ngx_command_t *cmd,
+ void *conf)
{
ngx_http_core_loc_conf_t *lcf = conf;
@@ -1843,7 +1977,7 @@ static char *ngx_set_error_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
}
-static char *ngx_http_lowat_check(ngx_conf_t *cf, void *post, void *data)
+static char *ngx_http_core_lowat_check(ngx_conf_t *cf, void *post, void *data)
{
#if (NGX_FREEBSD)
ssize_t *np = data;