diff src/http/ngx_http_event.c @ 26:53cb81681040

nginx-0.0.1-2002-12-15-09:25:09 import
author Igor Sysoev <igor@sysoev.ru>
date Sun, 15 Dec 2002 06:25:09 +0000
parents 77c7629a2627
children 6a0b3d6e9c13
line wrap: on
line diff
--- a/src/http/ngx_http_event.c
+++ b/src/http/ngx_http_event.c
@@ -13,6 +13,7 @@
 #include <ngx_table.h>
 #include <ngx_hunk.h>
 #include <ngx_connection.h>
+#include <ngx_inet.h>
 #include <ngx_http.h>
 #include <ngx_http_config.h>
 #include <ngx_http_core.h>
@@ -33,19 +34,14 @@ static int ngx_http_process_request_line
 static int ngx_http_process_request_headers(ngx_http_request_t *r);
 static int ngx_http_process_request_header_line(ngx_http_request_t *r);
 
-static int ngx_http_event_handler(ngx_http_request_t *r);
-static int ngx_http_block_read(ngx_event_t *ev);
-
-
-static int ngx_http_read_discarded_body(ngx_event_t *ev);
-
-int ngx_http_handler(ngx_http_request_t *r);
-static int ngx_http_set_default_handler(ngx_http_request_t *r);
+static int ngx_http_event_request_handler(ngx_http_request_t *r);
 
 static int ngx_http_writer(ngx_event_t *ev);
-static int ngx_http_set_lingering_close(ngx_http_request_t *r);
+static int ngx_http_block_read(ngx_event_t *ev);
+static int ngx_http_read_discarded_body(ngx_event_t *ev);
 static int ngx_http_keepalive_handler(ngx_event_t *ev);
-static int ngx_http_lingering_close(ngx_event_t *ev);
+static int ngx_http_set_lingering_close(ngx_http_request_t *r);
+static int ngx_http_lingering_close_handler(ngx_event_t *ev);
 
 #if 0
 int ngx_http_special_response(ngx_http_request_t *r, int error);
