changeset 158:d377ee423603

nginx-0.0.1-2003-10-24-10:53:41 import
author Igor Sysoev <igor@sysoev.ru>
date Fri, 24 Oct 2003 06:53:41 +0000
parents 70b36c805682
children 981e4af2a425
files src/core/ngx_conf_file.c src/core/ngx_conf_file.h src/http/modules/ngx_http_gzip_filter.c src/http/modules/proxy/ngx_http_proxy_handler.c src/http/modules/proxy/ngx_http_proxy_handler.h src/http/ngx_http_core_module.c src/http/ngx_http_core_module.h src/http/ngx_http_special_response.c
diffstat 8 files changed, 108 insertions(+), 109 deletions(-) [+]
line wrap: on
line diff
--- a/src/core/ngx_conf_file.c
+++ b/src/core/ngx_conf_file.c
@@ -596,8 +596,9 @@ char *ngx_conf_set_num_slot(ngx_conf_t *
 {
     char  *p = conf;
 
-    int        *np;
-    ngx_str_t  *value;
+    int              *np;
+    ngx_str_t        *value;
+    ngx_conf_post_t  *post;
 
 
     np = (int *) (p + cmd->offset);
@@ -612,8 +613,9 @@ char *ngx_conf_set_num_slot(ngx_conf_t *
         return "invalid number";
     }
 
-    if (cmd->bounds) {
-        return cmd->bounds->check(cf, cmd->bounds, np);
+    if (cmd->post) {
+        post = cmd->post;
+        return post->post_handler(cf, post, np);
     }
 
     return NGX_CONF_OK;
@@ -624,8 +626,9 @@ char *ngx_conf_set_size_slot(ngx_conf_t 
 {
     char  *p = conf;
 
-    int        *np;
-    ngx_str_t  *value;
+    int              *np;
+    ngx_str_t        *value;
+    ngx_conf_post_t  *post;
 
 
     np = (int *) (p + cmd->offset);
@@ -640,8 +643,9 @@ char *ngx_conf_set_size_slot(ngx_conf_t 
         return "invalid value";
     }
 
-    if (cmd->bounds) {
-        return cmd->bounds->check(cf, cmd->bounds, np);
+    if (cmd->post) {
+        post = cmd->post;
+        return post->post_handler(cf, post, np);
     }
 
     return NGX_CONF_OK;
@@ -652,10 +656,9 @@ char *ngx_conf_set_msec_slot(ngx_conf_t 
 {
     char  *p = conf;
 
-    int         size, total, len, scale, *np;
-    u_int       max, i;
-    char        last, *start;
-    ngx_str_t  *value;
+    int              *np;
+    ngx_str_t        *value;
+    ngx_conf_post_t  *post;
 
 
     np = (int *) (p + cmd->offset);
@@ -674,8 +677,9 @@ char *ngx_conf_set_msec_slot(ngx_conf_t 
         return "value must be less than 597 hours";
     }
 
-    if (cmd->bounds) {
-        return cmd->bounds->check(cf, cmd->bounds, np);
+    if (cmd->post) {
+        post = cmd->post;
+        return post->post_handler(cf, post, np);
     }
 
     return NGX_CONF_OK;
@@ -686,10 +690,9 @@ char *ngx_conf_set_sec_slot(ngx_conf_t *
 {
     char  *p = conf;
 
-    int         size, total, len, scale, *np;
-    u_int       max, i;
-    char        last, *start;
-    ngx_str_t  *value;
+    int              *np;
+    ngx_str_t        *value;
+    ngx_conf_post_t  *post;
 
 
     np = (int *) (p + cmd->offset);
@@ -708,8 +711,9 @@ char *ngx_conf_set_sec_slot(ngx_conf_t *
         return "value must be less than 68 years";
     }
 
-    if (cmd->bounds) {
-        return cmd->bounds->check(cf, cmd->bounds, np);
+    if (cmd->post) {
+        post = cmd->post;
+        return post->post_handler(cf, post, np);
     }
 
     return NGX_CONF_OK;
@@ -751,14 +755,13 @@ char *ngx_conf_unsupported(ngx_conf_t *c
 }
 
 
-char *ngx_conf_check_num_bounds(ngx_conf_t *cf, ngx_conf_bounds_t *bounds,
-                                void *conf)
+char *ngx_conf_check_num_bounds(ngx_conf_t *cf, void *post, void *data)
 {
-    int *num = conf;
+    ngx_conf_num_bounds_t *bounds = post;
+    int *np = data;
 
-    if (*num >= bounds->type.num.low && *num <= bounds->type.num.high) {
+    if (*np >= bounds->low && (u_int) *np <= (u_int) bounds->high) {
         return NGX_CONF_OK;
-
     }
 
     return "invalid value";
--- a/src/core/ngx_conf_file.h
+++ b/src/core/ngx_conf_file.h
@@ -51,34 +51,13 @@
 #define NGX_CONF_MODULE      0x464E4F43  /* "CONF" */
 
 
-typedef struct ngx_conf_bounds_s ngx_conf_bounds_t;
-
-struct ngx_conf_bounds_s {
-    char     *(*check)(ngx_conf_t *cf, ngx_conf_bounds_t *bounds, void *conf);
-
-    union {
-        struct {
-           int  low;
-           int  high;
-        } num;
-
-        struct num {
-           int  low_num;
-           int  high_num;
-           int  low_size;
-           int  high_size;
-        } bufs;
-   } type;
-};
-
-
 struct ngx_command_s {
-    ngx_str_t           name;
-    int                 type;
-    char             *(*set)(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
-    int                 conf;
-    int                 offset;
-    ngx_conf_bounds_t  *bounds;
+    ngx_str_t     name;
+    int           type;
+    char       *(*set)(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
+    int           conf;
+    int           offset;
+    void         *post;
 };
 
 #define ngx_null_command   { ngx_null_string, 0, NULL, 0, 0, NULL }
@@ -156,6 +135,24 @@ struct ngx_conf_s {
 };
 
 
+typedef char *(*ngx_conf_post_handler_pt) (ngx_conf_t *cf,
+                                           void *data, void *conf);
+
+typedef struct {
+    ngx_conf_post_handler_pt  post_handler;
+} ngx_conf_post_t;
+
+
+typedef struct {
+    ngx_conf_post_handler_pt  post_handler;
+    int                       low;
+    int                       high;
+} ngx_conf_num_bounds_t;
+
+
+char *ngx_conf_check_num_bounds(ngx_conf_t *cf, void *post, void *data);
+
+
 #define ngx_get_conf(conf_ctx, module)  conf_ctx[module.index]
 
 
@@ -240,9 +237,6 @@ char *ngx_conf_set_bufs_slot(ngx_conf_t 
 char *ngx_conf_set_core_flag_slot(ngx_conf_t *cf, ngx_command_t *cmd,
                                   void *conf);
 
-char *ngx_conf_check_num_bounds(ngx_conf_t *cf, ngx_conf_bounds_t *bounds,
-                                void *conf);
-
 
 extern ngx_module_t     *ngx_modules[];
 extern ngx_cycle_t      *ngx_cycle;
--- a/src/http/modules/ngx_http_gzip_filter.c
+++ b/src/http/modules/ngx_http_gzip_filter.c
@@ -50,12 +50,19 @@ static int ngx_http_gzip_filter_init(ngx
 static void *ngx_http_gzip_create_conf(ngx_conf_t *cf);
 static char *ngx_http_gzip_merge_conf(ngx_conf_t *cf,
                                       void *parent, void *child);
-static char *ngx_http_gzip_set_window(ngx_conf_t *cf, ngx_command_t *cmd,
-                                      void *conf);
-static char *ngx_http_gzip_set_hash(ngx_conf_t *cf, ngx_command_t *cmd,
-                                    void *conf);
+static char *ngx_http_gzip_set_window(ngx_conf_t *cf, void *post, void *data);
+static char *ngx_http_gzip_set_hash(ngx_conf_t *cf, void *post, void *data);
+
 
-static ngx_conf_bounds_t ngx_http_gzip_comp_level_bounds;
+static ngx_conf_num_bounds_t  ngx_http_gzip_comp_level_bounds = {
+    ngx_conf_check_num_bounds, 1, 9
+};
+
+static ngx_conf_post_handler_pt  ngx_http_gzip_set_window_p =
+                                                      ngx_http_gzip_set_window;
+static ngx_conf_post_handler_pt  ngx_http_gzip_set_hash_p =
+                                                        ngx_http_gzip_set_hash;
+
 
 
 static ngx_command_t  ngx_http_gzip_filter_commands[] = {
@@ -83,17 +90,17 @@ static ngx_command_t  ngx_http_gzip_filt
 
     {ngx_string("gzip_window"),
      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
-     ngx_http_gzip_set_window,
+     ngx_conf_set_size_slot,
      NGX_HTTP_LOC_CONF_OFFSET,
      offsetof(ngx_http_gzip_conf_t, wbits),
-     NULL},
+     &ngx_http_gzip_set_window_p},
 
     {ngx_string("gzip_hash"),
      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
-     ngx_http_gzip_set_hash,
+     ngx_conf_set_size_slot,
      NGX_HTTP_LOC_CONF_OFFSET,
      offsetof(ngx_http_gzip_conf_t, memlevel),
-     NULL},
+     &ngx_http_gzip_set_hash_p},
 
     {ngx_string("gzip_no_buffer"),
      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
@@ -128,12 +135,7 @@ ngx_module_t  ngx_http_gzip_filter_modul
 };
 
 
-static ngx_conf_bounds_t ngx_http_gzip_comp_level_bounds = {
-    ngx_conf_check_num_bounds, { { 1, 9 } }
-};
-
-
-static u_char gzheader[10] = { 0x1f, 0x8b, Z_DEFLATED, 0, 0, 0, 0, 0, 0, 3 };
+static u_char  gzheader[10] = { 0x1f, 0x8b, Z_DEFLATED, 0, 0, 0, 0, 0, 0, 3 };
 
 #if (HAVE_LITTLE_ENDIAN)
 
@@ -240,8 +242,8 @@ static int ngx_http_gzip_body_filter(ngx
 
         /*
          * We preallocate a memory for zlib in one hunk (200K-400K), this
-         * dicreases number of malloc() and free() calls and probably
-         * syscalls.
+         * dicreases a number of malloc() and free() calls and also probably
+         * dicreases a number of syscalls.
          * Besides we free() this memory as soon as the gzipping will complete
          * and do not wait while a whole response will be sent to a client.
          *
@@ -591,28 +593,21 @@ static char *ngx_http_gzip_merge_conf(ng
 }
 
 
-static char *ngx_http_gzip_set_window(ngx_conf_t *cf, ngx_command_t *cmd,
-                                      void *conf)
+static char *ngx_http_gzip_set_window(ngx_conf_t *cf, void *post, void *data)
 {
-    ngx_http_gzip_conf_t *lcf = conf;
+    int *np = data;
 
-    int    wbits, wsize;
-    char  *rv;
+    int  wbits, wsize;
 
 
-    rv = ngx_conf_set_size_slot(cf, cmd, conf);
-    if (rv) {
-        return rv;
-    }
-
-ngx_conf_log_error(NGX_LOG_INFO, cf, 0, "WBITS: %d", lcf->wbits);
+ngx_conf_log_error(NGX_LOG_INFO, cf, 0, "WBITS: %d", *np);
 
     wbits = 15;
     for (wsize = 32 * 1024; wsize > 256; wsize >>= 1) {
 
-        if (wsize == lcf->wbits) {
-            lcf->wbits = wbits;
-ngx_conf_log_error(NGX_LOG_INFO, cf, 0, "WBITS: %d", lcf->wbits);
+        if (wsize == *np) {
+            *np = wbits;
+ngx_conf_log_error(NGX_LOG_INFO, cf, 0, "WBITS: %d", *np);
             return NULL;
         }
 
@@ -623,28 +618,21 @@ ngx_conf_log_error(NGX_LOG_INFO, cf, 0, 
 }
 
 
-static char *ngx_http_gzip_set_hash(ngx_conf_t *cf, ngx_command_t *cmd,
-                                    void *conf)
+static char *ngx_http_gzip_set_hash(ngx_conf_t *cf, void *post, void *data)
 {
-    ngx_http_gzip_conf_t *lcf = conf;
+    int *np = data;
 
-    int    memlevel, hsize;
-    char  *rv;
+    int  memlevel, hsize;
 
 
-    rv = ngx_conf_set_size_slot(cf, cmd, conf);
-    if (rv) {
-        return rv;
-    }
-
-ngx_conf_log_error(NGX_LOG_INFO, cf, 0, "MEMLEVEL: %d", lcf->memlevel);
+ngx_conf_log_error(NGX_LOG_INFO, cf, 0, "MEMLEVEL: %d", *np);
 
     memlevel = 9;
     for (hsize = 128 * 1024; hsize > 256; hsize >>= 1) {
 
-        if (hsize == lcf->memlevel) {
-            lcf->memlevel = memlevel;
-ngx_conf_log_error(NGX_LOG_INFO, cf, 0, "MEMLEVEL: %d", lcf->memlevel);
+        if (hsize == *np) {
+            *np = memlevel;
+ngx_conf_log_error(NGX_LOG_INFO, cf, 0, "MEMLEVEL: %d", *np);
             return NULL;
         }
 
--- a/src/http/modules/proxy/ngx_http_proxy_handler.c
+++ b/src/http/modules/proxy/ngx_http_proxy_handler.c
@@ -188,8 +188,6 @@ static int ngx_http_proxy_handler(ngx_ht
 
     /* STUB */ p->accel = 1;
 
-    p->host_header = p->upstream.peers->peers[0].host;
-
     ngx_test_null(p->request_hunks, ngx_http_proxy_create_request(p),
                   NGX_HTTP_INTERNAL_SERVER_ERROR);
 
@@ -220,7 +218,7 @@ static ngx_chain_t *ngx_http_proxy_creat
           + r->uri.len - p->location_len
           + 1 + r->args.len                                  /* 1 is for "?" */
           + sizeof(http_version) - 1
-          + sizeof(host_header) - 1 + p->host_header.len + 2
+          + sizeof(host_header) - 1 + p->lcf->upstream->host_header.len + 2
                                                           /* 2 is for "\r\n" */
           + sizeof(connection_close_header) - 1
           + 2;                          /* 2 is for "\r\n" at the header end */
@@ -268,7 +266,8 @@ static ngx_chain_t *ngx_http_proxy_creat
     /* the "Host" header */
 
     h->last = ngx_cpymem(h->last, host_header, sizeof(host_header) - 1);
-    h->last = ngx_cpymem(h->last, p->host_header.data, p->host_header.len);
+    h->last = ngx_cpymem(h->last, p->lcf->upstream->host_header.data,
+                         p->lcf->upstream->host_header.len);
     *(h->last++) = CR; *(h->last++) = LF;
 
 
--- a/src/http/modules/proxy/ngx_http_proxy_handler.h
+++ b/src/http/modules/proxy/ngx_http_proxy_handler.h
@@ -73,7 +73,6 @@ struct ngx_http_proxy_ctx_s {
     int                         method;
     ngx_str_t                   uri;
     int                         location_len;
-    ngx_str_t                   host_header;
 
     ngx_event_pipe_t           *event_pipe;
 
--- a/src/http/ngx_http_core_module.c
+++ b/src/http/ngx_http_core_module.c
@@ -165,6 +165,13 @@ static ngx_command_t  ngx_http_core_comm
      offsetof(ngx_http_core_loc_conf_t, lingering_timeout),
      NULL},
 
+    {ngx_string("msie_padding"),
+     NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
+     ngx_conf_set_flag_slot,
+     NGX_HTTP_LOC_CONF_OFFSET,
+     offsetof(ngx_http_core_loc_conf_t, msie_padding),
+     NULL},
+
     {ngx_string("error_log"),
      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
      ngx_set_error_log,
@@ -843,6 +850,8 @@ static void *ngx_http_core_create_loc_co
     lcf->lingering_time = NGX_CONF_UNSET;
     lcf->lingering_timeout = NGX_CONF_UNSET;
 
+    lcf->msie_padding = NGX_CONF_UNSET;
+
     return lcf;
 }
 
@@ -916,6 +925,8 @@ static char *ngx_http_core_merge_loc_con
     ngx_conf_merge_msec_value(conf->lingering_timeout,
                               prev->lingering_timeout, 5000);
 
+    ngx_conf_merge_value(conf->msie_padding, prev->msie_padding, 1);
+
     return NGX_CONF_OK;
 }
 
--- a/src/http/ngx_http_core_module.h
+++ b/src/http/ngx_http_core_module.h
@@ -118,6 +118,8 @@ typedef struct {
     ngx_msec_t    lingering_time;          /* lingering_time */
     ngx_msec_t    lingering_timeout;       /* lingering_timeout */
 
+    int           msie_padding;            /* msie_padding */
+
     ngx_log_t    *err_log;
 } ngx_http_core_loc_conf_t;
 
--- a/src/http/ngx_http_special_response.c
+++ b/src/http/ngx_http_special_response.c
@@ -152,9 +152,10 @@ static ngx_str_t error_pages[] = {
 
 int ngx_http_special_response_handler(ngx_http_request_t *r, int error)
 {
-    int           err, rc;
-    ngx_hunk_t   *h;
-    ngx_chain_t  *out, **ll, *cl;
+    int                        err, rc;
+    ngx_hunk_t                *h;
+    ngx_chain_t               *out, **ll, *cl;
+    ngx_http_core_loc_conf_t  *clcf;
 
     r->headers_out.status = error;
 
@@ -238,7 +239,9 @@ int ngx_http_special_response_handler(ng
     ngx_alloc_link_and_set_hunk(cl, h, r->pool, NGX_ERROR);
     ngx_chain_add_link(out, ll, cl);
 
-    if (/* STUB: "msie_padding on/off" */ 1
+    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
+
+    if (clcf->msie_padding
         && r->http_version >= NGX_HTTP_VERSION_10
         && error >= NGX_HTTP_BAD_REQUEST
         && error != NGX_HTTP_REQUEST_URI_TOO_LARGE