diff src/http/ngx_http_core_module.c @ 72:b31656313b59 NGINX_0_1_36

nginx 0.1.36 *) Change: if the request header has duplicate the "Host", "Connection", "Content-Length", or "Authorization" lines, then nginx now returns the 400 error. *) Change: the "post_accept_timeout" directive was canceled. *) Feature: the "default", "af=", "bl=", "deferred", and "bind" parameters of the "listen" directive. *) Feature: the FreeBSD accept filters support. *) Feature: the Linux TCP_DEFER_ACCEPT support. *) Bugfix: the ngx_http_autoindex_module did not support the file names in UTF-8. *) Bugfix: the new log file can be rotated by the -USR1 signal only if the reconfiguration by the -HUP signal was made twice.
author Igor Sysoev <http://sysoev.ru>
date Wed, 15 Jun 2005 00:00:00 +0400
parents 8ad297c88dcb
children da9a3b14312d
line wrap: on
line diff
--- a/src/http/ngx_http_core_module.c
+++ b/src/http/ngx_http_core_module.c
@@ -102,13 +102,6 @@ static ngx_command_t  ngx_http_core_comm
       offsetof(ngx_http_core_srv_conf_t, connection_pool_size),
       NULL },
 
-    { ngx_string("post_accept_timeout"),
-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
-      ngx_conf_set_msec_slot,
-      NGX_HTTP_SRV_CONF_OFFSET,
-      offsetof(ngx_http_core_srv_conf_t, post_accept_timeout),
-      NULL },
-
     { ngx_string("request_pool_size"),
       NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
       ngx_conf_set_size_slot,
@@ -160,9 +153,9 @@ static ngx_command_t  ngx_http_core_comm
 
     { ngx_string("listen"),
 #if 0
-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
+      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_1MORE,
 #else
-      NGX_HTTP_SRV_CONF|NGX_CONF_TAKE12,
+      NGX_HTTP_SRV_CONF|NGX_CONF_1MORE,
 #endif
       ngx_http_core_listen,
       NGX_HTTP_SRV_CONF_OFFSET,
@@ -1592,7 +1585,6 @@ ngx_http_core_create_srv_conf(ngx_conf_t
     }
 
     cscf->connection_pool_size = NGX_CONF_UNSET_SIZE;
-    cscf->post_accept_timeout = NGX_CONF_UNSET_MSEC;
     cscf->request_pool_size = NGX_CONF_UNSET_SIZE;
     cscf->client_header_timeout = NGX_CONF_UNSET_MSEC;
     cscf->client_header_buffer_size = NGX_CONF_UNSET_SIZE;
@@ -1621,6 +1613,8 @@ ngx_http_core_merge_srv_conf(ngx_conf_t 
             return NGX_CONF_ERROR;
         }
 
+        ngx_memzero(ls, sizeof(ngx_http_listen_t));
+
         ls->addr = INADDR_ANY;
 #if (NGX_WIN32)
         ls->port = 80;
@@ -1629,7 +1623,6 @@ ngx_http_core_merge_srv_conf(ngx_conf_t 
         ls->port = (getuid() == 0) ? 80 : 8000;
 #endif
         ls->family = AF_INET;
-        ls->default_server = 0;
     }
 
     if (conf->server_names.nelts == 0) {
@@ -1662,8 +1655,6 @@ ngx_http_core_merge_srv_conf(ngx_conf_t 
 
     ngx_conf_merge_size_value(conf->connection_pool_size,
                               prev->connection_pool_size, 256);
-    ngx_conf_merge_msec_value(conf->post_accept_timeout,
-                              prev->post_accept_timeout, 60000);
     ngx_conf_merge_size_value(conf->request_pool_size,
                               prev->request_pool_size, 4096);
     ngx_conf_merge_msec_value(conf->client_header_timeout,
@@ -1859,89 +1850,145 @@ ngx_http_core_merge_loc_conf(ngx_conf_t 
 }
 
 
+/* AF_INET only */
+
 static char *
 ngx_http_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
 {
     ngx_http_core_srv_conf_t *scf = conf;
 
-    u_char             *addr;
-    ngx_int_t           port;
-    ngx_uint_t          p;
-    ngx_str_t          *args;
-    struct hostent     *h;
-    ngx_http_listen_t  *ls;
+    char                 *err;
+    ngx_str_t            *value;
+    ngx_uint_t            n;
+    struct hostent       *h;
+    ngx_http_listen_t    *ls;
+    ngx_inet_upstream_t   inet_upstream;
 
     /*
      * TODO: check duplicate 'listen' directives,
      *       add resolved name to server names ???
      */
 
+    value = cf->args->elts;
+    
+    ngx_memzero(&inet_upstream, sizeof(ngx_inet_upstream_t));
+
+    inet_upstream.url = value[1];
+    inet_upstream.port_only = 1;
+
+    err = ngx_inet_parse_host_port(&inet_upstream);
+
+    if (err) {
+        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
+                           "%s in \"%V\" of the \"listen\" directive",
+                           err, &inet_upstream.url);
+        return NGX_CONF_ERROR; 
+    }
+
     ls = ngx_array_push(&scf->listen);
     if (ls == NULL) {
         return NGX_CONF_ERROR;
     }
 
-    /* AF_INET only */
+    ngx_memzero(ls, sizeof(ngx_http_listen_t));
 
     ls->family = AF_INET;
+    ls->port = (in_port_t) (inet_upstream.default_port ?
+                                                      80 : inet_upstream.port);
     ls->file_name = cf->conf_file->file.name;
     ls->line = cf->conf_file->line;
-    ls->default_server = 0;
-
-    args = cf->args->elts;
-    addr = args[1].data;
-
-    for (p = 0; p < args[1].len; p++) {
-        if (addr[p] == ':') {
-            addr[p++] = '\0';
-            break;
+    ls->conf.backlog = -1;
+
+    if (inet_upstream.host.len) {
+        inet_upstream.host.data[inet_upstream.host.len] = '\0';
+
+        ls->addr = inet_addr((const char *) inet_upstream.host.data);
+
+        if (ls->addr == INADDR_NONE) {
+            h = gethostbyname((const char *) inet_upstream.host.data);
+
+            if (h == NULL || h->h_addr_list[0] == NULL) {
+                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
+                                   "can not resolve host \"%s\" "
+                                   "in the \"listen\" directive",
+                                   inet_upstream.host.data);
+                return NGX_CONF_ERROR;
+            }
+    
+            ls->addr = *(in_addr_t *)(h->h_addr_list[0]);
         }
+
+    } else {
+        ls->addr = INADDR_ANY;
+    }
+
+    if (cf->args->nelts == 2) {
+        return NGX_CONF_OK;
+    }
+
+    if (ngx_strcmp(value[2].data, "default") == 0) {
+        ls->conf.default_server = 1;
+        n = 3;
+    } else {
+        n = 2;
     }
 
-    if (p == args[1].len) {
-        /* no ":" in the "listen" */
-        p = 0;
-    }
-
-    port = ngx_atoi(&addr[p], args[1].len - p);
-
-    if (port == NGX_ERROR && p == 0) {
-
-        /* "listen host" */
-        ls->port = 80;
-
-    } else if ((port == NGX_ERROR && p != 0) /* "listen host:NONNUMBER" */
-               || (port < 1 || port > 65536)) { /* "listen 99999" */
+    for ( /* void */ ; n < cf->args->nelts; n++) {
+
+        if (ls->conf.default_server == 0) {
+            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
+                               "\"%V\" parameter can be specified for "
+                               "the default \"listen\" directive only",
+                               &value[n]);
+            return NGX_CONF_ERROR;
+        }
+
+        if (ngx_strcmp(value[n].data, "bind") == 0) {
+            ls->conf.bind = 1;
+            continue;
+        }
+
+        if (ngx_strncmp(value[n].data, "bl=", 3) == 0) {
+            ls->conf.backlog = ngx_atoi(value[n].data + 3, value[n].len - 3);
+            ls->conf.bind = 1;
+
+            if (ls->conf.backlog == NGX_ERROR || ls->conf.backlog == 0) {
+                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
+                                   "invalid backlog \"%V\"", &value[n]);
+                return NGX_CONF_ERROR;
+            }
+
+            continue;
+        }
+
+        if (ngx_strncmp(value[n].data, "af=", 3) == 0) {
+#if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER)
+            ls->conf.accept_filter = (char *) &value[n].data[3];
+            ls->conf.bind = 1;
+#else
+            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
+                               "accept filters \"%V\" are not supported "
+                               "on this platform, ignored",
+                               &value[n]);
+#endif
+            continue;
+        }
+
+        if (ngx_strcmp(value[n].data, "deferred") == 0) {
+#if (NGX_HAVE_DEFERRED_ACCEPT && defined TCP_DEFER_ACCEPT)
+            ls->conf.deferred_accept = 1;
+            ls->conf.bind = 1;
+#else
+            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
+                               "the deferred accept is not supported "
+                               "on this platform, ignored");
+#endif
+            continue;
+        }
 
         ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
-                           "invalid port \"%s\" in \"%V\" directive, "
-                           "it must be a number between 1 and 65535",
-                           &addr[p], &cmd->name);
-
+                           "the invalid \"%V\" parameter", &value[n]);
         return NGX_CONF_ERROR;
-
-    } else if (p == 0) {
-        ls->addr = INADDR_ANY;
-        ls->port = (in_port_t) port;
-        return NGX_CONF_OK;
-
-    } else {
-        ls->port = (in_port_t) port;
-    }
-
-    ls->addr = inet_addr((const char *) addr);
-
-    if (ls->addr == INADDR_NONE) {
-        h = gethostbyname((const char *) addr);
-
-        if (h == NULL || h->h_addr_list[0] == NULL) {
-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
-                              "can not resolve host \"%s\" "
-                              "in \"%V\" directive", addr, &cmd->name);
-            return NGX_CONF_ERROR;
-        }
-
-        ls->addr = *(in_addr_t *)(h->h_addr_list[0]);
     }
 
     return NGX_CONF_OK;