]> granicus.if.org Git - apache/commitdiff
Change conn_rec->keepalive to an enumerated value of
authorJustin Erenkrantz <jerenkrantz@apache.org>
Wed, 26 Jun 2002 19:45:07 +0000 (19:45 +0000)
committerJustin Erenkrantz <jerenkrantz@apache.org>
Wed, 26 Jun 2002 19:45:07 +0000 (19:45 +0000)
AP_CONN_UNKNOWN
AP_CONN_CLOSE
AP_CONN_KEEPALIVE

This also fixes a problem where ap_discard_request_body would not discard
the body when keepalive was 0.  This actually meant the keepalive status
was unknown *not* closed, but no one ever remembered that.

This problem was seen with mod_dav sending error responses (as reported by
Karl Fogel).

Suggested by: Greg "this isn't the '80s" Stein
Reviewed by: Greg Ames

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@95891 13f79535-47bb-0310-9956-ffa450edef68

CHANGES
include/ap_mmn.h
include/httpd.h
modules/arch/win32/mod_isapi.c
modules/http/http_core.c
modules/http/http_protocol.c
modules/http/http_request.c
modules/loggers/mod_log_config.c
modules/proxy/proxy_http.c
server/core.c
server/protocol.c

diff --git a/CHANGES b/CHANGES
index 59793cc0799121b7d756c0f9e8744dbaa86f81f5..0c723ddb10dc5d073e8a7260c9b74d3beb93c537 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,5 +1,8 @@
 Changes with Apache 2.0.40
 
+  *) Switch conn_rec->keepalive to an enumeration rather than a bitfield.
+     [Justin Erenkrantz]
+
   *) Fix mod_ext_filter to look in the main server for filter definitions
      when running in a vhost if the filter definition is not found in
      the vhost.  PR 10147  [Jeff Trawick]
index 13938579b1675543aae64b5274ab579bfce62d13..58b7a7fc4368450899f7d8d9c2b1d8948aee23b9 100644 (file)
  * 20020529 (2.0.37-dev) Standardized the names of some apr_pool_*_set funcs
  * 20020602 (2.0.37-dev) Bucket API change (metadata buckets)
  * 20020612 (2.0.38-dev) Changed server_rec->[keep_alive_]timeout to apr time
+ * 20020625 (2.0.40-dev) Changed conn_rec->keepalive to an enumeration
  */
 
 #define MODULE_MAGIC_COOKIE 0x41503230UL /* "AP20" */
 
 #ifndef MODULE_MAGIC_NUMBER_MAJOR
-#define MODULE_MAGIC_NUMBER_MAJOR 20020612
+#define MODULE_MAGIC_NUMBER_MAJOR 20020625
 #endif
-#define MODULE_MAGIC_NUMBER_MINOR 1                     /* 0...n */
+#define MODULE_MAGIC_NUMBER_MINOR 0                     /* 0...n */
 
 /**
  * Determine if the server's current MODULE_MAGIC_NUMBER is at least a
index f563951cca33a67a8f81c85aa8df598e9bc8c663..1b3279644ef1b318ba78e542d3d999bfa0a5f313 100644 (file)
@@ -951,6 +951,11 @@ struct request_rec {
 
 /* @} */
 
