# HG changeset patch # User Igor Sysoev # Date 1033754284 0 # Node ID 72ad26c77d2db6854e07daed8e913881ed6a324a # Parent 8dd06e2844f5c49427d10a3cbcb7e229689dfd76 nginx-0.0.1-2002-10-04-21:58:04 import diff --git a/src/core/ngx_connection.h b/src/core/ngx_connection.h --- a/src/core/ngx_connection.h +++ b/src/core/ngx_connection.h @@ -14,9 +14,13 @@ typedef struct ngx_connection_s ngx_con #endif struct ngx_connection_s { - ngx_socket_t fd; + ngx_socket_t fd; void *data; + /* STUB */ + ngx_array_t *requests; + int requests_len; + #ifdef NGX_EVENT ngx_event_t *read; ngx_event_t *write; diff --git a/src/event/modules/ngx_kqueue_module.c b/src/event/modules/ngx_kqueue_module.c --- a/src/event/modules/ngx_kqueue_module.c +++ b/src/event/modules/ngx_kqueue_module.c @@ -2,10 +2,6 @@ * Copyright (C) 2002 Igor Sysoev, http://sysoev.ru */ -/* - NEED ? : unify change_list and event_list: - event_list = change_list; -*/ #include #include @@ -66,6 +62,17 @@ int ngx_kqueue_add_event(ngx_event_t *ev int ngx_kqueue_del_event(ngx_event_t *ev, int event) { + ngx_event_t *e; + + if (ev->index <= nchanges && change_list[ev->index].udata == ev) { + change_list[ev->index] = change_list[nchanges]; + e = (ngx_event_t *) change_list[ev->index].udata; + e->index = ev->index; + nchanges--; + + return NGX_OK; + } + return ngx_kqueue_set_event(ev, event, EV_DELETE); } @@ -94,6 +101,10 @@ int ngx_kqueue_set_event(ngx_event_t *ev change_list[nchanges].fflags = 0; change_list[nchanges].data = 0; change_list[nchanges].udata = ev; + + if (flags == EV_ADD) + ev->index = nchanges; + nchanges++; return NGX_OK; diff --git a/src/event/ngx_event.c b/src/event/ngx_event.c --- a/src/event/ngx_event.c +++ b/src/event/ngx_event.c @@ -21,7 +21,7 @@ ngx_event_t *ngx_read_events, *n #if !(USE_KQUEUE) -#if 1 +#if 0 ngx_event_type_e ngx_event_type = NGX_SELECT_EVENT; #else ngx_event_type_e ngx_event_type = NGX_KQUEUE_EVENT; diff --git a/src/http/ngx_http.c b/src/http/ngx_http.c --- a/src/http/ngx_http.c +++ b/src/http/ngx_http.c @@ -31,8 +31,8 @@ int ngx_http_init(ngx_pool_t *pool, ngx_ #if (WIN32) ngx_http_server.doc_root = "html"; #else + ngx_http_server.doc_root = "/home/is/work/xml/site-1.0.0/html"; ngx_http_server.doc_root = "/home/is/dox/"; - ngx_http_server.doc_root = "/home/is/work/xml/site-1.0.0/html"; #endif 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 --- a/src/http/ngx_http.h +++ b/src/http/ngx_http.h @@ -122,14 +122,15 @@ struct ngx_http_request_s { unsigned logging:1; unsigned header_only:1; - unsigned unusual_uri:1; - unsigned complex_uri:1; + unsigned unusual_uri:1; /* URI is not started with '/' - "GET http://" */ + unsigned complex_uri:1; /* URI with "./" or with "//" */ int state; char *uri_start; char *uri_end; char *uri_ext; char *args_start; + char *request_end; char *header_name_start; char *header_name_end; char *header_start; diff --git a/src/http/ngx_http_event.c b/src/http/ngx_http_event.c --- a/src/http/ngx_http_event.c +++ b/src/http/ngx_http_event.c @@ -47,6 +47,7 @@ static int ngx_http_redirect(ngx_http_re static int ngx_http_error(ngx_http_request_t *r, int error); static int ngx_http_close_request(ngx_http_request_t *r); +static int ngx_http_close_connection(ngx_event_t *ev); static size_t ngx_http_log_error(void *data, char *buf, size_t len); @@ -69,12 +70,19 @@ int ngx_http_init_connection(ngx_connect ev = c->read; ev->event_handler = ngx_http_init_request; + srv = (ngx_http_server_t *) c->server; ngx_test_null(c->pool, ngx_create_pool(srv->connection_pool_size, ev->log), NGX_ERROR); + ngx_test_null(c->requests, ngx_create_array(c->pool, 10, sizeof(char *)), + NGX_ERROR); + + ev->close_handler = ngx_http_close_connection; + c->write->close_handler = ngx_http_close_connection; + ngx_test_null(addr, ngx_palloc(c->pool, c->socklen), NGX_ERROR); ngx_memcpy(addr, c->sockaddr, c->socklen); c->sockaddr = addr; @@ -240,17 +248,35 @@ static int ngx_http_process_request(ngx_ static int ngx_http_process_request_line(ngx_http_request_t *r) { - int rc; + int rc, len; + char **request; + ngx_connection_t *c; ngx_http_log_ctx_t *ctx; rc = ngx_read_http_request_line(r); + c = r->connection; + if (rc == NGX_OK) { ngx_test_null(r->uri, ngx_palloc(r->pool, r->uri_end - r->uri_start + 1), ngx_http_close_request(r)); ngx_cpystrn(r->uri, r->uri_start, r->uri_end - r->uri_start + 1); + ngx_test_null(request, ngx_push_array(c->requests), + ngx_http_close_request(r)); + + if (r->request_end) + len = r->request_end - r->header_in->start + 1; + else + len = 1; + c->requests_len += len; + ngx_test_null(*request, ngx_palloc(c->pool, len), + ngx_http_close_request(r)); + ngx_cpystrn(*request, r->header_in->start, len); + + ngx_log_debug(c->log, "REQ: '%s'" _ *request); + if (r->uri_ext) { ngx_test_null(r->exten, ngx_palloc(r->pool, r->uri_end - r->uri_ext + 1), @@ -862,6 +888,42 @@ static int ngx_http_close_request(ngx_ht } +static int ngx_http_close_connection(ngx_event_t *ev) +{ + int i, len; + char **requests, *requests_line, *prev, *new; + ngx_connection_t *c = (ngx_connection_t *) ev->data; + + if (c->requests->nelts > 1) { + len = c->requests_len + c->requests->nelts * 2 - 1; + + ngx_test_null(requests_line, ngx_palloc(c->pool, len), + ngx_event_close_connection(ev)); + + requests = (char **) c->requests->elts; + prev = requests_line; + new = ngx_cpystrn(prev, requests[0], len); + len -= new - prev; + prev = new; + + for (i = 1; i < c->requests->nelts; i++) { + new = ngx_cpystrn(prev, ", ", len); + new = ngx_cpystrn(new, requests[i], len); + len -= new - prev; + prev = new; + } + + } else { + requests_line = * (char **) c->requests->elts; + } + + ngx_log_error(NGX_LOG_INFO, c->log, 0, + "REQUESTS: %d, '%s'", c->requests->nelts, requests_line); + + return ngx_event_close_connection(ev); +} + + static size_t ngx_http_log_error(void *data, char *buf, size_t len) { ngx_http_log_ctx_t *ctx = (ngx_http_log_ctx_t *) data; diff --git a/src/http/ngx_http_parse.c b/src/http/ngx_http_parse.c --- a/src/http/ngx_http_parse.c +++ b/src/http/ngx_http_parse.c @@ -32,7 +32,7 @@ printf("\nstate: %d, pos: %x, end: %x, c state, p, r->header_in->last, ch, p); */ - /* GCC 2.95.2 and VC 6.0 compiles this switch as jump table */ + /* GCC 2.95.2 and VC 6.0 compile this switch as jump table */ switch (state) { @@ -257,7 +257,6 @@ printf("\nstate: %d, pos: %x, end: %x, c return NGX_HTTP_PARSE_INVALID_REQUEST; r->http_minor = ch - '0'; - state = sw_minor_digit; break; @@ -281,6 +280,7 @@ printf("\nstate: %d, pos: %x, end: %x, c /* end of request line */ case sw_almost_done: + r->request_end = p - 2; switch (ch) { case LF: state = sw_done; @@ -295,6 +295,8 @@ printf("\nstate: %d, pos: %x, end: %x, c r->header_in->pos.mem = p; if (state == sw_done) { + if (r->request_end == NULL) + r->request_end = p - 1; r->http_version = r->http_major * 1000 + r->http_minor; r->state = sw_start; if (r->http_version == 9 && r->method == NGX_HTTP_HEAD)