changeset 145:58557d0cccd1

nginx-0.0.1-2003-10-13-20:32:29 import
author Igor Sysoev <igor@sysoev.ru>
date Mon, 13 Oct 2003 16:32:29 +0000
parents ef8c87afcfc5
children 5ac79e574285
files src/core/ngx_hunk.h src/event/ngx_event_proxy.c src/event/ngx_event_proxy.h src/http/ngx_http_special_response.c
diffstat 4 files changed, 152 insertions(+), 164 deletions(-) [+]
line wrap: on
line diff
--- a/src/core/ngx_hunk.h
+++ b/src/core/ngx_hunk.h
@@ -100,6 +100,19 @@ ngx_hunk_t *ngx_create_temp_hunk(ngx_poo
                 chain->next = NULL;                                          \
             } while (0);
 
+#define ngx_alloc_ce_and_set_hunk  ngx_add_hunk_to_chain
+
+
+#define ngx_chain_add_ce(ngx_chain_t *chain, ngx_chain_t **last,             \
+                         ngx_chain_t *ce)                                    \
+            if (chain) {                                                     \
+                last->next = ce;                                             \
+            } else {                                                         \
+                chain = ce;                                                  \
+            }                                                                \
+            last = ce;
+
+
 int ngx_chain_add_copy(ngx_pool_t *pool, ngx_chain_t **ch, ngx_chain_t *in);
 void ngx_chain_update_chains(ngx_chain_t **free, ngx_chain_t **busy,
                              ngx_chain_t **out);