@@ -70,6 +66,8 @@ static char *header_errors[] = {
 static ngx_http_header_t headers_in[] = {
     { 4, "Host", offsetof(ngx_http_headers_in_t, host) },
     { 10, "Connection", offsetof(ngx_http_headers_in_t, connection) },
+    { 17, "If-Modified-Since",
+                           offsetof(ngx_http_headers_in_t,if_modified_since) },
 
     { 10, "User-Agent", offsetof(ngx_http_headers_in_t, user_agent) },
 
@@ -106,15 +104,11 @@ int ngx_http_init_connection(ngx_connect
     ngx_test_null(c->addr_text.data, ngx_palloc(c->pool, c->addr_text.len),
                   NGX_ERROR);
 
-    /* STUB: should be ngx_inet_ntop() */
-#if (WIN32)
-    c->addr_text.data = inet_ntoa((struct in_addr *)
-                                              ((char *)c->sockaddr + c->addr));
-#else
-    inet_ntop(c->family, (char *)c->sockaddr + c->addr,
-              c->addr_text.data, c->addr_text.len);
-#endif
-    /**/
+    ngx_test_null(c->addr_text.len,
+                  ngx_inet_ntop(c->family,
+                                (char *)c->sockaddr + c->addr,
+                                c->addr_text.data, c->addr_text.len),
+                  NGX_ERROR);
 
     ngx_test_null(ctx, ngx_pcalloc(c->pool, sizeof(ngx_http_log_ctx_t)),
                   NGX_ERROR);
@@ -166,6 +160,7 @@ static int ngx_http_init_request(ngx_eve
     c->data = r;
     r->connection = c;
     r->server = srv;
+    r->file.fd = NGX_INVALID_FILE;
 
     /* STUB */
     r->srv_conf = ngx_srv_conf;
@@ -189,6 +184,10 @@ static int ngx_http_init_request(ngx_eve
     ngx_test_null(r->ctx, ngx_pcalloc(r->pool, sizeof(void *) * ngx_max_module),
                   ngx_http_close_request(r));
 
+    r->headers_out.headers = ngx_create_table(r->pool, 10);
+    r->headers_out.content_length = -1;
+    r->headers_out.last_modified_time = -1;
+
     ev->event_handler = ngx_http_process_request_header;
     r->state_handler = ngx_http_process_request_line;
     r->header_timeout = 1;
@@ -262,7 +261,7 @@ static int ngx_http_process_request_head
     }
 
     if (rc == NGX_OK)
-        return ngx_http_event_handler(r);
+        return ngx_http_event_request_handler(r);
     else
         return rc;
 }
@@ -280,7 +279,8 @@ static int ngx_http_process_request_line
     c = r->connection;
 
     if (rc == NGX_OK) {
-        r->uri.len = r->uri_end - r->uri_start;
+        r->uri.len = (r->args_start ? r->args_start - 1 : r->uri_end)
+                                                                - r->uri_start;
         ngx_test_null(r->uri.data, ngx_palloc(r->pool, r->uri.len + 1),
                       ngx_http_close_request(r));
         ngx_cpystrn(r->uri.data, r->uri_start, r->uri.len + 1);
@@ -309,7 +309,8 @@ static int ngx_http_process_request_line
         /* */
 
         if (r->uri_ext) {
-            r->exten.len = r->uri_end - r->uri_ext;
+            r->exten.len = (r->args_start ? r->args_start - 1 : r->uri_end)
+                                                                  - r->uri_ext;
             ngx_test_null(r->exten.data,
                           ngx_palloc(r->pool, r->exten.len + 1), 
                           ngx_http_close_request(r));
@@ -326,8 +327,6 @@ static int ngx_http_process_request_line
         /* TODO: check too long URI - no space for header, compact buffer */
 
         r->headers_in.headers = ngx_create_table(r->pool, 10);
-        /* THINK: when to create out.headers ? */
-        r->headers_out.headers = ngx_create_table(r->pool, 10);
 
         r->state_handler = ngx_http_process_request_headers;
         ctx = r->connection->log->data;
@@ -372,7 +371,14 @@ static int ngx_http_process_request_head
 
         } else if (rc == NGX_HTTP_PARSE_HEADER_DONE) {
             ngx_log_debug(r->connection->log, "HTTP header done");
-            return NGX_OK;
+
+            if (r->http_version > NGX_HTTP_VERSION_10
+                && r->headers_in.host == NULL)
+            {
+                return ngx_http_error(r, NGX_HTTP_BAD_REQUEST);
+            } else {
+                return NGX_OK;
+            }
 
         } else if (rc == NGX_AGAIN) {
             return NGX_AGAIN;
@@ -422,7 +428,7 @@ static int ngx_http_process_request_head
 }
 
 
-static int ngx_http_event_handler(ngx_http_request_t *r)
+static int ngx_http_event_request_handler(ngx_http_request_t *r)
 {
     int rc;
     ngx_msec_t  timeout;
@@ -494,181 +500,6 @@ static int ngx_http_event_handler(ngx_ht
 }
 
 
-static int ngx_http_block_read(ngx_event_t *ev)
-{
-    ngx_log_debug(ev->log, "http read blocked");
-
-    ev->blocked = 1;
-    return ngx_del_event(ev, NGX_READ_EVENT);
-}
-
-
-
-/* FIND PLACE ******************** */
-
-void ngx_http_discard_body(ngx_http_request_t *r)
-{
-    ngx_log_debug(r->connection->log, "set discard body");
-
-    ngx_del_timer(r->connection->read);
-
-    if (r->client_content_length)
-        r->connection->read->event_handler = ngx_http_read_discarded_body;
-}
-
-
-static int ngx_http_read_discarded_body(ngx_event_t *ev)
-{
-    size_t   size;
-    ssize_t  n;
-    ngx_connection_t    *c;
-    ngx_http_request_t  *r;
-
-    c = (ngx_connection_t *) ev->data;
-    r = (ngx_http_request_t *) c->data;
-
-    ngx_log_debug(ev->log, "http read discarded body");
-
-    if (ev->timedout)
-        return NGX_ERROR;
-
-    if (r->discarded_buffer == NULL)
-        ngx_test_null(r->discarded_buffer,
-                      ngx_palloc(r->pool, r->server->discarded_buffer_size),
-                      NGX_ERROR);
-
-    size = r->client_content_length;
-    if (size > r->server->discarded_buffer_size)
-        size = r->server->discarded_buffer_size;
-
-    n = ngx_event_recv(c, r->discarded_buffer, size);
-    if (n == NGX_ERROR)
-        return NGX_ERROR;
-
-    if (n == NGX_AGAIN)
-        return NGX_OK;
-
-    r->client_content_length -= n;
-    /* XXX: what if r->client_content_length == 0 ? */
-    return NGX_OK;
-}
-
-
-static int ngx_http_discarded_read(ngx_event_t *ev)
-{
-    ssize_t n;
-    ngx_connection_t    *c;
-    ngx_http_request_t  *r;
-
-    c = (ngx_connection_t *) ev->data;
-    r = (ngx_http_request_t *) c->data;
-
-    ngx_log_debug(ev->log, "http discarded read");
-
-    if (ev->timedout)
-        return NGX_ERROR;
-
-    if (r->discarded_buffer == NULL)
-        ngx_test_null(r->discarded_buffer,
-                      ngx_palloc(r->pool, r->server->discarded_buffer_size),
-                      NGX_ERROR);
-
-    n = ngx_event_recv(c, r->discarded_buffer,
-                       r->server->discarded_buffer_size);
-
-    return n;
-}
-
-/* ******************** */
-
-
-#if 0
-int ngx_http_handler(ngx_http_request_t *r)
-{
-    int  rc;
-
-    r->connection->unexpected_eof = 0;
-    r->lingering_close = 1;
-
-    /* STUB: should find handler */
-#if 1
-    r->filter = NGX_HTTP_FILTER_NEED_IN_MEMORY;
-#endif
-    rc = ngx_http_set_default_handler(r);
-
-    if (rc >= NGX_HTTP_SPECIAL_RESPONSE)
-        return ngx_http_special_response(r, rc);
-
-    rc = r->handler(r);
-
-    return rc;
-}
-#endif
-
-
-#if 0
-static int ngx_http_set_default_handler(ngx_http_request_t *r)
-{
-    ngx_err_t  err;
-    char      *name, *loc, *file;
-
-#if 0
-    /* STUB */
-    r->handler = ngx_http_proxy_handler;
-    return NGX_OK;
-#endif
-
-/*  NO NEEDED
-    ngx_test_null(r->headers_out,
-                  ngx_pcalloc(r->pool, sizeof(ngx_http_headers_out_t)),
-                  NGX_HTTP_INTERNAL_SERVER_ERROR);
-*/
-
-    if (*(r->uri_end - 1) == '/') {
-        r->handler = ngx_http_index_handler;
-        return NGX_OK;
-    }
-
-    /* 20 bytes is spare space for some index name, i.e. index.html */
-    r->filename_len = r->uri_end - r->uri_start + r->server->doc_root_len + 20;
-
-    ngx_test_null(r->filename,
-                  ngx_palloc(r->pool, r->filename_len),
-                  NGX_HTTP_INTERNAL_SERVER_ERROR);
-
-    r->location = ngx_cpystrn(r->filename, r->server->doc_root,
-                              r->server->doc_root_len);
-    file = ngx_cpystrn(r->location, r->uri_start,
-                       r->uri_end - r->uri_start + 1);
-
-    ngx_log_debug(r->connection->log, "HTTP filename: '%s'" _ r->filename);
-
-    if (ngx_file_type(r->filename, &r->fileinfo) == -1) {
-        err = ngx_errno;
-        ngx_log_error(NGX_LOG_ERR, r->connection->log, err,
-                      ngx_file_type_n " %s failed", r->filename);
-
-        if (err == NGX_ENOENT)
-            return NGX_HTTP_NOT_FOUND;
-        else
-            return NGX_HTTP_INTERNAL_SERVER_ERROR;
-    }
-
-    if (ngx_is_dir(r->fileinfo)) {
-        ngx_log_debug(r->connection->log, "HTTP DIR: '%s'" _ r->filename);
-        *file++ = '/';
-        *file = '\0';
-        r->headers_out.location = r->location;
-        return NGX_HTTP_MOVED_PERMANENTLY;
-    }
-
-    r->handler = ngx_http_static_handler;
-
-    return NGX_OK;
-}
-#endif
-
-
 static int ngx_http_writer(ngx_event_t *ev)
 {
     int rc;
@@ -735,35 +566,93 @@ static int ngx_http_writer(ngx_event_t *
 }
 
 
-static int ngx_http_set_lingering_close(ngx_http_request_t *r)
+static int ngx_http_block_read(ngx_event_t *ev)
 {
-    r->lingering_time = ngx_time() + r->server->lingering_time;
-    r->connection->read->event_handler = ngx_http_lingering_close;
+    ngx_log_debug(ev->log, "http read blocked");
+
+    ev->blocked = 1;
+    return ngx_del_event(ev, NGX_READ_EVENT, 0);
+}
+
+
+int ngx_http_discard_body(ngx_http_request_t *r)
+{
+    ngx_log_debug(r->connection->log, "set discard body");
 
     ngx_del_timer(r->connection->read);
-    ngx_add_timer(r->connection->read, r->server->lingering_timeout);
 
-#if (HAVE_CLEAR_EVENT)
-    if (ngx_add_event(r->connection->read, NGX_READ_EVENT,
-                      NGX_CLEAR_EVENT) == NGX_ERROR) {
-#else
-    if (ngx_add_event(r->connection->read, NGX_READ_EVENT,
-                      NGX_ONESHOT_EVENT) == NGX_ERROR) {
-#endif
-       return ngx_http_close_request(r);
-    }
-
-    if (ngx_shutdown_socket(r->connection->fd, NGX_WRITE_SHUTDOWN) == NGX_ERROR)
-    {
-        ngx_log_error(NGX_LOG_ERR, r->connection->log, ngx_socket_errno,
-                      ngx_shutdown_socket_n " failed");
-        return ngx_http_close_request(r);
-    }
+    if (r->client_content_length)
+        r->connection->read->event_handler = ngx_http_read_discarded_body;
 
     return NGX_OK;
 }
 
 
+static int ngx_http_read_discarded_body(ngx_event_t *ev)
+{
+    size_t   size;
+    ssize_t  n;
+    ngx_connection_t    *c;
+    ngx_http_request_t  *r;
+
+    c = (ngx_connection_t *) ev->data;
+    r = (ngx_http_request_t *) c->data;
+
+    ngx_log_debug(ev->log, "http read discarded body");
+
+    if (ev->timedout)
+        return NGX_ERROR;
+
+    if (r->discarded_buffer == NULL)
+        ngx_test_null(r->discarded_buffer,
+                      ngx_palloc(r->pool, r->server->discarded_buffer_size),
+                      NGX_ERROR);
+
+    size = r->client_content_length;
+    if (size > r->server->discarded_buffer_size)
+        size = r->server->discarded_buffer_size;
+
+    n = ngx_event_recv(c, r->discarded_buffer, size);
+    if (n == NGX_ERROR)
+        return NGX_ERROR;
+
+    if (n == NGX_AGAIN)
+        return NGX_OK;
+
+    r->client_content_length -= n;
+    /* XXX: what if r->client_content_length == 0 ? */
+    return NGX_OK;
+}
+
+
+#if 0
+static int ngx_http_discarded_read(ngx_event_t *ev)
+{
+    ssize_t n;
+    ngx_connection_t    *c;
+    ngx_http_request_t  *r;
+
+    c = (ngx_connection_t *) ev->data;
+    r = (ngx_http_request_t *) c->data;
+
+    ngx_log_debug(ev->log, "http discarded read");
+
+    if (ev->timedout)
+        return NGX_ERROR;
+
+    if (r->discarded_buffer == NULL)
+        ngx_test_null(r->discarded_buffer,
+                      ngx_palloc(r->pool, r->server->discarded_buffer_size),
+                      NGX_ERROR);
+
+    n = ngx_event_recv(c, r->discarded_buffer,
+                       r->server->discarded_buffer_size);
+
+    return n;
+}
+#endif
+
+
 static int ngx_http_keepalive_handler(ngx_event_t *ev)
 {
     ssize_t n;
@@ -772,7 +661,7 @@ static int ngx_http_keepalive_handler(ng
 
     c = (ngx_connection_t *) ev->data;
 
-    ngx_log_debug(ev->log, "http keepalive");
+    ngx_log_debug(ev->log, "http keepalive handler");
 
     if (ev->timedout)
         return NGX_DONE;
@@ -800,17 +689,46 @@ static int ngx_http_keepalive_handler(ng
 }
 
 
-static int ngx_http_lingering_close(ngx_event_t *ev)
+static int ngx_http_set_lingering_close(ngx_http_request_t *r)
 {
-    ssize_t  n;
-    ngx_msec_t   timer;
+    r->lingering_time = ngx_time() + r->server->lingering_time;
+    r->connection->read->event_handler = ngx_http_lingering_close_handler;
+
+    ngx_del_timer(r->connection->read);
+    ngx_add_timer(r->connection->read, r->server->lingering_timeout);
+
+#if (HAVE_CLEAR_EVENT)
+    if (ngx_add_event(r->connection->read, NGX_READ_EVENT,
+                      NGX_CLEAR_EVENT) == NGX_ERROR) {
+#else
+    if (ngx_add_event(r->connection->read, NGX_READ_EVENT,
+                      NGX_ONESHOT_EVENT) == NGX_ERROR) {
+#endif
+       return ngx_http_close_request(r);
+    }
+
+    if (ngx_shutdown_socket(r->connection->fd, NGX_WRITE_SHUTDOWN) == -1)
+    {
+        ngx_log_error(NGX_LOG_ERR, r->connection->log, ngx_socket_errno,
+                      ngx_shutdown_socket_n " failed");
+        return ngx_http_close_request(r);
+    }
+
+    return NGX_OK;
+}
+
+
+static int ngx_http_lingering_close_handler(ngx_event_t *ev)
+{
+    ssize_t              n;
+    ngx_msec_t           timer;
     ngx_connection_t    *c;
     ngx_http_request_t  *r;
 
     c = (ngx_connection_t *) ev->data;
     r = (ngx_http_request_t *) c->data;
 
-    ngx_log_debug(ev->log, "http lingering close");
+    ngx_log_debug(ev->log, "http lingering close handler");
 
     if (ev->timedout)
         return NGX_DONE;