Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nginx/nginx.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIgor Sysoev <igor@sysoev.ru>2004-06-24 11:53:37 +0400
committerIgor Sysoev <igor@sysoev.ru>2004-06-24 11:53:37 +0400
commitc83f683553cb76dcc9b7311495383edbacccf06d (patch)
tree3fecc630afb8e5c101973ab5530379eca3246725
parente0207bb8eb230d4750c4f328af9afbb79051a026 (diff)
nginx-0.0.7-2004-06-24-11:53:37 import
-rw-r--r--auto/modules6
-rw-r--r--auto/options6
-rw-r--r--auto/sources12
-rw-r--r--src/event/ngx_event.c1
-rw-r--r--src/http/modules/ngx_http_status.c61
-rw-r--r--src/http/modules/ngx_http_status_handler.c181
-rw-r--r--src/http/ngx_http_request.c5
-rw-r--r--src/http/ngx_http_request.h2
8 files changed, 207 insertions, 67 deletions
diff --git a/auto/modules b/auto/modules
index a2dccc88e..cd07cfc4e 100644
--- a/auto/modules
+++ b/auto/modules
@@ -66,6 +66,12 @@ fi
HTTP_MODULES="$HTTP_MODULES $HTTP_STATIC_MODULE $HTTP_INDEX_MODULE"
+if [ $HTTP_STATUS = YES ]; then
+ have=NGX_HTTP_STATUS . auto/have
+ HTTP_MODULES="$HTTP_MODULES $HTTP_STATUS_MODULE"
+ HTTP_SRCS="$HTTP_SRCS $HTTP_STATUS_SRCS"
+fi
+
if [ $HTTP_REWRITE = YES -a $USE_PCRE != DISABLED ]; then
have=NGX_HTTP_REWRITE . auto/have
USE_PCRE=YES
diff --git a/auto/options b/auto/options
index 7c729d866..7a6e36dfd 100644
--- a/auto/options
+++ b/auto/options
@@ -30,9 +30,10 @@ EVENT_AIO=NO
USE_THREADS=NO
HTTP_CHARSET=YES
-HTTP_REWRITE=YES
HTTP_GZIP=YES
HTTP_SSI=YES
+HTTP_STATUS=YES
+HTTP_REWRITE=YES
HTTP_PROXY=YES
USE_PCRE=NO
@@ -82,9 +83,10 @@ do
--with-threads) USE_THREADS="pthreads" ;;
--without-http_charset_module) HTTP_CHARSET=NO ;;
- --without-http_rewrite_module) HTTP_REWRITE=NO ;;
--without-http_ssi_module) HTTP_SSI=NO ;;
--without-http_gzip_module) HTTP_GZIP=NO ;;
+ --without-http_status_module) HTTP_STATUS=NO ;;
+ --without-http_rewrite_module) HTTP_REWRITE=NO ;;
--without-http_proxy_module) HTTP_PROXY=NO ;;
--with-cc=*) CC="$value" ;;
diff --git a/auto/sources b/auto/sources
index e402b1c2b..6801f27f2 100644
--- a/auto/sources
+++ b/auto/sources
@@ -240,10 +240,6 @@ HTTP_CHARSET_FILTER_MODULE=ngx_http_charset_filter_module
HTTP_CHARSET_SRCS=src/http/modules/ngx_http_charset_filter.c
-HTTP_REWRITE_MODULE=ngx_http_rewrite_module
-HTTP_REWRITE_SRCS=src/http/modules/ngx_http_rewrite_handler.c
-
-
HTTP_GZIP_FILTER_MODULE=ngx_http_gzip_filter_module
HTTP_GZIP_SRCS=src/http/modules/ngx_http_gzip_filter.c
@@ -252,6 +248,14 @@ HTTP_SSI_FILTER_MODULE=ngx_http_ssi_filter_module
HTTP_SSI_SRCS=src/http/modules/ngx_http_ssi_filter.c
+HTTP_STATUS_MODULE=ngx_http_status_module
+HTTP_STATUS_SRCS=src/http/modules/ngx_http_status_handler.c
+
+
+HTTP_REWRITE_MODULE=ngx_http_rewrite_module
+HTTP_REWRITE_SRCS=src/http/modules/ngx_http_rewrite_handler.c
+
+
HTTP_PROXY_MODULE=ngx_http_proxy_module
HTTP_PROXY_INCS="src/http/modules/proxy"
HTTP_PROXY_DEPS=src/http/modules/proxy/ngx_http_proxy_handler.h
diff --git a/src/event/ngx_event.c b/src/event/ngx_event.c
index 70b175366..6d497e08c 100644
--- a/src/event/ngx_event.c
+++ b/src/event/ngx_event.c
@@ -264,6 +264,7 @@ static ngx_int_t ngx_event_process_init(ngx_cycle_t *cycle)
c = cycle->connections;
for (i = 0; i < cycle->connection_n; i++) {
c[i].fd = (ngx_socket_t) -1;
+ c[i].data = NULL;
}
cycle->read_events = ngx_alloc(sizeof(ngx_event_t) * ecf->connections,
diff --git a/src/http/modules/ngx_http_status.c b/src/http/modules/ngx_http_status.c
deleted file mode 100644
index 1007364bd..000000000
--- a/src/http/modules/ngx_http_status.c
+++ /dev/null
@@ -1,61 +0,0 @@
-
-#include <ngx_config.h>
-#include <ngx_core.h>
-#include <ngx_http.h>
-
-
-static ngx_command_t ngx_http_status_commands[] = {
-
- ngx_null_command
-};
-
-
-ngx_http_module_t ngx_http_status_module_ctx = {
- NULL, /* pre conf */
-
- NULL, /* create main configuration */
- NULL, /* init main configuration */
-
- NULL, /* create server configuration */
- NULL, /* merge server configuration */
-
- ngx_http_status_create_loc_conf, /* create location configration */
- ngx_http_status_merge_loc_conf /* merge location configration */
-};
-
-
-ngx_module_t ngx_http_status_module = {
- NGX_MODULE,
- &ngx_http_status_module_ctx, /* module context */
- ngx_http_status_commands, /* module directives */
- NGX_HTTP_MODULE, /* module type */
- ngx_http_status_init, /* init module */
- NULL /* init child */
-};
-
-
-static char http_states = "IRPCUWLK";
-
-
-int ngx_http_status_handler(ngx_http_request_t *r)
-{
- ngx_int_t i, http;
- ngx_connection_t *c;
- ngx_http_request_t *sr;
-
- c = ngx_cycle->connections;
-
- for (i = 0; i < ngx_cycle->connection_n; i++) {
- if (c[i].module != http || c[i].data == NULL) {
- continue;
- }
-
- if (c[i].data == NULL && c[i].fd != -1) {
- 'A'
- }
-
- sr = c[i].data;
- }
-
- return NGX_OK;
-}
diff --git a/src/http/modules/ngx_http_status_handler.c b/src/http/modules/ngx_http_status_handler.c
new file mode 100644
index 000000000..2f361b0c7
--- /dev/null
+++ b/src/http/modules/ngx_http_status_handler.c
@@ -0,0 +1,181 @@
+
+#include <ngx_config.h>
+#include <ngx_core.h>
+#include <ngx_http.h>
+
+
+static char *ngx_http_status(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
+
+static ngx_command_t ngx_http_status_commands[] = {
+
+ { ngx_string("status"),
+ NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
+ ngx_http_status,
+ 0,
+ 0,
+ NULL },
+
+ ngx_null_command
+};
+
+
+
+ngx_http_module_t ngx_http_status_module_ctx = {
+ NULL, /* pre conf */
+
+ NULL, /* create main configuration */
+ NULL, /* init main configuration */
+
+ NULL, /* create server configuration */
+ NULL, /* merge server configuration */
+
+ NULL, /* create location configuration */
+ NULL /* merge location configuration */
+};
+
+
+ngx_module_t ngx_http_status_module = {
+ NGX_MODULE,
+ &ngx_http_status_module_ctx, /* module context */
+ ngx_http_status_commands, /* module directives */
+ NGX_HTTP_MODULE, /* module type */
+ NULL, /* init module */
+ NULL /* init process */
+};
+
+
+static ngx_int_t ngx_http_status_handler(ngx_http_request_t *r)
+{
+ size_t len;
+ ngx_int_t rc;
+ ngx_uint_t i, dash;
+ ngx_buf_t *b;
+ ngx_chain_t out;
+ ngx_connection_t *c;
+ ngx_http_request_t *rq;
+
+ if (r->method != NGX_HTTP_GET && r->method != NGX_HTTP_HEAD) {
+ return NGX_HTTP_NOT_ALLOWED;
+ }
+
+ rc = ngx_http_discard_body(r);
+
+ if (rc != NGX_OK && rc != NGX_AGAIN) {
+ return rc;
+ }
+
+ if (!(r->headers_out.content_type =
+ ngx_http_add_header(&r->headers_out, ngx_http_headers_out)))
+ {
+ return NGX_HTTP_INTERNAL_SERVER_ERROR;
+ }
+
+ r->headers_out.content_type->key.len = 0;
+ r->headers_out.content_type->key.data = NULL;
+ r->headers_out.content_type->value.len = sizeof("text/plain") - 1;
+ r->headers_out.content_type->value.data = (u_char *) "text/plain";
+
+ if (r->method == NGX_HTTP_HEAD) {
+ r->headers_out.status = NGX_HTTP_OK;
+
+ rc = ngx_http_send_header(r);
+
+ if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {
+ return rc;
+ }
+ }
+
+ len = 0;
+ dash = 0;
+
+ c = ngx_cycle->connections;
+ for (i = 0; i < ngx_cycle->connection_n; i++) {
+ rq = c[i].data;
+ if (rq && rq->signature == NGX_HTTP_MODULE) {
+
+ if (rq->request_line.len) {
+ len += NGX_INT32_LEN + 1 + rq->request_line.len + 2 + 2;
+ dash = 0;
+ }
+
+ continue;
+ }
+
+ if (!dash) {
+ len += 3;
+ dash = 1;
+ }
+ }
+
+ if (!(b = ngx_create_temp_buf(r->pool, len))) {
+ return NGX_HTTP_INTERNAL_SERVER_ERROR;
+ }
+
+ dash = 0;
+
+ for (i = 0; i < ngx_cycle->connection_n; i++) {
+ rq = c[i].data;
+ if (rq && rq->signature == NGX_HTTP_MODULE) {
+
+#if 0
+ switch (rq->http_state) {
+ case NGX_HTTP_INITING_REQUEST_STATE:
+
+ case NGX_HTTP_KEEPALIVE_STATE:
+ }
+#endif
+
+ if (rq->request_line.len) {
+ b->last += ngx_snprintf((char *) b->last, NGX_INT32_LEN,
+ "%u", i);
+ *(b->last++) = ' ';
+
+ *(b->last++) = '"';
+ b->last = ngx_cpymem(b->last, r->request_line.data,
+ r->request_line.len);
+ *(b->last++) = '"';
+
+ *(b->last++) = CR; *(b->last++) = LF;
+ dash = 0;
+ }
+
+ continue;
+ }
+
+ if (!dash) {
+ *(b->last++) = '-'; *(b->last++) = CR; *(b->last++) = LF;
+ dash = 1;
+ }
+ }
+
+ r->headers_out.status = NGX_HTTP_OK;
+ r->headers_out.content_length_n = b->last - b->pos;
+
+ rc = ngx_http_send_header(r);
+
+ if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {
+ return rc;
+ }
+
+ if (!r->main) {
+ b->last_buf = 1;
+ }
+
+ out.buf = b;
+ out.next = NULL;
+
+ return ngx_http_output_filter(r, &out);
+}
+
+
+static char *ngx_http_status(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
+{
+ ngx_http_conf_ctx_t *ctx;
+ ngx_http_core_loc_conf_t *clcf;
+
+ ctx = cf->ctx;
+ clcf = ctx->loc_conf[ngx_http_core_module.ctx_index];
+ clcf->handler = ngx_http_status_handler;
+
+ return NGX_CONF_OK;
+}
diff --git a/src/http/ngx_http_request.c b/src/http/ngx_http_request.c
index e935afbdf..d1ed4f3a4 100644
--- a/src/http/ngx_http_request.c
+++ b/src/http/ngx_http_request.c
@@ -161,6 +161,7 @@ static void ngx_http_init_request(ngx_event_t *rev)
}
}
+ r->signature = NGX_HTTP_MODULE;
r->http_state = NGX_HTTP_INITING_REQUEST_STATE;
/* find the server configuration for the address:port */
@@ -1382,6 +1383,8 @@ static void ngx_http_set_keepalive(ngx_http_request_t *r)
c->tcp_nopush = NGX_TCP_NOPUSH_UNSET;
}
+ r->http_state = NGX_HTTP_KEEPALIVE_STATE;
+
if (rev->ready) {
ngx_http_keepalive_handler(rev);
}
@@ -1688,6 +1691,8 @@ void ngx_http_close_request(ngx_http_request_t *r, int error)
ctx = log->data;
ctx->url = NULL;
+ r->request_line.len = 0;
+
ngx_destroy_pool(r->pool);
return;
diff --git a/src/http/ngx_http_request.h b/src/http/ngx_http_request.h
index 52e110af7..3ffecc812 100644
--- a/src/http/ngx_http_request.h
+++ b/src/http/ngx_http_request.h
@@ -207,6 +207,8 @@ struct ngx_http_cleanup_s {
typedef ngx_int_t (*ngx_http_handler_pt)(ngx_http_request_t *r);
struct ngx_http_request_s {
+ uint32_t signature; /* "HTTP" */
+
ngx_connection_t *connection;
void **ctx;