nginx-0.0.1-2002-09-07-14:14:25 import
diff --git a/src/http/ngx_http.c b/src/http/ngx_http.c index 7e8cad5..e774489 100644 --- a/src/http/ngx_http.c +++ b/src/http/ngx_http.c
@@ -28,6 +28,7 @@ #else ngx_http_server.doc_root = "/home/is/work/xml/site-1.0.0/html"; #endif + ngx_http_server.doc_root = "html"; ngx_http_server.doc_root_len = strlen(ngx_http_server.doc_root) + 1;
diff --git a/src/http/ngx_http.h b/src/http/ngx_http.h index 3b943d6..cfc9470 100644 --- a/src/http/ngx_http.h +++ b/src/http/ngx_http.h
@@ -36,12 +36,6 @@ #define NGX_HTTP_DIRECTORY_HANDLER 1 -typedef struct { - void *ctx; /* STUB */ -} ngx_http_module_t; - -/* STUB */ -#define ngx_get_module_ctx(r, module) (module)->ctx typedef struct { char *doc_root; @@ -82,6 +76,10 @@ char *location; ngx_fd_t fd; + void **ctx; + void **loc_conf; + void **srv_conf; + ngx_pool_t *pool; ngx_hunk_t *header_in; @@ -140,6 +138,18 @@ } ngx_http_log_ctx_t; +typedef struct { + int index; +} ngx_http_module_t; + +#define NGX_HTTP_MODULE 0 + +#define ngx_get_module_loc_conf(r, module) r->loc_conf[module.index] +#define ngx_get_module_ctx(r, module) r->ctx[module.index] + + + +/* STUB */ #define NGX_INDEX "index.html"
diff --git a/src/http/ngx_http_event.c b/src/http/ngx_http_event.c index 7783462..ec3b209 100644 --- a/src/http/ngx_http_event.c +++ b/src/http/ngx_http_event.c
@@ -361,6 +361,7 @@ static int ngx_http_handler(ngx_http_request_t *r) { int rc; + ngx_msec_t timeout; ngx_del_timer(r->connection->read); r->header_timeout = 1; @@ -393,7 +394,16 @@ return ngx_http_close_request(r); } - ngx_add_timer(r->connection->write, 5000); + if (r->connection->sent > 0) { + ngx_log_debug(r->connection->log, "sent: " QD_FMT _ + r->connection->sent); + timeout = (ngx_msec_t) (r->connection->sent * 10); + ngx_log_debug(r->connection->log, "timeout: %d" _ timeout); + ngx_add_timer(r->connection->write, timeout); + + } else { + ngx_add_timer(r->connection->write, 10000); + } r->connection->write->event_handler = ngx_http_writer; return rc; @@ -488,6 +498,8 @@ c = (ngx_connection_t *) ev->data; r = (ngx_http_request_t *) c->data; + c->sent = 0; + rc = ngx_http_output_filter(r, NULL); ngx_log_debug(ev->log, "output_filter: %d" _ rc);
diff --git a/src/http/ngx_http_modules.c b/src/http/ngx_http_modules.c new file mode 100644 index 0000000..ca1f4ac --- /dev/null +++ b/src/http/ngx_http_modules.c
@@ -0,0 +1,7 @@ + +extern ngx_http_module_t ngx_http_output_filter_module; + +ngx_http_module_t *ngx_http_modules[] = { + ngx_http_output_filter_module, + NULL +};
diff --git a/src/http/ngx_http_output_filter.c b/src/http/ngx_http_output_filter.c index 693b399..3e6cbb6 100644 --- a/src/http/ngx_http_output_filter.c +++ b/src/http/ngx_http_output_filter.c
@@ -8,67 +8,78 @@ #include <ngx_http_output_filter.h> -/* STUB */ -int ngx_http_write_filter(ngx_http_request_t *r, ngx_chain_t *in); - - - static int ngx_http_output_filter_copy_hunk(ngx_hunk_t *dst, ngx_hunk_t *src); +static int ngx_http_output_filter_init( + int (*next_filter)(ngx_http_request_t *r, ngx_chain_t *ch)); +static void *ngx_http_output_filter_create_conf(ngx_pool_t *pool); +static void *ngx_http_output_filter_set_hunk_size(ngx_pool_t *pool, void *conf, + char *size); -ngx_http_module_t ngx_http_output_filter_module; +ngx_http_module_t ngx_http_output_filter_module = { + NGX_HTTP_MODULE +}; + + +static int (*ngx_http_output_next_filter)(ngx_http_request_t *r, + ngx_chain_t *ch); /* STUB */ -static ngx_http_output_filter_ctx_t module_ctx; +int ngx_http_write_filter(ngx_http_request_t *r, ngx_chain_t *ch); -void ngx_http_output_filter_init() +int ngx_http_output_filter_stub_init(ngx_pool_t *pool, void *loc_conf) { - module_ctx.hunk_size = 32 * 1024; - module_ctx.out.hunk = NULL; - module_ctx.out.next = NULL; - module_ctx.next_filter = ngx_http_write_filter; + ngx_http_output_filter_conf_t *conf; - ngx_http_output_filter_module.ctx = &module_ctx; + ngx_http_output_filter_init(ngx_http_write_filter); + conf = ngx_http_output_filter_create_conf(pool); + ngx_http_output_filter_set_hunk_size(pool, conf, "32"); + + loc_conf = conf; } /* */ -/* - flags NGX_HUNK_RECYCLED, NGX_HUNK_FLUSH, NGX_HUNK_LAST -*/ - int ngx_http_output_filter(ngx_http_request_t *r, ngx_hunk_t *hunk) { - int rc, first; + int rc, once; size_t size; ssize_t n; ngx_chain_t *ce; ngx_http_output_filter_ctx_t *ctx; + ngx_http_output_filter_conf_t *conf; ctx = (ngx_http_output_filter_ctx_t *) - ngx_get_module_ctx(r->main ? r->main : r, - &ngx_http_output_filter_module); + ngx_get_module_ctx(r->main ? r->main : r, + ngx_http_output_filter_module); + + if (ctx == NULL) { + ngx_test_null(ctx, + ngx_pcalloc(r->pool, sizeof(ngx_http_output_filter_ctx_t)), + NGX_ERROR); + + ctx->next_filter = ngx_http_output_next_filter; + } + + ngx_log_debug(r->connection->log, "HUNK: x%x CTX-IN: x%x CTX->HUNK: x%x" _ + hunk _ ctx->in _ ctx->hunk); if (hunk && (hunk->type & NGX_HUNK_LAST)) ctx->last = 1; - first = 1; - - while (first || ctx->in) { + for (once = 1; once || ctx->in; once--) { /* input chain is not empty */ if (ctx->in) { /* add hunk to input chain */ - if (first && hunk) { + if (once && hunk) { for (ce = ctx->in; ce->next; ce = ce->next) /* void */ ; ngx_add_hunk_to_chain(ce->next, hunk, r->pool, NGX_ERROR); } - first = 0; - /* our hunk is still busy */ if (ctx->hunk->pos.mem < ctx->hunk->last.mem) { rc = ctx->next_filter(r, NULL); @@ -122,8 +133,6 @@ /* input chain is empty */ } else { - first = 0; - if (hunk == NULL) { rc = ctx->next_filter(r, NULL); @@ -147,12 +156,17 @@ if (ctx->hunk == NULL) { if (hunk->type & NGX_HUNK_LAST) { + + conf = (ngx_http_output_filter_conf_t *) + ngx_get_module_loc_conf(r->main ? r->main : r, + ngx_http_output_filter_module); + size = hunk->last.mem - hunk->pos.mem; - if (size > ctx->hunk_size) - size = ctx->hunk_size; + if (size > conf->hunk_size) + size = conf->hunk_size; } else { - size = ctx->hunk_size; + size = conf->hunk_size; } ngx_test_null(ctx->hunk, @@ -251,3 +265,36 @@ return NGX_OK; } + + +static int ngx_http_output_filter_init( + int (*next_filter)(ngx_http_request_t *r, ngx_chain_t *ch)) +{ + ngx_http_output_next_filter = next_filter; + + return NGX_OK; +} + +static void *ngx_http_output_filter_create_conf(ngx_pool_t *pool) +{ + ngx_http_output_filter_conf_t *conf; + + ngx_test_null(conf, + ngx_pcalloc(pool, sizeof(ngx_http_output_filter_conf_t)), + NULL); + + conf->hunk_size = 16384; +} + +static void *ngx_http_output_filter_set_hunk_size(ngx_pool_t *pool, void *conf, + char *size) +{ + ngx_http_output_filter_conf_t *cf = (ngx_http_output_filter_conf_t *) conf; + + cf->hunk_size = atoi(size); + if (cf->hunk_size <= 0) + return "Error"; + + cf->hunk_size *= 1024; + return NULL; +}
diff --git a/src/http/ngx_http_output_filter.h b/src/http/ngx_http_output_filter.h index 072e0bd..c1beb27 100644 --- a/src/http/ngx_http_output_filter.h +++ b/src/http/ngx_http_output_filter.h
@@ -2,19 +2,28 @@ #define _NGX_HTTP_OUTPUT_FILTER_H_INCLUDED_ -#include <ngx_core.h> +#include <ngx_hunk.h> +#include <ngx_http.h> + #define NGX_HTTP_FILTER_NEED_IN_MEMORY 1 #define NGX_HTTP_FILTER_NEED_TEMP 2 + +typedef struct { + size_t hunk_size; +} ngx_http_output_filter_conf_t; + typedef struct { int (*next_filter)(ngx_http_request_t *r, ngx_chain_t *ch); ngx_hunk_t *hunk; ngx_chain_t *in; ngx_chain_t out; - size_t hunk_size; unsigned last; } ngx_http_output_filter_ctx_t; +int ngx_http_output_filter(ngx_http_request_t *r, ngx_hunk_t *hunk); + + #endif /* _NGX_HTTP_OUTPUT_FILTER_H_INCLUDED_ */
diff --git a/src/http/ngx_http_parse.c b/src/http/ngx_http_parse.c index 5ab42ac..d4caddc 100644 --- a/src/http/ngx_http_parse.c +++ b/src/http/ngx_http_parse.c
@@ -32,7 +32,7 @@ state, p, r->header_in->last, ch, p); */ - /* GCC compiles switch as jump table */ + /* GCC 2.95.2 and VC 6.0 compiles switch as jump table */ switch (state) {
diff --git a/src/http/ngx_http_write_filter.c b/src/http/ngx_http_write_filter.c index dcb74c9..eb465ef 100644 --- a/src/http/ngx_http_write_filter.c +++ b/src/http/ngx_http_write_filter.c
@@ -1,27 +1,19 @@ #include <ngx_config.h> - +#include <ngx_core.h> #include <ngx_hunk.h> #include <ngx_event_write.h> #include <ngx_http.h> #include <ngx_http_output_filter.h> - #include <ngx_http_write_filter.h> -ngx_http_module_t ngx_http_write_filter_module; +ngx_http_module_t ngx_http_write_filter_module = { + NGX_HTTP_MODULE +}; /* STUB */ -static ngx_http_write_filter_ctx_t module_ctx; - -void ngx_http_write_filter_init() -{ - module_ctx.buffer_output = 10240; - module_ctx.out = NULL; - - ngx_http_write_filter_module.ctx = &module_ctx; -} /* */ @@ -31,10 +23,17 @@ off_t size, flush; ngx_chain_t *ch, **prev, *chain; ngx_http_write_filter_ctx_t *ctx; + ngx_http_write_filter_conf_t *conf; + ctx = (ngx_http_write_filter_ctx_t *) ngx_get_module_ctx(r->main ? r->main : r, - &ngx_http_write_filter_module); + ngx_http_write_filter_module); + if (ctx == NULL) + ngx_test_null(ctx, + ngx_pcalloc(r->pool, sizeof(ngx_http_write_filter_ctx_t)), + NGX_ERROR); + size = flush = 0; last = 0; prev = &ctx->out; @@ -76,7 +75,11 @@ last = 1; } - if (!last && flush == 0 && size < ctx->buffer_output) + conf = (ngx_http_write_filter_conf_t *) + ngx_get_module_loc_conf(r->main ? r->main : r, + ngx_http_write_filter_module); + + if (!last && flush == 0 && size < conf->buffer_output) return NGX_OK; chain = ngx_event_write(r->connection, ctx->out, flush); @@ -89,3 +92,29 @@ return (chain ? NGX_AGAIN : NGX_OK); } + + +static void *ngx_http_write_filter_create_conf(ngx_pool_t *pool) +{ + ngx_http_write_filter_conf_t *conf; + + ngx_test_null(conf, + ngx_pcalloc(pool, sizeof(ngx_http_write_filter_conf_t)), + NULL); + + conf->buffer_output = 16384; +} + +static void *ngx_http_write_filter_set_hunk_size(ngx_pool_t *pool, void *conf, + char *size) +{ + ngx_http_write_filter_conf_t *cf = (ngx_http_write_filter_conf_t *) conf; + + cf->buffer_output = atoi(size); + if (cf->buffer_output <= 0) + return "Error"; + + cf->buffer_output *= 1024; + return NULL; +} +
diff --git a/src/http/ngx_http_write_filter.h b/src/http/ngx_http_write_filter.h index 0b3fa54..225d73b 100644 --- a/src/http/ngx_http_write_filter.h +++ b/src/http/ngx_http_write_filter.h
@@ -2,11 +2,19 @@ #define _NGX_HTTP_WRITE_FILTER_H_INCLUDED_ +#include <ngx_hunk.h> +#include <ngx_http.h> + + +typedef struct { + size_t buffer_output; +} ngx_http_write_filter_conf_t; + typedef struct { ngx_chain_t *out; - size_t buffer_output; } ngx_http_write_filter_ctx_t; + int ngx_http_write_filter(ngx_http_request_t *r, ngx_chain_t *in);