--- a/src/event/ngx_event_proxy.c
+++ b/src/event/ngx_event_proxy.c
@@ -18,10 +18,10 @@ int ngx_event_proxy_read_upstream(ngx_ev
 {
     int           n, rc, size;
     ngx_hunk_t   *h, *nh;
-    ngx_chain_t  *chain, *temp, *entry, *next;
+    ngx_chain_t  *chain, *rest, *ce, *next;
 
 #if (NGX_SUPPRESS_WARN)
-    entry = NULL;
+    rest = NULL;
 #endif
 
 #if (NGX_EVENT_COPY_FILTER)
@@ -38,22 +38,30 @@ ngx_log_debug(p->log, "read upstream");
 
     for ( ;; ) {
 
-        /* use the pre-read hunks if they exist */
+        if (p->preread_hunks) {
 
-        if (p->preread_hunks) {
+            /* use the pre-read hunks if they exist */
+
             chain = p->preread_hunks;
             p->preread_hunks = NULL;
             n = p->preread_size;
 
+ngx_log_debug(p->log, "preread: %d" _ n);
+
         } else {
 
-#if (HAVE_KQUEUE) /* kqueue notifies about the end of file or a pending error */
+#if (HAVE_KQUEUE)
+
+            /*
+             * kqueue notifies about the end of file or a pending error.
+             * This test allows not to allocate a hunk on these conditions
+             * and not to call ngx_recv_chain().
+             */
 
             if (ngx_event_flags == NGX_HAVE_KQUEUE_EVENT) {
 
                 if (p->upstream->read->error) {
-                    ngx_log_error(NGX_LOG_ERR, p->log,
-                                  p->upstream->read->error,
+                    ngx_log_error(NGX_LOG_ERR, p->log, p->upstream->read->error,
                                   "readv() failed");
                     p->upstream_error = 1;
 
@@ -62,66 +70,66 @@ ngx_log_debug(p->log, "read upstream");
                 } else if (p->upstream->read->eof
                            && p->upstream->read->available == 0) {
                     p->upstream_eof = 1;
-                    p->block_upstream = 0;
 
                     break;
                 }
             }
 #endif
-            /* use the free hunks if they exist */
 
             if (p->free_hunks) {
+
+                /* use the free hunks if they exist */
+
                 chain = p->free_hunks;
                 p->free_hunks = NULL;
 
 ngx_log_debug(p->log, "free hunk: %08X:%d" _ chain->hunk _
               chain->hunk->end - chain->hunk->last);
 
-            /* allocate a new hunk if it's still allowed */
+            } else if (p->hunks < p->bufs.num) {
 
-            } else if (p->allocated < p->max_block_size) {
-                h = ngx_create_temp_hunk(p->pool, p->block_size, 20, 20);
-                if (h == NULL) {
-                    return NGX_ABORT;
-                }
+                /* allocate a new hunk if it's still allowed */
 
-                p->allocated += p->block_size;
+                ngx_test_null(h, ngx_create_temp_hunk(p->pool,
+                                                      p->bufs.size, 20, 20);
+                              NGX_ABORT);
+                p->hunks++;
 
-                temp = ngx_alloc_chain_entry(p->pool);
-                if (temp == NULL) {
-                    return NGX_ABORT;
-                }
-
-                temp->hunk = h;
-                temp->next = NULL;
-                chain = temp;
+                ngx_alloc_ce_and_set_hunk(te, h, p->pool, NGX_ABORT);
+                chain = te;
 
 ngx_log_debug(p->log, "new hunk: %08X" _ chain->hunk);
 
-            /* use the file hunks if they exist */
+            } else if (p->file_hunks) {
 
-            } else if (p->file_hunks) {
+                /* use the file hunks if they exist */
+
                 chain = p->file_hunks;
                 p->file_hunks = NULL;
 
 ngx_log_debug(p->log, "file hunk: %08X" _ chain->hunk _
               chain->hunk->end - chain->hunk->last);
 
-            /* if the hunks are not needed to be saved in a cache and
-               a downstream is ready then write the hunks to a downstream */
+            } else if (p->cachable == 0 && p->downstream->write->ready) {
 
-            } else if (p->cachable == 0 && p->downstream->write->ready) {
+                /*
+                 * if the hunks are not needed to be saved in a cache and
+                 * a downstream is ready then write the hunks to a downstream
+                 */
 
 ngx_log_debug(p->log, "downstream ready");
 
                 break;
 
-            /* if it's allowed then save the incoming hunks to a temporary
-               file, move the saved read hunks to a file chain,
-               convert the incoming hunks into the file hunks
-               and add them to an outgoing chain */
+            } else if (p->temp_offset < p->max_temp_file_size) {
 
-            } else if (p->temp_offset < p->max_temp_file_size) {
+                /*
+                 * if it's allowed then save the incoming hunks to a temporary
+                 * file, move the saved read hunks to a file chain,
+                 * convert the incoming hunks into the file hunks
+                 * and add them to an outgoing chain
+                 */
+
                 rc = ngx_event_proxy_write_chain_to_temp_file(p);
 
 ngx_log_debug(p->log, "temp offset: %d" _ p->temp_offset);
@@ -136,10 +144,9 @@ ngx_log_debug(p->log, "temp offset: %d" 
 ngx_log_debug(p->log, "new file hunk: %08X:%d" _ chain->hunk _
               chain->hunk->end - chain->hunk->last);
 
-            /* if there're no hunks to read in then disable a level event */
+            } else {
 
-            } else {
-                p->block_upstream = 1;
+                /* if there're no hunks to read in then disable a level event */
 
 ngx_log_debug(p->log, "no hunks to read in");
     
@@ -148,48 +155,43 @@ ngx_log_debug(p->log, "no hunks to read 
 
             n = ngx_recv_chain(p->upstream, chain);
 
-        }
-
 ngx_log_debug(p->log, "recv_chain: %d" _ n);
 
-        if (n == NGX_ERROR) {
-            p->upstream_error = 1;
-            return NGX_ERROR;
-        }
+            if (n == NGX_ERROR) {
+                p->upstream_error = 1;
+                return NGX_ERROR;
+            }
 
-        if (n == NGX_AGAIN) {
-            if (p->upstream->read->blocked) {
-                if (ngx_add_event(p->upstream->read, NGX_READ_EVENT,
-                                               NGX_LEVEL_EVENT) == NGX_ERROR) {
+            if (n == NGX_AGAIN) {
+                if (ngx_handle_read_event(p->upstream->read) == NGX_ERROR) {
                     return NGX_ABORT;
                 }
-                p->block_upstream = 0;
-                p->upstream->read->blocked = 0;
+
+                break;
             }
 
-            break;
+            if (n == 0) {
+                if (chain->hunk->shadow == NULL) {
+                    p->free_hunks = chain;
+                }
+                p->upstream_eof = 1;
+
+                break;
+            }
+
         }
 
-        if (n == 0) {
-            if (chain->hunk->shadow == NULL) {
-                p->free_hunks = chain;
-            }
-            p->upstream_eof = 1;
-            p->block_upstream = 0;
-
-            break;
-        }
+        /*
+         * move the full hunks to a read chain, the partial filled hunk
+         * to a free chain, and remove the shadow links for these hunks
+         */
 
-        /* move the full hunks to a read chain
-           and the partial filled hunk to a free chain
-           and remove the shadow links for these hunks */
+        for (ce = chain; ce && n > 0; ce = next) {
+            next = ce->next;
+            ce->next = NULL;
 
-        for (entry = chain; entry && n > 0; entry = next) {
-            next = entry->next;
-            entry->next = NULL;
-
-            if (entry->hunk->shadow) {
-                for (h = entry->hunk->shadow;
+            if (ce->hunk->shadow) {
+                for (h = ce->hunk->shadow;
                      (h->type & NGX_HUNK_LAST_SHADOW) == 0;
                      h = nh)
                 {
@@ -205,22 +207,22 @@ ngx_log_debug(p->log, "recv_chain: %d" _
                              |NGX_HUNK_IN_MEMORY
                              |NGX_HUNK_RECYCLED
                              |NGX_HUNK_LAST_SHADOW);
-                entry->hunk->shadow = NULL;
+                ce->hunk->shadow = NULL;
             }
 
-            size = entry->hunk->end - entry->hunk->last;
+            size = ce->hunk->end - ce->hunk->last;
 
             if (n >= size) {
-                entry->hunk->last = entry->hunk->end;
+                ce->hunk->last = ce->hunk->end;
 
                 if (p->read_hunks) {
-                    p->last_read_hunk->next = entry;
+                    p->last_read_hunk->next = ce;
 
                 } else {
-                    p->read_hunks = entry;
+                    p->read_hunks = ce;
                 }
 
-                p->last_read_hunk = entry;
+                p->last_read_hunk = ce;
 
                 n -= size;
 
@@ -232,37 +234,21 @@ ngx_log_debug(p->log, "recv_chain: %d" _
 
                 /* the inline copy input filter */
 
-                h = ngx_alloc_hunk(p->pool);
-                if (h == NULL) {
-                    return NGX_ABORT;
-                }
-
-                ngx_memcpy(h, entry->hunk, sizeof(ngx_hunk_t));
-                h->shadow = entry->hunk;
-                h->type |= NGX_HUNK_LAST_SHADOW|NGX_HUNK_RECYCLED;
-                entry->hunk->shadow = h;
+                ngx_test_null(h, ngx_alloc_hunk(p->pool), NGX_ABORT);
 
-                temp = ngx_alloc_chain_entry(p->pool);
-                if (temp == NULL) {
-                    return NGX_ABORT;
-                }
-
-                temp->hunk = h;
-                temp->next = NULL;
+                ngx_memcpy(h, ce->hunk, sizeof(ngx_hunk_t));
+                h->shadow = ce->hunk;
+                h->type |= NGX_HUNK_LAST_SHADOW|NGX_HUNK_RECYCLED;
+                ce->hunk->shadow = h;
 
-                if (p->in_hunks) {
-                    p->last_in_hunk->next = temp;
+                ngx_alloc_ce_and_set_hunk(te, h, p->pool, NGX_ABORT);
 
-                } else {
-                    p->in_hunks = temp;
-                }
-
-                p->last_in_hunk = temp;
+                ngx_chain_add_ce(p->in_hunks, p->last_in_hunk, te);
 #endif
 
             } else {
-                entry->hunk->last += n;
-                p->free_hunks = entry;
+                ce->hunk->last += n;
+                p->free_hunks = ce;
 
                 n = 0;
             }
@@ -272,8 +258,10 @@ ngx_log_debug(p->log, "recv_chain: %d" _
             chain = NULL;
         }
 
-        /* the input filter i.e. that moves HTTP/1.1 chunks
-           from a read chain to an incoming chain */
+        /*
+         * the input filter i.e. that moves HTTP/1.1 chunks
+         * from a read chain to an incoming chain
+         */
 
         if (p->input_filter) {
             if (p->input_filter(p, chain) == NGX_ERROR) {
@@ -281,38 +269,38 @@ ngx_log_debug(p->log, "recv_chain: %d" _
             }
         }
 
-ngx_log_debug(p->log, "rest chain: %08X" _ entry);
+ngx_log_debug(p->log, "rest chain: %08X" _ ce);
 
-        /* if the rest hunks are file hunks then move them to a file chain
-           otherwise add them to a free chain */
+        /*
+         * if the rest hunks are file hunks then move them to a file chain
+         * otherwise add them to a free chain
+         */
 
-        if (entry) {
-            if (entry->hunk->shadow) {
-                p->file_hunks = entry;
+        if (rest) {
+            if (rest->hunk->shadow) {
+                p->file_hunks = rest;
 
             } else {
                 if (p->free_hunks) {
-                    p->free_hunks->next = entry;
+                    p->free_hunks->next = rest;
 
                 } else {
-                    p->free_hunks = entry;
+                    p->free_hunks = rest;
                 }
             }
 
-            p->block_upstream = 0;
             break;
         }
     }
 
-ngx_log_debug(p->log, "eof: %d block: %d" _
-              p->upstream_eof _ p->block_upstream);
+ngx_log_debug(p->log, "eof: %d" _ p->upstream_eof);
 
-    /* if there's the end of upstream response then move
-       the partially filled hunk from a free chain to an incoming chain */
+    /*
+     * if there's the end of upstream response then move
+     * the partially filled hunk from a free chain to an incoming chain
+     */
 
     if (p->upstream_eof) {
-        p->upstream->read->ready = 0;
-
         if (p->free_hunks
             && p->free_hunks->hunk->pos < p->free_hunks->hunk->last)
         {
@@ -323,34 +311,36 @@ ngx_log_debug(p->log, "eof: %d block: %d
                 return NGX_ABORT;
             }
 #else
+
             if (p->input_filter) {
                 if (p->input_filter(p, NULL) == NGX_ERROR) {
                     return NGX_ABORT;
                 }
 
             } else {
-                entry = p->free_hunks;
+                ce = p->free_hunks;
 
                 if (p->in_hunks) {
-                    p->last_in_hunk->next = entry;
+                    p->last_in_hunk->next = ce;
 
                 } else {
-                    p->in_hunks = entry;
+                    p->in_hunks = ce;
                 }
 
-                p->last_in_hunk = entry;
+                p->last_in_hunk = ce;
             }
 
-            p->free_hunks = entry->next;
-            entry->next = NULL;
-#endif
+            p->free_hunks = ce->next;
+            ce->next = NULL;
+
+#endif  /* NGX_EVENT_COPY_FILTER */
         }
 
 #if 0
         /* free the unneeded hunks */
 
-        for (entry = p->free_hunks; entry; entry = ce->next) {
-            ngx_free_hunk(p->pool, entry->hunk);
+        for (ce = p->free_hunks; ce; ce = ce->next) {
+            ngx_free_hunk(p->pool, ce->hunk);
         }
 #endif
 
@@ -387,17 +377,10 @@ ngx_log_debug(p->log, "eof: %d block: %d
 
 ngx_log_debug(p->log, "upstream level: %d" _ p->upstream_level);
 
-    if (p->upstream_level == 0
-        && p->block_upstream
-        && ngx_event_flags & NGX_USE_LEVEL_EVENT)
-    {
-        if (ngx_del_event(p->upstream->read, NGX_READ_EVENT, 0) == NGX_ERROR) {
+    if (p->upstream_level == 0) {
+        if (ngx_handler_read_event(p->upstream->read) == NGX_ERROR) {
             return NGX_ABORT;
         }
-
-        p->upstream->read->blocked = 1;
-
-        return NGX_AGAIN;
     }
 
     if (p->upstream_eof) {
@@ -415,6 +398,8 @@ int ngx_event_proxy_write_to_downstream(
     ngx_hunk_t   *h;
     ngx_chain_t  *entry;
 
+#if 0
+
     if (p->upstream_level == 0
         && p->downstream_level == 0
         && p->busy_hunk == NULL
@@ -431,6 +416,8 @@ int ngx_event_proxy_write_to_downstream(
         return NGX_AGAIN;
     }
 
+#endif
+
     p->downstream_level++;
 
 ngx_log_debug(p->log, "write to downstream");
@@ -695,45 +682,32 @@ static int ngx_event_proxy_copy_input_fi
                                              ngx_chain_t *chain)
 {
     ngx_hunk_t   *h;
-    ngx_chain_t  *entry, *temp;
+    ngx_chain_t  *ce, *temp;
 
     if (p->upstream_eof) {
-        entry = p->free_hunks;
 
-        if (p->in_hunks) {
-            p->last_in_hunk->next = entry;
+        /* THINK comment */
+
+        ce = p->free_hunks;
 
-        } else {
-            p->in_hunks = entry;
-        }
+        ngx_chain_add_ce(p->in_hunk, p->last_in_hunk, ce);
 
-        p->last_in_hunk = entry;
-
-        p->free_hunks = entry->next;
-        entry->next = NULL;
+        p->free_hunks = ce->next;
+        ce->next = NULL;
 
         return NGX_OK;
     }
 
-    for (entry = chain; entry; entry = entry->next) {
+    for (ce = chain; ce; ce = ce->next) {
         ngx_test_null(h, ngx_alloc_hunk(p->pool), NGX_ERROR);
-        ngx_memcpy(h, entry->hunk, sizeof(ngx_hunk_t));
-        h->shadow = entry->hunk;
+        ngx_memcpy(h, ce->hunk, sizeof(ngx_hunk_t));
+        h->shadow = ce->hunk;
         h->type |= NGX_HUNK_LAST_SHADOW|NGX_HUNK_RECYCLED;
-        entry->hunk->shadow = h;
+        ce->hunk->shadow = h;
 
-        ngx_test_null(temp, ngx_alloc_chain_entry(p->pool), NGX_ERROR);
-        temp->hunk = h;
-        temp->next = NULL;
+        ngx_alloc_ce_and_set_hunk(te, h, p->pool, NGX_ERROR);
 
-        if (p->in_hunks) {
-            p->last_in_hunk->next = temp;
-
-        } else {
-            p->in_hunks = temp;
-        }
-
-        p->last_in_hunk = temp;
+        ngx_chain_add_ce(p->in_hunk, p->last_in_hunk, te);
     }
 
     return NGX_OK;
--- a/src/event/ngx_event_proxy.h
+++ b/src/event/ngx_event_proxy.h
@@ -49,9 +49,8 @@ struct ngx_event_proxy_s {
     int                upstream_level;
     int                downstream_level;
 
-    int                allocated;
-    int                block_size;
-    int                max_block_size;
+    int                hunks;
+    ngx_bufs_t         bufs;
 
     off_t              temp_offset;
     off_t              max_temp_file_size;
--- a/src/http/ngx_http_special_response.c
+++ b/src/http/ngx_http_special_response.c
@@ -234,7 +234,9 @@ int ngx_http_special_response_handler(ng
 
     if (/* STUB: "msie_padding on/off" */ 1
         && r->http_version >= NGX_HTTP_VERSION_10
-        && error >= NGX_HTTP_BAD_REQUEST)
+        && error >= NGX_HTTP_BAD_REQUEST
+        && error != NGX_HTTP_REQUEST_URI_TOO_LARGE
+       )
     {
 
         if (ngx_http_output_filter(r, h) == NGX_ERROR) {