+typedef enum {
+    AP_CONN_UNKNOWN,
+    AP_CONN_CLOSE,
+    AP_CONN_KEEPALIVE
+} ap_conn_keepalive_e;
 
 /** Structure to store things which are per connection */
 struct conn_rec {
@@ -981,8 +986,8 @@ struct conn_rec {
     unsigned aborted:1;
 
     /** Are we going to keep the connection alive for another request?
-     *  -1 fatal error, 0 undecided, 1 yes   */
-    signed int keepalive:2;
+     * @see ap_conn_keepalive_e */
+    ap_conn_keepalive_e keepalive;
 
     /** have we done double-reverse DNS? -1 yes/failure, 0 not yet, 
      *  1 yes/success */
index 636f2f5411e018d2181bdf2fdba91957b882ab3c..bd99f003e0fdafa5ee312478e1be48ce662c7702 100644 (file)
@@ -1093,7 +1093,7 @@ int APR_THREAD_FUNC ServerSupportFunction(isapi_cid    *cid,
         return 0;
 
     case HSE_REQ_IS_KEEP_CONN:
-        *((int *)buf_data) = (r->connection->keepalive == 1);
+        *((int *)buf_data) = (r->connection->keepalive == AP_CONN_KEEPALIVE);
         return 1;
 
     case HSE_REQ_ASYNC_READ_CLIENT:
index cc51aee6446ba62bd5ae6ff1b6526f23c1015384..9db75533fcbc2814f6d4d677cb12a480f198037e 100644 (file)
@@ -283,7 +283,7 @@ static int ap_process_http_connection(conn_rec *c)
     ap_update_child_status(c->sbh, SERVER_BUSY_READ, NULL);
     while ((r = ap_read_request(c)) != NULL) {
  
-        c->keepalive = 0;
+        c->keepalive = AP_CONN_UNKNOWN;
         /* process the request if it was read without error */
  
         ap_update_child_status(c->sbh, SERVER_BUSY_WRITE, r);
@@ -293,7 +293,7 @@ static int ap_process_http_connection(conn_rec *c)
         if (ap_extended_status)
             ap_increment_counts(c->sbh, r);
  
-        if (!c->keepalive || c->aborted)
+        if (c->keepalive != AP_CONN_KEEPALIVE || c->aborted)
             break;
  
         ap_update_child_status(c->sbh, SERVER_BUSY_KEEPALIVE, r);
index 5230772a1cd1311cd771571a51fb6f1ab0f31522..38635501ab39126f0fa4d6a1cbb4ae001f7c049b 100644 (file)
@@ -223,7 +223,7 @@ AP_DECLARE(int) ap_set_keepalive(request_rec *r)
      *
      * Note that the condition evaluation order is extremely important.
      */
-    if ((r->connection->keepalive != -1)
+    if ((r->connection->keepalive != AP_CONN_CLOSE)
         && ((r->status == HTTP_NOT_MODIFIED)
             || (r->status == HTTP_NO_CONTENT)
             || r->header_only
@@ -247,7 +247,7 @@ AP_DECLARE(int) ap_set_keepalive(request_rec *r)
             || (r->proto_num >= HTTP_VERSION(1,1)))) {
         int left = r->server->keep_alive_max - r->connection->keepalives;
 
-        r->connection->keepalive = 1;
+        r->connection->keepalive = AP_CONN_KEEPALIVE;
         r->connection->keepalives++;
 
         /* If they sent a Keep-Alive token, send one back */
@@ -281,7 +281,7 @@ AP_DECLARE(int) ap_set_keepalive(request_rec *r)
         apr_table_mergen(r->headers_out, "Connection", "close");
     }
 
-    r->connection->keepalive = 0;
+    r->connection->keepalive = AP_CONN_CLOSE;
 
     return 0;
 }
@@ -1162,7 +1162,7 @@ static void basic_http_header_check(request_rec *r,
     if (r->proto_num == HTTP_VERSION(1,0)
         && apr_table_get(r->subprocess_env, "force-response-1.0")) {
         *protocol = "HTTP/1.0";
-        r->connection->keepalive = -1;
+        r->connection->keepalive = AP_CONN_CLOSE;
     }
     else {
         *protocol = AP_SERVER_PROTOCOL;
@@ -1835,7 +1835,7 @@ AP_DECLARE(long) ap_get_client_block(request_rec *r, char *buffer,
         /* if we actually fail here, we want to just return and
          * stop trying to read data from the client.
          */
-        r->connection->keepalive = -1;
+        r->connection->keepalive = AP_CONN_CLOSE;
         return -1;
     }
 
@@ -1882,8 +1882,8 @@ AP_DECLARE(int) ap_discard_request_body(request_rec *r)
      *
      * This function is also a no-op on a subrequest.
      */
-    if (r->main || !r->connection->keepalive
-                || ap_status_drops_connection(r->status)) {
+    if (r->main || r->connection->keepalive == AP_CONN_CLOSE ||
+        ap_status_drops_connection(r->status)) {
         return OK;
     }
 
index 543aff226a204c3037dae2774756497d26df7dda..b3763d6e16ffa2df77ed6d7fa80a1a2140735c88 100644 (file)
@@ -143,7 +143,7 @@ AP_DECLARE(void) ap_die(int type, request_rec *r)
      * connection, be sure that the request body (if any) has been read.
      */
     if (ap_status_drops_connection(r->status)) {
-        r->connection->keepalive = 0;
+        r->connection->keepalive = AP_CONN_CLOSE;
     }
 
     /*
@@ -216,7 +216,7 @@ static void check_pipeline_flush(request_rec *r)
      */
     /* ### shouldn't this read from the connection input filters? */
     /* ### is zero correct? that means "read one line" */
-    if (!r->connection->keepalive || 
+    if (r->connection->keepalive == AP_CONN_CLOSE || 
         ap_get_brigade(r->input_filters, bb, AP_MODE_EATCRLF, 
                        APR_NONBLOCK_READ, 0) != APR_SUCCESS) {
         apr_bucket *e = apr_bucket_flush_create(c->bucket_alloc);
index 202f672890d3ecdc5994dd3e5ef56f720a3e97c4..c92945d3f47efc2831f72fcf60ef8de81f367bc8 100644 (file)
@@ -585,7 +585,7 @@ static const char *log_connection_status(request_rec *r, char *a)
     if (r->connection->aborted)
         return "X";
 
-    if (r->connection->keepalive && 
+    if (r->connection->keepalive == AP_CONN_KEEPALIVE && 
         (!r->server->keep_alive_max ||
          (r->server->keep_alive_max - r->connection->keepalives) > 0)) {
         return "+";
index 7de23e75ef2c4442c33e17b433210a9df0392727..6ee7060f8393e49df5f9f9200ae64a3d58413404 100644 (file)
@@ -446,7 +446,7 @@ apr_status_t ap_proxy_http_request(apr_pool_t *p, request_rec *r,
     ap_proxy_clear_connection(p, r->headers_in);
     if (p_conn->close) {
         apr_table_setn(r->headers_in, "Connection", "close");
-        origin->keepalive = 0;
+        origin->keepalive = AP_CONN_CLOSE;
     }
 
     if ( apr_table_get(r->subprocess_env,"force-proxy-request-1.0")) {
@@ -456,7 +456,7 @@ apr_status_t ap_proxy_http_request(apr_pool_t *p, request_rec *r,
     }
     if ( apr_table_get(r->subprocess_env,"proxy-nokeepalive")) {
         apr_table_unset(r->headers_in, "Connection");
-        origin->keepalive = 0;
+        origin->keepalive = AP_CONN_CLOSE;
     }
     ap_xlate_proto_to_ascii(buf, strlen(buf));
     e = apr_bucket_pool_create(buf, strlen(buf), p, c->bucket_alloc);
@@ -798,7 +798,7 @@ apr_status_t ap_proxy_http_process_response(apr_pool_t * p, request_rec *r,
             /* cancel keepalive if HTTP/1.0 or less */
             if ((major < 1) || (minor < 1)) {
                 p_conn->close += 1;
-                origin->keepalive = 0;
+                origin->keepalive = AP_CONN_CLOSE;
             }
         } else {
             /* an http/0.9 response */
index 901a6f0c6986a7548f76d370f37ee45f0e5bef71..cc988e737c95ae8eb688acc42dbdafedb0ccd957 100644 (file)
@@ -3293,7 +3293,7 @@ static int net_time_filter(ap_filter_t *f, apr_bucket_brigade *b,
                            ap_input_mode_t mode, apr_read_type_e block,
                            apr_off_t readbytes)
 {
-    int keptalive = f->c->keepalive == 1;
+    int keptalive = f->c->keepalive == AP_CONN_KEEPALIVE;
     apr_socket_t *csd = ap_get_module_config(f->c->conn_config, &core_module);
     int *first_line = f->ctx;
 
@@ -3755,7 +3755,8 @@ static apr_status_t core_output_filter(ap_filter_t *f, apr_bucket_brigade *b)
              && (nbytes + flen < AP_MIN_BYTES_TO_WRITE)
              && !APR_BUCKET_IS_FLUSH(last_e))
             || (nbytes + flen < AP_MIN_BYTES_TO_WRITE 
-                && APR_BUCKET_IS_EOS(last_e) && c->keepalive)) {
+                && APR_BUCKET_IS_EOS(last_e)
+                && c->keepalive == AP_CONN_KEEPALIVE)) {
 
             /* NEVER save an EOS in here.  If we are saving a brigade with
              * an EOS bucket, then we are doing keepalive connections, and
@@ -3824,7 +3825,7 @@ static apr_status_t core_output_filter(ap_filter_t *f, apr_bucket_brigade *b)
             }
 
 #if APR_HAS_SENDFILE
-            if (!c->keepalive && APR_BUCKET_IS_EOS(last_e)) {
+            if (c->keepalive == AP_CONN_CLOSE && APR_BUCKET_IS_EOS(last_e)) {
                 /* Prepare the socket to be reused */
                 flags |= APR_SENDFILE_DISCONNECT_SOCKET;
             }
index cfc03cd6ea833552321bb5421ad076fc21a95361..ed7b1972656c0d2089bad7017f0ea9897249581f 100644 (file)
@@ -1187,7 +1187,8 @@ AP_CORE_DECLARE_NONSTD(apr_status_t) ap_content_length_filter(ap_filter_t *f,
      * We should be able to force connection close from this filter
      * when we see we are buffering too much.
      */
-    if ((r->proto_num >= HTTP_VERSION(1, 1)) || (!r->connection->keepalive)) {
+    if ((r->proto_num >= HTTP_VERSION(1, 1)) ||
+        (r->connection->keepalive == AP_CONN_CLOSE)) {
         partial_send_okay = 1;
     }