mirror of
https://github.com/nginx/nginx.git
synced 2025-06-11 12:22:41 +08:00
nginx-0.0.1-2002-12-26-19:26:23 import
This commit is contained in:
parent
960ffa42cb
commit
207ed5a589
@ -62,7 +62,6 @@ int main(int argc, char *const *argv)
|
||||
ngx_create_array(ngx_pool, 10, sizeof(ngx_str_t)), 1);
|
||||
conf.pool = ngx_pool;
|
||||
conf.log = &ngx_log;
|
||||
conf.modules = ngx_http_modules;
|
||||
|
||||
conf_file.len = sizeof("nginx.conf") - 1;
|
||||
conf_file.data = "nginx.conf";
|
||||
|
@ -1,8 +1,6 @@
|
||||
|
||||
#include <ngx_config.h>
|
||||
|
||||
#include <ngx_core.h>
|
||||
|
||||
#include <ngx_config_file.h>
|
||||
|
||||
|
||||
@ -13,14 +11,13 @@ static int argument_number[] = {
|
||||
};
|
||||
|
||||
static int ngx_conf_read_token(ngx_conf_t *cf);
|
||||
static ngx_command_t *ngx_conf_find_token(ngx_conf_t *cf,
|
||||
ngx_http_module_t **modules);
|
||||
|
||||
|
||||
int ngx_conf_parse(ngx_conf_t *cf, ngx_str_t *filename)
|
||||
{
|
||||
int rc;
|
||||
int rc, i;
|
||||
char *error;
|
||||
ngx_str_t *name;
|
||||
ngx_fd_t fd;
|
||||
ngx_conf_file_t *prev;
|
||||
ngx_command_t *cmd;
|
||||
@ -75,7 +72,29 @@ int ngx_conf_parse(ngx_conf_t *cf, ngx_str_t *filename)
|
||||
continue;
|
||||
}
|
||||
|
||||
cmd = ngx_conf_find_token(cf);
|
||||
name = (ngx_str_t *) cf->args->elts;
|
||||
|
||||
for (i = 0; ngx_modules[i]; i++) {
|
||||
if (cf->type != ngx_modules[i]->type) {
|
||||
continue;
|
||||
}
|
||||
|
||||
cmd = ngx_modules[i]->commands;
|
||||
if (cmd == NULL) {
|
||||
continue;
|
||||
}
|
||||
|
||||
while (cmd->name.len) {
|
||||
if (name->len == cmd->name.len
|
||||
&& ngx_strcmp(name->data, cmd->name.data) == 0)
|
||||
{
|
||||
ngx_log_debug(cf->log, "command '%s'" _ cmd->name.data);
|
||||
cmd->set(cf, cmd, NULL);
|
||||
}
|
||||
|
||||
cmd++;
|
||||
}
|
||||
}
|
||||
|
||||
#if 0
|
||||
cmd = ngx_conf_find_token(cf);
|
||||
@ -368,59 +387,37 @@ ngx_log_debug(cf->log, "FOUND %d:'%s'" _ word->len _ word->data);
|
||||
}
|
||||
|
||||
|
||||
static ngx_command_t *ngx_conf_find_token(ngx_conf_t *cf)
|
||||
{
|
||||
int i;
|
||||
ngx_command_t *cmd;
|
||||
|
||||
for (i = 0; cf->modules[i]; i++) {
|
||||
cmd = cf->modules[i]->commands;
|
||||
if (cmd == NULL) {
|
||||
continue;
|
||||
}
|
||||
|
||||
while (cmd->name) {
|
||||
|
||||
ngx_log_debug(cf->log, "command '%s'" _ cmd->name);
|
||||
|
||||
cmd++;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
char *ngx_conf_set_size_slot(ngx_conf_t *cf, char *conf)
|
||||
char *ngx_conf_set_size_slot(ngx_conf_t *cf, ngx_command_t *cmd, char *conf)
|
||||
{
|
||||
int size;
|
||||
ngx_str_t *value;
|
||||
|
||||
value = (ngx_str_t *) cf->args->elts;
|
||||
|
||||
size = atoi(value.data);
|
||||
size = atoi(value[1].data);
|
||||
if (size < 0) {
|
||||
return "value must be greater or equal to zero";
|
||||
}
|
||||
|
||||
*(int *) (conf + cf->offset) = size;
|
||||
*(int *) (conf + cmd->offset) = size;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
char *ngx_conf_set_time_slot(ngx_conf_t *cf, char *conf)
|
||||
char *ngx_conf_set_time_slot(ngx_conf_t *cf, ngx_command_t *cmd, char *conf)
|
||||
{
|
||||
int size;
|
||||
ngx_str_t *value;
|
||||
|
||||
value = (ngx_str_t *) cf->args->elts;
|
||||
|
||||
size = atoi(value.data);
|
||||
size = atoi(value[1].data);
|
||||
if (size < 0) {
|
||||
return "value must be greater or equal to zero";
|
||||
}
|
||||
|
||||
*(int *) (conf + offset) = size;
|
||||
*(int *) (conf + cmd->offset) = size;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
@ -16,7 +16,8 @@
|
||||
#define NGX_CONF_TAKE1 2
|
||||
#define NGX_CONF_TAKE2 4
|
||||
|
||||
#define NGX_CONF_ITERATE 0
|
||||
#define NGX_CONF_ANY 0x10000
|
||||
#define NGX_CONF_BLOCK 0x20000
|
||||
|
||||
#define NGX_CONF_UNSET -1
|
||||
|
||||
@ -28,13 +29,14 @@
|
||||
typedef struct ngx_conf_s ngx_conf_t;
|
||||
|
||||
|
||||
typedef struct {
|
||||
typedef struct ngx_command_s ngx_command_t;
|
||||
struct ngx_command_s {
|
||||
ngx_str_t name;
|
||||
char *(*set)(ngx_conf_t *cf);
|
||||
int offset;
|
||||
int zone;
|
||||
int type;
|
||||
} ngx_command_t;
|
||||
char *(*set)(ngx_conf_t *cf, ngx_command_t *cmd, char *conf);
|
||||
int conf;
|
||||
int offset;
|
||||
};
|
||||
|
||||
|
||||
typedef struct {
|
||||
@ -60,9 +62,8 @@ struct ngx_conf_s {
|
||||
ngx_conf_file_t *conf_file;
|
||||
ngx_log_t *log;
|
||||
|
||||
ngx_module_t *modules;
|
||||
|
||||
void *ctx;
|
||||
int type;
|
||||
int (*handler)(ngx_conf_t *cf);
|
||||
};
|
||||
|
||||
@ -70,7 +71,11 @@ struct ngx_conf_s {
|
||||
int ngx_conf_parse(ngx_conf_t *cf, ngx_str_t *filename);
|
||||
|
||||
|
||||
char *ngx_conf_set_size_slot(ngx_conf_t *cf);
|
||||
char *ngx_conf_set_size_slot(ngx_conf_t *cf, ngx_command_t *cmd, char *conf);
|
||||
char *ngx_conf_set_time_slot(ngx_conf_t *cf, ngx_command_t *cmd, char *conf);
|
||||
|
||||
|
||||
extern ngx_module_t *ngx_modules[];
|
||||
|
||||
|
||||
#endif _NGX_HTTP_CONFIG_FILE_H_INCLUDED_
|
||||
|
@ -1,15 +1,19 @@
|
||||
|
||||
#include <ngx_http.h>
|
||||
#include <ngx_config_file.h>
|
||||
|
||||
extern ngx_http_module_t ngx_http_header_filter_module;
|
||||
|
||||
extern ngx_http_module_t ngx_http_write_filter_module;
|
||||
extern ngx_http_module_t ngx_http_output_filter_module;
|
||||
extern ngx_module_t ngx_http_header_filter_module;
|
||||
|
||||
extern ngx_http_module_t ngx_http_core_module;
|
||||
extern ngx_http_module_t ngx_http_index_module;
|
||||
extern ngx_module_t ngx_http_write_filter_module;
|
||||
extern ngx_module_t ngx_http_output_filter_module;
|
||||
|
||||
ngx_http_module_t *ngx_http_modules[] = {
|
||||
extern ngx_module_t ngx_http_core_module;
|
||||
extern ngx_module_t ngx_http_index_module;
|
||||
|
||||
extern ngx_module_t ngx_http_module;
|
||||
|
||||
|
||||
ngx_module_t *ngx_modules[] = {
|
||||
|
||||
&ngx_http_header_filter_module,
|
||||
|
||||
@ -19,5 +23,7 @@ ngx_http_module_t *ngx_http_modules[] = {
|
||||
&ngx_http_index_module,
|
||||
&ngx_http_core_module,
|
||||
|
||||
&ngx_http_module,
|
||||
|
||||
NULL
|
||||
};
|
||||
|
@ -19,6 +19,7 @@ typedef struct {
|
||||
#define ngx_memzero ZeroMemory
|
||||
|
||||
#define strcasecmp stricmp
|
||||
#define ngx_strcmp strcmp
|
||||
|
||||
#define ngx_snprintf _snprintf
|
||||
#define ngx_vsnprintf _vsnprintf
|
||||
@ -27,6 +28,8 @@ typedef struct {
|
||||
|
||||
#define ngx_memzero bzero
|
||||
|
||||
#define ngx_strcmp strcmp
|
||||
|
||||
#define ngx_snprintf snprintf
|
||||
#define ngx_vsnprintf vsnprintf
|
||||
|
||||
|
@ -8,7 +8,7 @@
|
||||
#include <ngx_http.h>
|
||||
#include <ngx_http_event_proxy_handler.h>
|
||||
|
||||
ngx_http_module_t ngx_http_proxy_module;
|
||||
ngx_http_module_t ngx_http_proxy_module_ctx;
|
||||
|
||||
|
||||
static ngx_chain_t *ngx_http_proxy_create_request(ngx_http_request_t *r);
|
||||
@ -36,10 +36,11 @@ int ngx_http_proxy_handler(ngx_http_request_t *r)
|
||||
ngx_chain_t *chain;
|
||||
ngx_http_proxy_ctx_t *p;
|
||||
|
||||
p = (ngx_http_proxy_ctx_t *) ngx_get_module_ctx(r, ngx_http_proxy_module);
|
||||
p = (ngx_http_proxy_ctx_t *)
|
||||
ngx_http_get_module_ctx(r, ngx_http_proxy_module_ctx);
|
||||
|
||||
if (p == NULL)
|
||||
ngx_http_create_ctx(r, p, ngx_http_proxy_module,
|
||||
ngx_http_create_ctx(r, p, ngx_http_proxy_module_ctx,
|
||||
sizeof(ngx_http_proxy_ctx_t));
|
||||
|
||||
chain = ngx_http_proxy_create_request(r);
|
||||
@ -244,7 +245,8 @@ static int ngx_http_proxy_send_request(ngx_event_t *ev)
|
||||
|
||||
c = (ngx_connection_t *) ev->data;
|
||||
r = (ngx_http_request_t *) c->data;
|
||||
p = (ngx_http_proxy_ctx_t *) ngx_get_module_ctx(r, ngx_http_proxy_module);
|
||||
p = (ngx_http_proxy_ctx_t *)
|
||||
ngx_http_get_module_ctx(r, ngx_http_proxy_module_ctx);
|
||||
|
||||
chain = ngx_event_write(c, p->out, 0);
|
||||
if (chain == (ngx_chain_t *) -1)
|
||||
@ -269,7 +271,8 @@ static int ngx_http_proxy_read_response_header(ngx_event_t *ev)
|
||||
|
||||
c = (ngx_connection_t *) ev->data;
|
||||
r = (ngx_http_request_t *) c->data;
|
||||
p = (ngx_http_proxy_ctx_t *) ngx_get_module_ctx(r, ngx_http_proxy_module);
|
||||
p = (ngx_http_proxy_ctx_t *)
|
||||
ngx_http_get_module_ctx(r, ngx_http_proxy_module_ctx);
|
||||
|
||||
if (p->header_in == NULL) {
|
||||
ngx_test_null(p->header_in,
|
||||
@ -389,7 +392,8 @@ static int ngx_http_proxy_read_response_body(ngx_event_t *ev)
|
||||
|
||||
c = (ngx_connection_t *) ev->data;
|
||||
r = (ngx_http_request_t *) c->data;
|
||||
p = (ngx_http_proxy_ctx_t *) ngx_get_module_ctx(r, ngx_http_proxy_module);
|
||||
p = (ngx_http_proxy_ctx_t *)
|
||||
ngx_http_get_module_ctx(r, ngx_http_proxy_module_ctx);
|
||||
|
||||
left = 0;
|
||||
|
||||
@ -464,7 +468,8 @@ static int ngx_http_proxy_write_to_client(ngx_event_t *ev)
|
||||
|
||||
c = (ngx_connection_t *) ev->data;
|
||||
r = (ngx_http_request_t *) c->data;
|
||||
p = (ngx_http_proxy_ctx_t *) ngx_get_module_ctx(r, ngx_http_proxy_module);
|
||||
p = (ngx_http_proxy_ctx_t *)
|
||||
ngx_http_get_module_ctx(r, ngx_http_proxy_module_ctx);
|
||||
|
||||
do {
|
||||
h = ((ngx_hunk_t **) p->hunks->elts)[p->hunk_n];
|
||||
|
@ -13,32 +13,43 @@
|
||||
static void *ngx_http_index_create_conf(ngx_pool_t *pool);
|
||||
static void *ngx_http_index_merge_conf(ngx_pool_t *p,
|
||||
void *parent, void *child);
|
||||
static char *ngx_http_index_set_index(ngx_pool_t *p, void *conf,
|
||||
ngx_str_t *value);
|
||||
static char *ngx_http_index_set_index(ngx_conf_t *cf, ngx_command_t *cmd,
|
||||
char *conf);
|
||||
|
||||
|
||||
static ngx_command_t ngx_http_index_commands[] = {
|
||||
|
||||
{"index", ngx_http_index_set_index, 0,
|
||||
NGX_HTTP_LOC_CONF, NGX_CONF_ITERATE,
|
||||
"set index files"},
|
||||
|
||||
{NULL}
|
||||
{ngx_string("index"),
|
||||
NGX_CONF_ANY,
|
||||
ngx_http_index_set_index,
|
||||
NGX_HTTP_LOC_CONF,
|
||||
0},
|
||||
|
||||
{ngx_string(""), 0, NULL, 0, 0}
|
||||
};
|
||||
|
||||
|
||||
ngx_http_module_t ngx_http_index_module = {
|
||||
ngx_http_module_t ngx_http_index_module_ctx = {
|
||||
NGX_HTTP_MODULE,
|
||||
|
||||
NULL, /* create server config */
|
||||
ngx_http_index_create_conf, /* create location config */
|
||||
ngx_http_index_commands, /* module directives */
|
||||
|
||||
NULL, /* init module */
|
||||
NULL, /* translate handler */
|
||||
|
||||
NULL, /* init output body filter */
|
||||
NULL, /* output header filter */
|
||||
NULL, /* next output header filter */
|
||||
NULL, /* output body filter */
|
||||
NULL, /* next output body filter */
|
||||
|
||||
};
|
||||
|
||||
|
||||
ngx_module_t ngx_http_index_module = {
|
||||
&ngx_http_index_module_ctx, /* module context */
|
||||
ngx_http_index_commands, /* module directives */
|
||||
NGX_HTTP_MODULE_TYPE, /* module type */
|
||||
NULL /* init module */
|
||||
};
|
||||
|
||||
|
||||
@ -53,7 +64,7 @@ int ngx_http_index_handler(ngx_http_request_t *r)
|
||||
ngx_http_index_conf_t *cf;
|
||||
|
||||
cf = (ngx_http_index_conf_t *)
|
||||
ngx_get_module_loc_conf(r, ngx_http_index_module);
|
||||
ngx_http_get_module_loc_conf(r, ngx_http_index_module_ctx);
|
||||
|
||||
ngx_test_null(name,
|
||||
ngx_palloc(r->pool,
|
||||
@ -71,11 +82,13 @@ int ngx_http_index_handler(ngx_http_request_t *r)
|
||||
fd = ngx_open_file(name, NGX_FILE_RDONLY);
|
||||
if (fd == NGX_INVALID_FILE) {
|
||||
err = ngx_errno;
|
||||
if (err == NGX_ENOENT)
|
||||
if (err == NGX_ENOENT) {
|
||||
continue;
|
||||
}
|
||||
#if (WIN32)
|
||||
if (err == ERROR_PATH_NOT_FOUND)
|
||||
if (err == ERROR_PATH_NOT_FOUND) {
|
||||
continue;
|
||||
}
|
||||
#endif
|
||||
|
||||
ngx_log_error(NGX_LOG_ERR, r->connection->log, err,
|
||||
@ -117,8 +130,9 @@ static void *ngx_http_index_merge_conf(ngx_pool_t *p, void *parent, void *child)
|
||||
ngx_str_t *index;
|
||||
|
||||
if (conf->max_index_len == 0) {
|
||||
if (prev->max_index_len != 0)
|
||||
if (prev->max_index_len != 0) {
|
||||
return prev;
|
||||
}
|
||||
|
||||
ngx_test_null(index, ngx_push_array(conf->indices), NULL);
|
||||
index->len = sizeof(NGX_HTTP_INDEX) - 1;
|
||||
@ -130,18 +144,23 @@ static void *ngx_http_index_merge_conf(ngx_pool_t *p, void *parent, void *child)
|
||||
}
|
||||
|
||||
|
||||
static char *ngx_http_index_set_index(ngx_pool_t *p, void *conf,
|
||||
ngx_str_t *value)
|
||||
static char *ngx_http_index_set_index(ngx_conf_t *cf, ngx_command_t *cmd,
|
||||
char *conf)
|
||||
{
|
||||
ngx_http_index_conf_t *cf = (ngx_http_index_conf_t *) conf;
|
||||
ngx_str_t *index;
|
||||
ngx_http_index_conf_t *icf = (ngx_http_index_conf_t *) conf;
|
||||
int i;
|
||||
ngx_str_t *index, *value;
|
||||
|
||||
ngx_test_null(index, ngx_push_array(cf->indices), NULL);
|
||||
index->len = value->len;
|
||||
index->data = value->data;
|
||||
value = (ngx_str_t *) cf->args->elts;
|
||||
for (i = 1; i < cf->args->nelts; i++) {
|
||||
ngx_test_null(index, ngx_push_array(icf->indices), NULL);
|
||||
index->len = value[i].len;
|
||||
index->data = value[i].data;
|
||||
|
||||
if (cf->max_index_len < index->len)
|
||||
cf->max_index_len = index->len;
|
||||
if (icf->max_index_len < index->len) {
|
||||
icf->max_index_len = index->len;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
@ -9,13 +9,14 @@
|
||||
|
||||
#define NGX_HTTP_INDEX "index.html"
|
||||
|
||||
|
||||
typedef struct {
|
||||
ngx_array_t *indices;
|
||||
size_t max_index_len;
|
||||
} ngx_http_index_conf_t;
|
||||
|
||||
|
||||
extern ngx_http_module_t ngx_http_index_module;
|
||||
extern ngx_module_t ngx_http_index_module;
|
||||
|
||||
|
||||
#endif /* _NGX_HTTP_INDEX_HANDLER_H_INCLUDED_ */
|
||||
|
@ -39,7 +39,8 @@ int ngx_http_init(ngx_pool_t *pool, ngx_log_t *log)
|
||||
ngx_http_server.doc_root_len = strlen(ngx_http_server.doc_root) + 1;
|
||||
|
||||
|
||||
ngx_http_config_modules(pool, ngx_http_modules);
|
||||
ngx_http_config_modules(pool, ngx_modules);
|
||||
#if 0
|
||||
|
||||
/* STUB */
|
||||
ngx_http_output_filter_set_stub(pool, ngx_http_modules);
|
||||
@ -47,7 +48,8 @@ int ngx_http_init(ngx_pool_t *pool, ngx_log_t *log)
|
||||
ngx_http_index_set_stub(pool, ngx_http_modules);
|
||||
|
||||
ngx_http_init_modules(pool, ngx_http_modules);
|
||||
ngx_http_init_filters(pool, ngx_http_modules);
|
||||
#endif
|
||||
ngx_http_init_filters(pool, ngx_modules);
|
||||
|
||||
ls = ngx_push_array(ngx_listening_sockets);
|
||||
ngx_memzero(ls, sizeof(ngx_listen_t));
|
||||
|
@ -188,29 +188,18 @@ typedef int (*ngx_http_output_body_filter_p)
|
||||
|
||||
|
||||
typedef struct {
|
||||
int index;
|
||||
int index;
|
||||
|
||||
void *(*create_srv_conf)(ngx_pool_t *p);
|
||||
void *(*create_loc_conf)(ngx_pool_t *p);
|
||||
void *(*create_srv_conf)(ngx_pool_t *p);
|
||||
void *(*create_loc_conf)(ngx_pool_t *p);
|
||||
|
||||
int (*translate_handler)(ngx_http_request_t *r);
|
||||
int (*translate_handler)(ngx_http_request_t *r);
|
||||
|
||||
int (*output_header_filter) (ngx_http_request_t *r);
|
||||
int (*next_output_header_filter) (ngx_http_request_t *r);
|
||||
int (*output_header_filter) (ngx_http_request_t *r);
|
||||
int (*next_output_header_filter) (ngx_http_request_t *r);
|
||||
|
||||
ngx_http_output_body_filter_p output_body_filter;
|
||||
ngx_http_output_body_filter_p next_output_body_filter;
|
||||
|
||||
#if 0
|
||||
int (*output_body_filter)();
|
||||
int (*next_output_body_filter)
|
||||
(ngx_http_request_t *r, ngx_chain_t *ch);
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
int (*next_output_body_filter)(int (**next_filter)
|
||||
(ngx_http_request_t *r, ngx_chain_t *ch));
|
||||
#endif
|
||||
int (*output_body_filter) (ngx_http_request_t *r, ngx_chain_t *ch);
|
||||
int (*next_output_body_filter) (ngx_http_request_t *r, ngx_chain_t *ch);
|
||||
} ngx_http_module_t;
|
||||
|
||||
|
||||
@ -219,11 +208,6 @@ typedef struct {
|
||||
#define NGX_HTTP_MODULE_TYPE 0x50545448 /* "HTTP" */
|
||||
|
||||
|
||||
/* STUB */
|
||||
#define ngx_get_module_loc_conf(r, module) r->loc_conf[module.index]
|
||||
#define ngx_get_module_ctx(r, module) r->ctx[module.index]
|
||||
/**/
|
||||
|
||||
#define ngx_http_get_module_srv_conf(r, module) r->srv_conf[module.index]
|
||||
#define ngx_http_get_module_loc_conf(r, module) r->loc_conf[module.index]
|
||||
#define ngx_http_get_module_ctx(r, module) r->ctx[module.index]
|
||||
|
@ -3,58 +3,106 @@
|
||||
#include <ngx_core.h>
|
||||
#include <ngx_config_file.h>
|
||||
#include <ngx_http.h>
|
||||
#include <ngx_http_core.h>
|
||||
#include <ngx_http_config.h>
|
||||
#include <ngx_http_write_filter.h>
|
||||
#include <ngx_http_output_filter.h>
|
||||
#include <ngx_http_index_handler.h>
|
||||
|
||||
|
||||
int ngx_max_module;
|
||||
|
||||
int (*ngx_http_top_header_filter) (ngx_http_request_t *r);
|
||||
|
||||
/* STUB: gobal srv and loc conf */
|
||||
/* STUB */
|
||||
void **ngx_srv_conf;
|
||||
void **ngx_loc_conf;
|
||||
/**/
|
||||
|
||||
#if 0
|
||||
int ngx_http_block(ngx_conf_t *cf)
|
||||
|
||||
static int ngx_http_block(ngx_conf_t *cf, ngx_command_t *cmd, char *dummy);
|
||||
|
||||
|
||||
void *null_loc_conf;
|
||||
|
||||
|
||||
static ngx_command_t ngx_http_commands[] = {
|
||||
|
||||
{ngx_string("http"),
|
||||
NGX_CONF_BLOCK|NGX_CONF_NOARGS,
|
||||
ngx_http_block,
|
||||
0,
|
||||
0},
|
||||
|
||||
{ngx_string(""), 0, NULL, 0, 0}
|
||||
};
|
||||
|
||||
|
||||
static ngx_http_module_t ngx_http_module_ctx = {
|
||||
NGX_HTTP_MODULE,
|
||||
|
||||
NULL, /* create server config */
|
||||
NULL, /* create location config */
|
||||
|
||||
NULL, /* translate handler */
|
||||
|
||||
NULL, /* output header filter */
|
||||
NULL, /* next output header filter */
|
||||
NULL, /* output body filter */
|
||||
NULL /* next output body filter */
|
||||
};
|
||||
|
||||
|
||||
ngx_module_t ngx_http_module = {
|
||||
&ngx_http_module_ctx, /* module context */
|
||||
ngx_http_commands, /* module directives */
|
||||
0, /* module type */
|
||||
NULL /* init module */
|
||||
};
|
||||
|
||||
|
||||
static int ngx_http_block(ngx_conf_t *cf, ngx_command_t *cmd, char *dummy)
|
||||
{
|
||||
int i, j;
|
||||
ngx_http_module_t *module;
|
||||
ngx_http_conf_ctx_t *ctx;
|
||||
|
||||
ngx_test_null(ctx,
|
||||
ngx_pcalloc(cf->pool, sizeof(ngx_http_conf_ctx_t)),
|
||||
for (i = 0; ngx_modules[i]; i++) {
|
||||
if (ngx_modules[i]->type != NGX_HTTP_MODULE_TYPE) {
|
||||
continue;
|
||||
}
|
||||
|
||||
module = (ngx_http_module_t *) ngx_modules[i]->ctx;
|
||||
module->index = i;
|
||||
}
|
||||
|
||||
ngx_http_max_module = i;
|
||||
|
||||
ngx_test_null(null_loc_conf,
|
||||
ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module),
|
||||
NGX_ERROR);
|
||||
|
||||
#if 0
|
||||
/* null server config */
|
||||
ngx_test_null(ctx->srv_conf,
|
||||
ngx_pcalloc(cf->pool, sizeof(void *) * ngx_max_module),
|
||||
NGX_ERROR);
|
||||
#endif
|
||||
ctx->srv_conf = NULL;
|
||||
ctx->loc_conf = null_loc_conf;
|
||||
|
||||
/* null location config */
|
||||
ngx_test_null(ctx->loc_conf,
|
||||
ngx_pcalloc(cf->pool, sizeof(void *) * ngx_max_module),
|
||||
NGX_ERROR);
|
||||
for (i = 0, j = 0; ngx_modules[i]; i++) {
|
||||
if (ngx_modules[i]->type != NGX_HTTP_MODULE_TYPE) {
|
||||
continue;
|
||||
}
|
||||
|
||||
for (i = 0; modules[i]; i++) {
|
||||
#if 0
|
||||
if (modules[i]->create_srv_conf)
|
||||
ngx_test_null(ctx->srv_conf[i],
|
||||
modules[i]->create_srv_conf(cf->pool),
|
||||
NGX_ERROR);
|
||||
#endif
|
||||
|
||||
if (modules[i]->create_loc_conf)
|
||||
ngx_test_null(ctx->loc_conf[i],
|
||||
modules[i]->create_loc_conf(cf->pool),
|
||||
module = (ngx_http_module_t *) ngx_modules[i]->ctx;
|
||||
module->index = i;
|
||||
if (module->create_loc_conf) {
|
||||
ngx_test_null(null_loc_conf,
|
||||
module->create_loc_conf(cf->pool),
|
||||
NGX_ERROR);
|
||||
j++;
|
||||
}
|
||||
}
|
||||
|
||||
cf->ctx = ctx;
|
||||
return ngx_conf_parse(cf);
|
||||
cf->type = NGX_HTTP_MODULE_TYPE;
|
||||
return ngx_conf_parse(cf, NULL);
|
||||
}
|
||||
|
||||
|
||||
#if 0
|
||||
int ngx_server_block(ngx_conf_t *cf)
|
||||
{
|
||||
ngx_http_conf_ctx_t *ctx, *prev;
|
||||
@ -155,21 +203,29 @@ int ngx_location_block(ngx_conf_t *cf)
|
||||
|
||||
#endif
|
||||
|
||||
int ngx_http_config_modules(ngx_pool_t *pool, ngx_http_module_t **modules)
|
||||
|
||||
int ngx_http_config_modules(ngx_pool_t *pool, ngx_module_t **modules)
|
||||
{
|
||||
int i;
|
||||
ngx_http_module_t *module;
|
||||
|
||||
for (i = 0; modules[i]; i++) {
|
||||
modules[i]->index = i;
|
||||
if (modules[i]->type != NGX_HTTP_MODULE_TYPE) {
|
||||
continue;
|
||||
}
|
||||
|
||||
module = (ngx_http_module_t *) modules[i]->ctx;
|
||||
module->index = i;
|
||||
}
|
||||
|
||||
ngx_max_module = i;
|
||||
ngx_http_max_module = i;
|
||||
|
||||
#if 0
|
||||
ngx_test_null(ngx_srv_conf,
|
||||
ngx_pcalloc(pool, sizeof(void *) * ngx_max_module),
|
||||
ngx_pcalloc(pool, sizeof(void *) * ngx_http_max_module),
|
||||
NGX_ERROR);
|
||||
ngx_test_null(ngx_loc_conf,
|
||||
ngx_pcalloc(pool, sizeof(void *) * ngx_max_module),
|
||||
ngx_pcalloc(pool, sizeof(void *) * ngx_http_max_module),
|
||||
NGX_ERROR);
|
||||
|
||||
for (i = 0; modules[i]; i++) {
|
||||
@ -179,94 +235,36 @@ int ngx_http_config_modules(ngx_pool_t *pool, ngx_http_module_t **modules)
|
||||
if (modules[i]->create_loc_conf)
|
||||
ngx_loc_conf[i] = modules[i]->create_loc_conf(pool);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
int ngx_http_init_modules(ngx_pool_t *pool, ngx_http_module_t **modules)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; modules[i]; i++) {
|
||||
if (modules[i]->init_module)
|
||||
modules[i]->init_module(pool);
|
||||
}
|
||||
}
|
||||
|
||||
int ngx_http_init_filters(ngx_pool_t *pool, ngx_http_module_t **modules)
|
||||
void ngx_http_init_filters(ngx_pool_t *pool, ngx_module_t **modules)
|
||||
{
|
||||
int i;
|
||||
int i;
|
||||
ngx_http_module_t *module;
|
||||
int (*ohf)(ngx_http_request_t *r);
|
||||
int (*obf)(ngx_http_request_t *r, ngx_chain_t *ch);
|
||||
|
||||
ohf = NULL;
|
||||
obf = NULL;
|
||||
|
||||
for (i = 0; modules[i]; i++) {
|
||||
if (modules[i]->output_header_filter) {
|
||||
modules[i]->next_output_header_filter = ohf;
|
||||
ohf = modules[i]->output_header_filter;
|
||||
if (modules[i]->type != NGX_HTTP_MODULE_TYPE) {
|
||||
continue;
|
||||
}
|
||||
|
||||
module = (ngx_http_module_t *) modules[i]->ctx;
|
||||
if (module->output_header_filter) {
|
||||
module->next_output_header_filter = ohf;
|
||||
ohf = module->output_header_filter;
|
||||
}
|
||||
|
||||
if (module->output_body_filter) {
|
||||
module->next_output_body_filter = obf;
|
||||
obf = module->output_body_filter;
|
||||
}
|
||||
}
|
||||
|
||||
ngx_http_top_header_filter = ohf;
|
||||
|
||||
obf = NULL;
|
||||
|
||||
for (i = 0; modules[i]; i++) {
|
||||
if (modules[i]->output_body_filter) {
|
||||
modules[i]->next_output_body_filter = obf;
|
||||
obf = modules[i]->output_body_filter;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* STUB */
|
||||
ngx_http_output_filter_set_stub(ngx_pool_t *pool, ngx_http_module_t **modules)
|
||||
{
|
||||
int i;
|
||||
ngx_command_t *cmd;
|
||||
|
||||
for (i = 0; modules[i]; i++) {
|
||||
if (modules[i] == &ngx_http_output_filter_module) {
|
||||
for (cmd = modules[i]->commands; cmd->name; cmd++) {
|
||||
if (strcmp(cmd->name, "output_buffer") == 0) {
|
||||
cmd->set(ngx_loc_conf[i], cmd->offset, "32768");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ngx_http_write_filter_set_stub(ngx_pool_t *pool, ngx_http_module_t **modules)
|
||||
{
|
||||
int i;
|
||||
ngx_command_t *cmd;
|
||||
|
||||
for (i = 0; modules[i]; i++) {
|
||||
if (modules[i] == &ngx_http_write_filter_module) {
|
||||
for (cmd = modules[i]->commands; cmd->name; cmd++) {
|
||||
if (strcmp(cmd->name, "write_buffer") == 0) {
|
||||
cmd->set(ngx_loc_conf[i], cmd->offset, "1500");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ngx_http_index_set_stub(ngx_pool_t *pool, ngx_http_module_t **modules)
|
||||
{
|
||||
int i;
|
||||
ngx_str_t index;
|
||||
ngx_command_t *cmd;
|
||||
|
||||
for (i = 0; modules[i]; i++) {
|
||||
if (modules[i] == &ngx_http_index_module) {
|
||||
for (cmd = modules[i]->commands; cmd->name; cmd++) {
|
||||
if (strcmp(cmd->name, "index") == 0) {
|
||||
index.len = sizeof("index.html") - 1;
|
||||
index.data = "index.html";
|
||||
cmd->set(pool, ngx_loc_conf[i], &index);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -5,9 +5,21 @@
|
||||
#include <ngx_alloc.h>
|
||||
#include <ngx_http.h>
|
||||
|
||||
#define NGX_HTTP_LOC_CONF 0
|
||||
|
||||
int ngx_http_config_modules(ngx_pool_t *pool, ngx_http_module_t **modules);
|
||||
typedef struct {
|
||||
void **srv_conf;
|
||||
void **loc_conf;
|
||||
} ngx_http_conf_ctx_t;
|
||||
|
||||
|
||||
#define NGX_HTTP_SRV_CONF offsetof(ngx_http_conf_ctx_t, srv_conf)
|
||||
#define NGX_HTTP_LOC_CONF offsetof(ngx_http_conf_ctx_t, loc_conf)
|
||||
|
||||
|
||||
int ngx_http_config_modules(ngx_pool_t *pool, ngx_module_t **modules);
|
||||
|
||||
|
||||
extern ngx_module_t ngx_http_module;
|
||||
|
||||
|
||||
extern int (*ngx_http_top_header_filter) (ngx_http_request_t *r);
|
||||
|
@ -7,7 +7,6 @@
|
||||
#include <ngx_http_config.h>
|
||||
|
||||
/* STUB */
|
||||
#include <ngx_http_output_filter.h>
|
||||
int ngx_http_static_handler(ngx_http_request_t *r);
|
||||
int ngx_http_index_handler(ngx_http_request_t *r);
|
||||
int ngx_http_proxy_handler(ngx_http_request_t *r);
|
||||
@ -18,60 +17,85 @@ static void *ngx_http_core_create_loc_conf(ngx_pool_t *pool);
|
||||
static int ngx_http_core_translate_handler(ngx_http_request_t *r);
|
||||
|
||||
|
||||
int (*ngx_http_top_header_filter) (ngx_http_request_t *r);
|
||||
|
||||
int ngx_http_max_module;
|
||||
|
||||
|
||||
static ngx_command_t ngx_http_core_commands[] = {
|
||||
|
||||
{"send_timeout", ngx_conf_set_time_slot,
|
||||
offsetof(ngx_http_core_loc_conf_t, send_timeout),
|
||||
NGX_HTTP_LOC_CONF, NGX_CONF_TAKE1,
|
||||
"set timeout for sending response"},
|
||||
|
||||
{NULL}
|
||||
{ngx_string("send_timeout"),
|
||||
NGX_CONF_TAKE1,
|
||||
ngx_conf_set_time_slot,
|
||||
NGX_HTTP_LOC_CONF,
|
||||
offsetof(ngx_http_core_loc_conf_t, send_timeout)},
|
||||
|
||||
{ngx_string(""), 0, NULL, 0, 0}
|
||||
};
|
||||
|
||||
|
||||
ngx_http_module_t ngx_http_core_module = {
|
||||
ngx_http_module_t ngx_http_core_module_ctx = {
|
||||
NGX_HTTP_MODULE,
|
||||
|
||||
ngx_http_core_create_srv_conf, /* create server config */
|
||||
ngx_http_core_create_loc_conf, /* create location config */
|
||||
ngx_http_core_commands, /* module directives */
|
||||
|
||||
/* STUB */ NULL, /* init module */
|
||||
ngx_http_core_translate_handler, /* translate handler */
|
||||
|
||||
NULL /* init output body filter */
|
||||
NULL, /* output header filter */
|
||||
NULL, /* next output header filter */
|
||||
NULL, /* output body filter */
|
||||
NULL, /* next output body filter */
|
||||
};
|
||||
|
||||
|
||||
ngx_module_t ngx_http_core_module = {
|
||||
&ngx_http_core_module_ctx, /* module context */
|
||||
ngx_http_core_commands, /* module directives */
|
||||
NGX_HTTP_MODULE_TYPE, /* module type */
|
||||
NULL /* init module */
|
||||
};
|
||||
|
||||
|
||||
int ngx_http_handler(ngx_http_request_t *r)
|
||||
{
|
||||
int rc, i;
|
||||
ngx_http_module_t *module;
|
||||
|
||||
r->connection->unexpected_eof = 0;
|
||||
r->lingering_close = 1;
|
||||
r->keepalive = 0;
|
||||
|
||||
#if 1
|
||||
#if 0
|
||||
r->filter = NGX_HTTP_FILTER_NEED_IN_MEMORY;
|
||||
#endif
|
||||
|
||||
/* run translation phase */
|
||||
for (i = 0; ngx_http_modules[i]; i++) {
|
||||
if (ngx_http_modules[i]->translate_handler) {
|
||||
rc = ngx_http_modules[i]->translate_handler(r);
|
||||
if (rc == NGX_OK)
|
||||
break;
|
||||
for (i = 0; ngx_modules[i]; i++) {
|
||||
if (ngx_modules[i]->type != NGX_HTTP_MODULE_TYPE) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (rc >= NGX_HTTP_SPECIAL_RESPONSE)
|
||||
return ngx_http_special_response(r, rc);
|
||||
module = (ngx_http_module_t *) ngx_modules[i]->ctx;
|
||||
if (module->translate_handler == NULL) {
|
||||
continue;
|
||||
}
|
||||
|
||||
rc = module->translate_handler(r);
|
||||
if (rc == NGX_OK) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {
|
||||
return ngx_http_special_response(r, rc);
|
||||
}
|
||||
}
|
||||
|
||||
rc = r->handler(r);
|
||||
|
||||
if (rc >= NGX_HTTP_SPECIAL_RESPONSE)
|
||||
if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {
|
||||
return ngx_http_special_response(r, rc);
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
@ -122,18 +146,20 @@ static int ngx_http_core_translate_handler(ngx_http_request_t *r)
|
||||
"ngx_http_core_translate_handler: "
|
||||
ngx_file_type_n " %s failed", r->file.name.data);
|
||||
|
||||
if (err == ERROR_FILE_NOT_FOUND)
|
||||
if (err == ERROR_FILE_NOT_FOUND) {
|
||||
return NGX_HTTP_NOT_FOUND;
|
||||
else if (err == ERROR_PATH_NOT_FOUND)
|
||||
} else if (err == ERROR_PATH_NOT_FOUND) {
|
||||
return NGX_HTTP_NOT_FOUND;
|
||||
else
|
||||
} else {
|
||||
return NGX_HTTP_INTERNAL_SERVER_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
if (r->file.fd == NGX_INVALID_FILE)
|
||||
if (r->file.fd == NGX_INVALID_FILE) {
|
||||
r->file.fd = ngx_open_file(r->file.name.data, NGX_FILE_RDONLY);
|
||||
}
|
||||
|
||||
if (r->file.fd == NGX_INVALID_FILE) {
|
||||
err = ngx_errno;
|
||||
@ -141,10 +167,11 @@ static int ngx_http_core_translate_handler(ngx_http_request_t *r)
|
||||
"ngx_http_core_handler: "
|
||||
ngx_open_file_n " %s failed", r->file.name.data);
|
||||
|
||||
if (err == NGX_ENOENT)
|
||||
if (err == NGX_ENOENT) {
|
||||
return NGX_HTTP_NOT_FOUND;
|
||||
else
|
||||
} else {
|
||||
return NGX_HTTP_INTERNAL_SERVER_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
if (!r->file.info_valid) {
|
||||
@ -153,10 +180,11 @@ static int ngx_http_core_translate_handler(ngx_http_request_t *r)
|
||||
"ngx_http_core_handler: "
|
||||
ngx_stat_fd_n " %s failed", r->file.name.data);
|
||||
|
||||
if (ngx_close_file(r->file.fd) == NGX_FILE_ERROR)
|
||||
if (ngx_close_file(r->file.fd) == NGX_FILE_ERROR) {
|
||||
ngx_log_error(NGX_LOG_ERR, r->connection->log, ngx_errno,
|
||||
"ngx_http_core_handler: "
|
||||
ngx_close_file_n " %s failed", r->file.name.data);
|
||||
}
|
||||
|
||||
return NGX_HTTP_INTERNAL_SERVER_ERROR;
|
||||
}
|
||||
@ -169,10 +197,11 @@ static int ngx_http_core_translate_handler(ngx_http_request_t *r)
|
||||
ngx_log_debug(r->connection->log, "HTTP DIR: '%s'" _ r->file.name.data);
|
||||
|
||||
#if !(WIN9X)
|
||||
if (ngx_close_file(r->file.fd) == NGX_FILE_ERROR)
|
||||
if (ngx_close_file(r->file.fd) == NGX_FILE_ERROR) {
|
||||
ngx_log_error(NGX_LOG_ERR, r->connection->log, ngx_errno,
|
||||
"ngx_http_core_handler: "
|
||||
ngx_close_file_n " %s failed", r->file.name.data);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* BROKEN: need to include server name */
|
||||
|
@ -9,16 +9,22 @@ typedef struct {
|
||||
int dummy;
|
||||
} ngx_http_core_conf_t;
|
||||
|
||||
|
||||
typedef struct {
|
||||
int dummy;
|
||||
} ngx_http_core_srv_conf_t;
|
||||
|
||||
|
||||
typedef struct {
|
||||
time_t send_timeout;
|
||||
} ngx_http_core_loc_conf_t;
|
||||
|
||||
|
||||
extern ngx_http_module_t ngx_http_core_module;
|
||||
extern ngx_http_module_t ngx_http_core_module_ctx;
|
||||
extern ngx_module_t ngx_http_core_module;
|
||||
|
||||
extern int (*ngx_http_top_header_filter) (ngx_http_request_t *r);
|
||||
extern int ngx_http_max_module;
|
||||
|
||||
|
||||
#endif /* _NGX_HTTP_CORE_H_INCLUDED_ */
|
||||
|
@ -177,7 +177,8 @@ static int ngx_http_init_request(ngx_event_t *ev)
|
||||
ngx_test_null(r->pool, ngx_create_pool(srv->request_pool_size, ev->log),
|
||||
ngx_http_close_request(r));
|
||||
|
||||
ngx_test_null(r->ctx, ngx_pcalloc(r->pool, sizeof(void *) * ngx_max_module),
|
||||
ngx_test_null(r->ctx,
|
||||
ngx_pcalloc(r->pool, sizeof(void *) * ngx_http_max_module),
|
||||
ngx_http_close_request(r));
|
||||
|
||||
r->headers_out.headers = ngx_create_table(r->pool, 10);
|
||||
@ -519,8 +520,8 @@ static int ngx_http_writer(ngx_event_t *ev)
|
||||
|
||||
if (c->sent > 0) {
|
||||
conf = (ngx_http_core_loc_conf_t *)
|
||||
ngx_get_module_loc_conf(r->main ? r->main : r,
|
||||
ngx_http_core_module);
|
||||
ngx_http_get_module_loc_conf(r->main ? r->main : r,
|
||||
ngx_http_core_module_ctx);
|
||||
|
||||
timeout = (ngx_msec_t) (c->sent * conf->send_timeout);
|
||||
|
||||
|
@ -6,19 +6,20 @@
|
||||
#include <ngx_string.h>
|
||||
#include <ngx_table.h>
|
||||
#include <ngx_hunk.h>
|
||||
#include <ngx_config_file.h>
|
||||
#include <ngx_http.h>
|
||||
#include <ngx_http_write_filter.h>
|
||||
|
||||
|
||||
static int ngx_http_header_filter(ngx_http_request_t *r);
|
||||
|
||||
ngx_http_module_t ngx_http_header_filter_module = {
|
||||
|
||||
ngx_http_module_t ngx_http_header_filter_module_ctx = {
|
||||
NGX_HTTP_MODULE,
|
||||
|
||||
NULL, /* create server config */
|
||||
NULL, /* create location config */
|
||||
NULL, /* module directives */
|
||||
|
||||
NULL, /* init module */
|
||||
NULL, /* translate handler */
|
||||
|
||||
ngx_http_header_filter, /* output header filter */
|
||||
@ -28,12 +29,23 @@ ngx_http_module_t ngx_http_header_filter_module = {
|
||||
};
|
||||
|
||||
|
||||
ngx_module_t ngx_http_header_filter_module = {
|
||||
&ngx_http_header_filter_module_ctx, /* module context */
|
||||
NULL, /* module directives */
|
||||
NGX_HTTP_MODULE_TYPE, /* module type */
|
||||
NULL /* init module */
|
||||
};
|
||||
|
||||
|
||||
static char server_string[] = "Server: " NGINX_VER CRLF;
|
||||
|
||||
|
||||
static ngx_str_t http_codes[] = {
|
||||
|
||||
ngx_string("200 OK"),
|
||||
#if 0
|
||||
{ 6, "200 OK" },
|
||||
#endif
|
||||
|
||||
{ 21, "301 Moved Permanently" },
|
||||
{ 21, "302 Moved Temporarily" },
|
||||
@ -59,8 +71,9 @@ static int ngx_http_header_filter(ngx_http_request_t *r)
|
||||
ngx_chain_t *ch;
|
||||
ngx_table_elt_t *header;
|
||||
|
||||
if (r->http_version < NGX_HTTP_VERSION_10)
|
||||
if (r->http_version < NGX_HTTP_VERSION_10) {
|
||||
return NGX_OK;
|
||||
}
|
||||
|
||||
/* 9 is for "HTTP/1.x ", 2 is for trailing "\r\n"
|
||||
and 2 is for end of header */
|
||||
@ -89,19 +102,21 @@ static int ngx_http_header_filter(ngx_http_request_t *r)
|
||||
/* status line */
|
||||
if (r->headers_out.status_line.len) {
|
||||
len += r->headers_out.status_line.len;
|
||||
|
||||
} else {
|
||||
if (r->headers_out.status < NGX_HTTP_MOVED_PERMANENTLY)
|
||||
if (r->headers_out.status < NGX_HTTP_MOVED_PERMANENTLY) {
|
||||
status = r->headers_out.status - NGX_HTTP_OK;
|
||||
|
||||
else if (r->headers_out.status < NGX_HTTP_BAD_REQUEST)
|
||||
} else if (r->headers_out.status < NGX_HTTP_BAD_REQUEST) {
|
||||
status = r->headers_out.status - NGX_HTTP_MOVED_PERMANENTLY + 1;
|
||||
|
||||
else if (r->headers_out.status < NGX_HTTP_INTERNAL_SERVER_ERROR)
|
||||
} else if (r->headers_out.status < NGX_HTTP_INTERNAL_SERVER_ERROR) {
|
||||
status = r->headers_out.status - NGX_HTTP_BAD_REQUEST + 1 + 4;
|
||||
|
||||
else
|
||||
} else {
|
||||
status = r->headers_out.status
|
||||
- NGX_HTTP_INTERNAL_SERVER_ERROR + 1 + 4 + 5;
|
||||
}
|
||||
|
||||
len += http_codes[status].len;
|
||||
}
|
||||
@ -122,8 +137,9 @@ static int ngx_http_header_filter(ngx_http_request_t *r)
|
||||
}
|
||||
|
||||
/* 2^64 is 20 characters */
|
||||
if (r->headers_out.content_length >= 0)
|
||||
if (r->headers_out.content_length >= 0) {
|
||||
len += 48;
|
||||
}
|
||||
|
||||
#if 0
|
||||
if (r->headers_out.content_type.len)
|
||||
@ -138,15 +154,17 @@ static int ngx_http_header_filter(ngx_http_request_t *r)
|
||||
len += 46;
|
||||
}
|
||||
|
||||
if (r->keepalive)
|
||||
if (r->keepalive) {
|
||||
len += 24;
|
||||
else
|
||||
} else {
|
||||
len += 19;
|
||||
}
|
||||
|
||||
header = (ngx_table_elt_t *) r->headers_out.headers->elts;
|
||||
for (i = 0; i < r->headers_out.headers->nelts; i++) {
|
||||
if (header[i].key.len == 0)
|
||||
if (header[i].key.len == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
len += header[i].key.len + 2 + header[i].value.len + 2;
|
||||
}
|
||||
@ -183,9 +201,10 @@ static int ngx_http_header_filter(ngx_http_request_t *r)
|
||||
}
|
||||
|
||||
/* 2^64 is 20 characters */
|
||||
if (r->headers_out.content_length >= 0)
|
||||
if (r->headers_out.content_length >= 0) {
|
||||
h->last.mem += ngx_snprintf(h->last.mem, 49, "Content-Length: %u" CRLF,
|
||||
r->headers_out.content_length);
|
||||
}
|
||||
|
||||
#if 0
|
||||
if (r->headers_out.content_type.len) {
|
||||
@ -219,8 +238,9 @@ static int ngx_http_header_filter(ngx_http_request_t *r)
|
||||
}
|
||||
|
||||
for (i = 0; i < r->headers_out.headers->nelts; i++) {
|
||||
if (header[i].key.len == 0)
|
||||
if (header[i].key.len == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
ngx_memcpy(h->last.mem, header[i].key.data, header[i].key.len);
|
||||
h->last.mem += header[i].key.len;
|
||||
@ -239,8 +259,9 @@ static int ngx_http_header_filter(ngx_http_request_t *r)
|
||||
/* end of HTTP header */
|
||||
*(h->last.mem++) = CR; *(h->last.mem++) = LF;
|
||||
|
||||
if (r->header_only)
|
||||
if (r->header_only) {
|
||||
h->type |= NGX_HUNK_LAST;
|
||||
}
|
||||
|
||||
ngx_test_null(ch, ngx_palloc(r->pool, sizeof(ngx_chain_t)), NGX_ERROR);
|
||||
|
||||
|
@ -10,7 +10,6 @@
|
||||
#include <ngx_http_output_filter.h>
|
||||
|
||||
|
||||
static int ngx_http_output_filter(ngx_http_request_t *r, ngx_hunk_t *hunk);
|
||||
static int ngx_http_output_filter_copy_hunk(ngx_hunk_t *dst, ngx_hunk_t *src);
|
||||
static void *ngx_http_output_filter_create_conf(ngx_pool_t *pool);
|
||||
|
||||
@ -18,12 +17,12 @@ static void *ngx_http_output_filter_create_conf(ngx_pool_t *pool);
|
||||
static ngx_command_t ngx_http_output_filter_commands[] = {
|
||||
|
||||
{ngx_string("output_buffer"),
|
||||
NGX_CONF_TAKE1,
|
||||
ngx_conf_set_size_slot,
|
||||
offsetof(ngx_http_output_filter_conf_t, hunk_size),
|
||||
NGX_HTTP_LOC_CONF,
|
||||
NGX_CONF_TAKE1},
|
||||
offsetof(ngx_http_output_filter_conf_t, hunk_size)},
|
||||
|
||||
{ngx_string(""), NULL, 0, 0, 0}
|
||||
{ngx_string(""), 0, NULL, 0, 0}
|
||||
};
|
||||
|
||||
|
||||
@ -37,8 +36,8 @@ static ngx_http_module_t ngx_http_output_filter_module_ctx = {
|
||||
|
||||
NULL, /* output header filter */
|
||||
NULL, /* next output header filter */
|
||||
(ngx_http_output_body_filter_p) ngx_http_output_filter,
|
||||
/* output body filter */
|
||||
(int (*)(ngx_http_request_t *, ngx_chain_t *))
|
||||
ngx_http_output_filter, /* output body filter */
|
||||
NULL /* next output body filter */
|
||||
};
|
||||
|
||||
@ -51,7 +50,7 @@ ngx_module_t ngx_http_output_filter_module = {
|
||||
};
|
||||
|
||||
|
||||
static int ngx_http_output_filter(ngx_http_request_t *r, ngx_hunk_t *hunk)
|
||||
int ngx_http_output_filter(ngx_http_request_t *r, ngx_hunk_t *hunk)
|
||||
{
|
||||
int rc, once;
|
||||
size_t size;
|
||||
|
@ -23,6 +23,9 @@ typedef struct {
|
||||
} ngx_http_output_filter_ctx_t;
|
||||
|
||||
|
||||
int ngx_http_output_filter(ngx_http_request_t *r, ngx_hunk_t *hunk);
|
||||
|
||||
|
||||
extern ngx_module_t ngx_http_output_filter_module;
|
||||
|
||||
|
||||
|
@ -5,35 +5,30 @@
|
||||
#include <ngx_event_write.h>
|
||||
#include <ngx_http.h>
|
||||
#include <ngx_http_config.h>
|
||||
#include <ngx_http_output_filter.h>
|
||||
#include <ngx_http_write_filter.h>
|
||||
|
||||
|
||||
int ngx_http_write_filter(ngx_http_request_t *r, ngx_chain_t *in);
|
||||
|
||||
static void *ngx_http_write_filter_create_conf(ngx_pool_t *pool);
|
||||
|
||||
|
||||
static ngx_command_t ngx_http_write_filter_commands[] = {
|
||||
|
||||
{"write_buffer", ngx_conf_set_size_slot,
|
||||
offsetof(ngx_http_write_filter_conf_t, buffer_output),
|
||||
NGX_HTTP_LOC_CONF, NGX_CONF_TAKE1,
|
||||
"set write filter size to buffer output"},
|
||||
|
||||
{NULL}
|
||||
{ngx_string("write_buffer"),
|
||||
NGX_CONF_TAKE1,
|
||||
ngx_conf_set_size_slot,
|
||||
NGX_HTTP_LOC_CONF,
|
||||
offsetof(ngx_http_write_filter_conf_t, buffer_output)},
|
||||
|
||||
{ngx_string(""), 0, NULL, 0, 0}
|
||||
};
|
||||
|
||||
|
||||
ngx_http_module_t ngx_http_write_filter_module = {
|
||||
ngx_http_module_t ngx_http_write_filter_module_ctx = {
|
||||
NGX_HTTP_MODULE,
|
||||
|
||||
NULL, /* create server config */
|
||||
ngx_http_write_filter_create_conf, /* create location config */
|
||||
ngx_http_write_filter_commands, /* module directives */
|
||||
|
||||
NULL, /* init module */
|
||||
NULL, /* translate handler */
|
||||
|
||||
NULL, /* output header filter */
|
||||
@ -43,6 +38,14 @@ ngx_http_module_t ngx_http_write_filter_module = {
|
||||
};
|
||||
|
||||
|
||||
ngx_module_t ngx_http_write_filter_module = {
|
||||
&ngx_http_write_filter_module_ctx, /* module context */
|
||||
ngx_http_write_filter_commands, /* module directives */
|
||||
NGX_HTTP_MODULE_TYPE, /* module type */
|
||||
NULL /* init module */
|
||||
};
|
||||
|
||||
|
||||
int ngx_http_write_filter(ngx_http_request_t *r, ngx_chain_t *in)
|
||||
{
|
||||
int last;
|
||||
@ -53,12 +56,13 @@ int ngx_http_write_filter(ngx_http_request_t *r, ngx_chain_t *in)
|
||||
|
||||
|
||||
ctx = (ngx_http_write_filter_ctx_t *)
|
||||
ngx_get_module_ctx(r->main ? r->main : r,
|
||||
ngx_http_write_filter_module);
|
||||
if (ctx == NULL)
|
||||
ngx_http_get_module_ctx(r->main ? r->main : r,
|
||||
ngx_http_write_filter_module_ctx);
|
||||
if (ctx == NULL) {
|
||||
ngx_http_create_ctx(r, ctx,
|
||||
ngx_http_write_filter_module,
|
||||
ngx_http_write_filter_module_ctx,
|
||||
sizeof(ngx_http_write_filter_ctx_t));
|
||||
}
|
||||
|
||||
size = flush = 0;
|
||||
last = 0;
|
||||
@ -73,11 +77,13 @@ int ngx_http_write_filter(ngx_http_request_t *r, ngx_chain_t *in)
|
||||
ch->hunk->type _ ch->hunk->pos.file _
|
||||
ch->hunk->last.file - ch->hunk->pos.file);
|
||||
|
||||
if (ch->hunk->type & (NGX_HUNK_FLUSH|NGX_HUNK_RECYCLED))
|
||||
if (ch->hunk->type & (NGX_HUNK_FLUSH|NGX_HUNK_RECYCLED)) {
|
||||
flush = size;
|
||||
}
|
||||
|
||||
if (ch->hunk->type & NGX_HUNK_LAST)
|
||||
if (ch->hunk->type & NGX_HUNK_LAST) {
|
||||
last = 1;
|
||||
}
|
||||
}
|
||||
|
||||
/* add new chain to existent one */
|
||||
@ -94,25 +100,29 @@ int ngx_http_write_filter(ngx_http_request_t *r, ngx_chain_t *in)
|
||||
ch->hunk->type _ ch->hunk->pos.file _
|
||||
ch->hunk->last.file - ch->hunk->pos.file);
|
||||
|
||||
if (ch->hunk->type & (NGX_HUNK_FLUSH|NGX_HUNK_RECYCLED))
|
||||
if (ch->hunk->type & (NGX_HUNK_FLUSH|NGX_HUNK_RECYCLED)) {
|
||||
flush = size;
|
||||
}
|
||||
|
||||
if (ch->hunk->type & NGX_HUNK_LAST)
|
||||
if (ch->hunk->type & NGX_HUNK_LAST) {
|
||||
last = 1;
|
||||
}
|
||||
}
|
||||
|
||||
conf = (ngx_http_write_filter_conf_t *)
|
||||
ngx_get_module_loc_conf(r->main ? r->main : r,
|
||||
ngx_http_write_filter_module);
|
||||
ngx_http_get_module_loc_conf(r->main ? r->main : r,
|
||||
ngx_http_write_filter_module_ctx);
|
||||
|
||||
ngx_log_debug(r->connection->log, "l:%d f:%d" _ last _ flush);
|
||||
|
||||
if (!last && flush == 0 && size < conf->buffer_output)
|
||||
if (!last && flush == 0 && size < conf->buffer_output) {
|
||||
return NGX_OK;
|
||||
}
|
||||
|
||||
chain = ngx_event_write(r->connection, ctx->out, flush);
|
||||
if (chain == (ngx_chain_t *) -1)
|
||||
if (chain == (ngx_chain_t *) -1) {
|
||||
return NGX_ERROR;
|
||||
}
|
||||
|
||||
ctx->out = chain;
|
||||
|
||||
|
@ -10,6 +10,7 @@ typedef struct {
|
||||
size_t buffer_output;
|
||||
} ngx_http_write_filter_conf_t;
|
||||
|
||||
|
||||
typedef struct {
|
||||
ngx_chain_t *out;
|
||||
} ngx_http_write_filter_ctx_t;
|
||||
@ -17,7 +18,8 @@ typedef struct {
|
||||
|
||||
int ngx_http_write_filter(ngx_http_request_t *r, ngx_chain_t *in);
|
||||
|
||||
extern ngx_http_module_t ngx_http_write_filter_module;
|
||||
|
||||
extern ngx_module_t ngx_http_write_filter_module;
|
||||
|
||||
|
||||
#endif /* _NGX_HTTP_WRITE_FILTER_H_INCLUDED_ */
|
||||
|
Loading…
Reference in New Issue
Block a user