httpd-cvs mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From field...@apache.org
Subject cvs commit: httpd-2.0/modules/loggers mod_log_config.c
Date Sat, 21 Apr 2001 12:23:37 GMT
fielding    01/04/21 05:23:37

  Modified:    include  httpd.h
               server   protocol.c
               modules/http http_core.c http_protocol.c mod_core.h
               modules/loggers mod_log_config.c
  Log:
  Revert the change that moved keepalives out of conn_rec.  That variable
  controls the number of requests per connection, regardless of the protocol
  used by the request.
  
  Revision  Changes    Path
  1.148     +4 -0      httpd-2.0/include/httpd.h
  
  Index: httpd.h
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/include/httpd.h,v
  retrieving revision 1.147
  retrieving revision 1.148
  diff -u -r1.147 -r1.148
  --- httpd.h	2001/04/18 03:53:29	1.147
  +++ httpd.h	2001/04/21 12:23:33	1.148
  @@ -860,10 +860,14 @@
       unsigned aborted:1;
       /** Are we using HTTP Keep-Alive?  -1 fatal error, 0 undecided, 1 yes */
       signed int keepalive:2;
  +    /** Did we use HTTP Keep-Alive? */
  +    unsigned keptalive:1;
       /** have we done double-reverse DNS? -1 yes/failure, 0 not yet, 
        *  1 yes/success */
       signed int double_reverse:2;
   
  +    /** How many times have we used it? */
  +    int keepalives;
       /** server IP address */
       char *local_ip;
       /** used for ap_get_server_name when UseCanonicalName is set to DNS
  
  
  
  1.15      +137 -3    httpd-2.0/server/protocol.c
  
  Index: protocol.c
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/server/protocol.c,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -u -r1.14 -r1.15
  --- protocol.c	2001/04/18 20:46:46	1.14
  +++ protocol.c	2001/04/21 12:23:34	1.15
  @@ -363,6 +363,116 @@
       }
   }
   
  +static int read_request_line(request_rec *r)
  +{
  +    char l[DEFAULT_LIMIT_REQUEST_LINE + 2]; /* getline's two extra for \n\0 */
  +    const char *ll = l;
  +    const char *uri;
  +    const char *pro;
  +
  +#if 0
  +    conn_rec *conn = r->connection;
  +#endif
  +    int major = 1, minor = 0;   /* Assume HTTP/1.0 if non-"HTTP" protocol */
  +    int len;
  +
  +    /* Read past empty lines until we get a real request line,
  +     * a read error, the connection closes (EOF), or we timeout.
  +     *
  +     * We skip empty lines because browsers have to tack a CRLF on to the end
  +     * of POSTs to support old CERN webservers.  But note that we may not
  +     * have flushed any previous response completely to the client yet.
  +     * We delay the flush as long as possible so that we can improve
  +     * performance for clients that are pipelining requests.  If a request
  +     * is pipelined then we won't block during the (implicit) read() below.
  +     * If the requests aren't pipelined, then the client is still waiting
  +     * for the final buffer flush from us, and we will block in the implicit
  +     * read().  B_SAFEREAD ensures that the BUFF layer flushes if it will
  +     * have to block during a read.
  +     */
  +
  +    while ((len = ap_getline(l, sizeof(l), r, 0)) <= 0) {
  +        if (len < 0) {             /* includes EOF */
  +	    /* this is a hack to make sure that request time is set,
  +	     * it's not perfect, but it's better than nothing 
  +	     */
  +	    r->request_time = apr_time_now();
  +            return 0;
  +        }
  +    }
  +    /* we've probably got something to do, ignore graceful restart requests */
  +
  +    /* XXX - sigwait doesn't work if the signal has been SIG_IGNed (under
  +     * linux 2.0 w/ glibc 2.0, anyway), and this step isn't necessary when
  +     * we're running a sigwait thread anyway. If/when unthreaded mode is
  +     * put back in, we should make sure to ignore this signal iff a sigwait
  +     * thread isn't used. - mvsk
  +
  +#ifdef SIGWINCH
  +    apr_signal(SIGWINCH, SIG_IGN);
  +#endif
  +    */
  +
  +    r->request_time = apr_time_now();
  +    r->the_request = apr_pstrdup(r->pool, l);
  +    r->method = ap_getword_white(r->pool, &ll);
  +
  +#if 0
  +/* XXX If we want to keep track of the Method, the protocol module should do
  + * it.  That support isn't in the scoreboard yet.  Hopefully next week 
  + * sometime.   rbb */
  +    ap_update_connection_status(AP_CHILD_THREAD_FROM_ID(conn->id), "Method", r->method);

  +#endif
  +    uri = ap_getword_white(r->pool, &ll);
  +
  +    /* Provide quick information about the request method as soon as known */
  +
  +    r->method_number = ap_method_number_of(r->method);
  +    if (r->method_number == M_GET && r->method[0] == 'H') {
  +        r->header_only = 1;
  +    }
  +
  +    ap_parse_uri(r, uri);
  +
  +    /* ap_getline returns (size of max buffer - 1) if it fills up the
  +     * buffer before finding the end-of-line.  This is only going to
  +     * happen if it exceeds the configured limit for a request-line.
  +     */
  +    if (len > r->server->limit_req_line) {
  +        r->status    = HTTP_REQUEST_URI_TOO_LARGE;
  +        r->proto_num = HTTP_VERSION(1,0);
  +        r->protocol  = apr_pstrdup(r->pool, "HTTP/1.0");
  +        return 0;
  +    }
  +
  +    if (ll[0]) {
  +        r->assbackwards = 0;
  +        pro = ll;
  +        len = strlen(ll);
  +    } else {
  +        r->assbackwards = 1;
  +        pro = "HTTP/0.9";
  +        len = 8;
  +    }
  +    r->protocol = apr_pstrndup(r->pool, pro, len);
  +
  +    /* XXX ap_update_connection_status(conn->id, "Protocol", r->protocol); */
  +
  +    /* Avoid sscanf in the common case */
  +    if (len == 8 &&
  +        pro[0] == 'H' && pro[1] == 'T' && pro[2] == 'T' && pro[3]
== 'P' &&
  +        pro[4] == '/' && apr_isdigit(pro[5]) && pro[6] == '.' &&
  +        apr_isdigit(pro[7])) {
  + 	r->proto_num = HTTP_VERSION(pro[5] - '0', pro[7] - '0');
  +    } else if (2 == sscanf(r->protocol, "HTTP/%u.%u", &major, &minor)
  +               && minor < HTTP_VERSION(1,0))	/* don't allow HTTP/0.1000 */
  +	r->proto_num = HTTP_VERSION(major, minor);
  +    else
  +	r->proto_num = HTTP_VERSION(1,0);
  +
  +    return 1;
  +}
  +
   static void get_mime_headers(request_rec *r)
   {
       char field[DEFAULT_LIMIT_REQUEST_FIELDSIZE + 2]; /* getline's two extra */
  @@ -446,6 +556,9 @@
       r->connection      = conn;
       r->server          = conn->base_server;
   
  +    conn->keptalive    = conn->keepalive == 1;
  +    conn->keepalive    = 0;
  +
       r->user            = NULL;
       r->ap_auth_type    = NULL;
   
  @@ -458,9 +571,7 @@
       r->notes           = apr_table_make(r->pool, 5);
   
       r->request_config  = ap_create_request_config(r->pool);
  -    if (ap_run_create_request(r) != OK) {
  -        return NULL;
  -    }
  +    ap_run_create_request(r);
       r->per_dir_config  = r->server->lookup_defaults;
   
       r->sent_bodyct     = 0;                      /* bytect isn't for body */
  @@ -469,13 +580,34 @@
       r->read_body       = REQUEST_NO_BODY;
   
       r->status          = HTTP_REQUEST_TIME_OUT;  /* Until we get a request */
  +    r->the_request     = NULL;
       r->output_filters  = conn->output_filters;
       r->input_filters   = conn->input_filters;
   
  +    apr_setsocketopt(conn->client_socket, APR_SO_TIMEOUT, 
  +                     (int)(conn->keptalive
  +                     ? r->server->keep_alive_timeout * APR_USEC_PER_SEC
  +                     : r->server->timeout * APR_USEC_PER_SEC));
  +                     
       ap_add_output_filter("BYTERANGE", NULL, r, r->connection);
       ap_add_output_filter("CONTENT_LENGTH", NULL, r, r->connection);
       ap_add_output_filter("HTTP_HEADER", NULL, r, r->connection);
   
  +    /* Get the request... */
  +    if (!read_request_line(r)) {
  +        if (r->status == HTTP_REQUEST_URI_TOO_LARGE) {
  +            ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, r,
  +			  "request failed: URI too long");
  +            ap_send_error_response(r, 0);
  +            ap_run_log_transaction(r);
  +            return r;
  +        }
  +        return NULL;
  +    }
  +    if (r->connection->keptalive) {
  +        apr_setsocketopt(r->connection->client_socket, APR_SO_TIMEOUT,
  +                         (int)(r->server->timeout * APR_USEC_PER_SEC));
  +    }
       if (!r->assbackwards) {
           get_mime_headers(r);
           if (r->status != HTTP_REQUEST_TIME_OUT) {
  @@ -513,6 +645,8 @@
   
       /* we may have switched to another server */
       r->per_dir_config = r->server->lookup_defaults;
  +
  +    conn->keptalive = 0;        /* We now have a request to play with */
   
       if ((!r->hostname && (r->proto_num >= HTTP_VERSION(1,1))) ||
           ((r->proto_num == HTTP_VERSION(1,1)) &&
  
  
  
  1.274     +0 -148    httpd-2.0/modules/http/http_core.c
  
  Index: http_core.c
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/modules/http/http_core.c,v
  retrieving revision 1.273
  retrieving revision 1.274
  diff -u -r1.273 -r1.274
  --- http_core.c	2001/04/21 12:00:02	1.273
  +++ http_core.c	2001/04/21 12:23:34	1.274
  @@ -58,7 +58,6 @@
   
   #include "apr_strings.h"
   #include "apr_thread_proc.h"    /* for RLIMIT stuff */
  -#include "apr_lib.h"
   
   #define APR_WANT_STRFUNC
   #include "apr_want.h"
  @@ -66,7 +65,6 @@
   #define CORE_PRIVATE
   #include "httpd.h"
   #include "http_config.h"
  -#include "http_log.h"
   #include "http_connection.h"
   #include "http_protocol.h"	/* For index_of_response().  Grump. */
   #include "http_request.h"
  @@ -297,151 +295,6 @@
       return OK;
   }
   
  -static int read_request_line(request_rec *r)
  -{
  -    char l[DEFAULT_LIMIT_REQUEST_LINE + 2]; /* getline's two extra for \n\0 */
  -    const char *ll = l;
  -    const char *uri;
  -    const char *pro;
  - 
  -    int major = 1, minor = 0;   /* Assume HTTP/1.0 if non-"HTTP" protocol */
  -    int len;
  - 
  -    /* Read past empty lines until we get a real request line,
  -     * a read error, the connection closes (EOF), or we timeout.
  -     *
  -     * We skip empty lines because browsers have to tack a CRLF on to the end
  -     * of POSTs to support old CERN webservers.  But note that we may not
  -     * have flushed any previous response completely to the client yet.
  -     * We delay the flush as long as possible so that we can improve
  -     * performance for clients that are pipelining requests.  If a request
  -     * is pipelined then we won't block during the (implicit) read() below.
  -     * If the requests aren't pipelined, then the client is still waiting
  -     * for the final buffer flush from us, and we will block in the implicit
  -     * read().  B_SAFEREAD ensures that the BUFF layer flushes if it will
  -     * have to block during a read.
  -     */
  - 
  -    while ((len = ap_getline(l, sizeof(l), r, 0)) <= 0) {
  -        if (len < 0) {             /* includes EOF */
  -            /* this is a hack to make sure that request time is set,
  -             * it's not perfect, but it's better than nothing
  -             */
  -            r->request_time = apr_time_now();
  -            return 0;
  -        }
  -    }
  -    /* we've probably got something to do, ignore graceful restart requests */
  - 
  -    /* XXX - sigwait doesn't work if the signal has been SIG_IGNed (under
  -     * linux 2.0 w/ glibc 2.0, anyway), and this step isn't necessary when
  -     * we're running a sigwait thread anyway. If/when unthreaded mode is
  -     * put back in, we should make sure to ignore this signal iff a sigwait
  -     * thread isn't used. - mvsk
  - 
  -#ifdef SIGWINCH
  -    apr_signal(SIGWINCH, SIG_IGN);
  -#endif
  -    */
  - 
  -    r->request_time = apr_time_now();
  -    r->the_request = apr_pstrdup(r->pool, l);
  -    r->method = ap_getword_white(r->pool, &ll);
  - 
  -#if 0
  -/* XXX If we want to keep track of the Method, the protocol module should do
  - * it.  That support isn't in the scoreboard yet.  Hopefully next week
  - * sometime.   rbb */
  -    ap_update_connection_status(AP_CHILD_THREAD_FROM_ID(conn->id), "Method", r->method);
  -#endif
  -    uri = ap_getword_white(r->pool, &ll);
  - 
  -    /* Provide quick information about the request method as soon as known */
  - 
  -    r->method_number = ap_method_number_of(r->method);
  -    if (r->method_number == M_GET && r->method[0] == 'H') {
  -        r->header_only = 1;
  -    }
  - 
  -    ap_parse_uri(r, uri);
  - 
  -    /* ap_getline returns (size of max buffer - 1) if it fills up the
  -     * buffer before finding the end-of-line.  This is only going to
  -     * happen if it exceeds the configured limit for a request-line.
  -     */
  -    if (len > r->server->limit_req_line) {
  -        r->status    = HTTP_REQUEST_URI_TOO_LARGE;
  -        r->proto_num = HTTP_VERSION(1,0);
  -        r->protocol  = apr_pstrdup(r->pool, "HTTP/1.0");
  -        return 0;
  -    }
  - 
  -    if (ll[0]) {
  -        r->assbackwards = 0;
  -        pro = ll;
  -        len = strlen(ll);
  -    } else {
  -        r->assbackwards = 1;
  -        pro = "HTTP/0.9";
  -        len = 8;
  -    }
  -    r->protocol = apr_pstrndup(r->pool, pro, len);
  - 
  -    /* XXX ap_update_connection_status(conn->id, "Protocol", r->protocol); */
  - 
  -    /* Avoid sscanf in the common case */
  -    if (len == 8 &&
  -        pro[0] == 'H' && pro[1] == 'T' && pro[2] == 'T' && pro[3]
== 'P' &&
  -        pro[4] == '/' && apr_isdigit(pro[5]) && pro[6] == '.' &&
  -        apr_isdigit(pro[7])) {
  -        r->proto_num = HTTP_VERSION(pro[5] - '0', pro[7] - '0');
  -    } else if (2 == sscanf(r->protocol, "HTTP/%u.%u", &major, &minor)
  -               && minor < HTTP_VERSION(1,0))    /* don't allow HTTP/0.1000 */
  -        r->proto_num = HTTP_VERSION(major, minor);
  -    else
  -        r->proto_num = HTTP_VERSION(1,0);
  - 
  -    return 1;
  -}
  -
  -static int http_create_request(request_rec *r)
  -{
  -    ap_http_conn_rec *hconn = ap_get_module_config(r->connection->conn_config, &http_module);
  -    int keptalive;
  -
  -    hconn = apr_pcalloc(r->pool, sizeof(*hconn));
  -    ap_set_module_config(r->connection->conn_config, &http_module, hconn);
  -
  -    if (!r->main && !r->prev && !r->next) {
  -        keptalive = r->connection->keepalive == 1;
  -        r->connection->keepalive    = 0;
  - 
  -        /* XXX can we optimize these timeouts at all? gstein */
  -        apr_setsocketopt(r->connection->client_socket, APR_SO_TIMEOUT,
  -                         (int)(keptalive
  -                         ? r->server->keep_alive_timeout * APR_USEC_PER_SEC
  -                         : r->server->timeout * APR_USEC_PER_SEC));
  - 
  -        /* Get the request... */
  -        if (!read_request_line(r)) {
  -            if (r->status == HTTP_REQUEST_URI_TOO_LARGE) {
  -                ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, r,
  -                              "request failed: URI too long");
  -                ap_send_error_response(r, 0);
  -                ap_run_log_transaction(r);
  -                return OK;
  -            }
  -            return DONE;
  -        }
  -        if (keptalive) {
  -            apr_setsocketopt(r->connection->client_socket,
  -                             APR_SO_TIMEOUT,
  -                             (int)(r->server->timeout * APR_USEC_PER_SEC));
  -        }
  -    }
  -    return OK;
  -}
  -
   static void register_hooks(apr_pool_t *p)
   {
       ap_hook_pre_connection(ap_pre_http_connection,NULL,NULL,
  @@ -450,7 +303,6 @@
   			       APR_HOOK_REALLY_LAST);
       ap_hook_http_method(http_method,NULL,NULL,APR_HOOK_REALLY_LAST);
       ap_hook_default_port(http_port,NULL,NULL,APR_HOOK_REALLY_LAST);
  -    ap_hook_create_request(http_create_request, NULL, NULL, APR_HOOK_MIDDLE);
   
       ap_register_input_filter("HTTP_IN", ap_http_filter, AP_FTYPE_CONNECTION);
       ap_register_input_filter("DECHUNK", ap_dechunk_filter, AP_FTYPE_TRANSCODE);
  
  
  
  1.315     +3 -4      httpd-2.0/modules/http/http_protocol.c
  
  Index: http_protocol.c
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/modules/http/http_protocol.c,v
  retrieving revision 1.314
  retrieving revision 1.315
  diff -u -r1.314 -r1.315
  --- http_protocol.c	2001/04/18 03:53:31	1.314
  +++ http_protocol.c	2001/04/21 12:23:35	1.315
  @@ -105,7 +105,6 @@
       int ka_sent = 0;
       int wimpy = ap_find_token(r->pool,
                              apr_table_get(r->headers_out, "Connection"), "close");
  -    ap_http_conn_rec *hconn = ap_get_module_config(r->connection->conn_config, &http_module);
       const char *conn = apr_table_get(r->headers_in, "Connection");
   
       /* The following convoluted conditional determines whether or not
  @@ -147,7 +146,7 @@
           && r->server->keep_alive
   	&& (r->server->keep_alive_timeout > 0)
   	&& ((r->server->keep_alive_max == 0)
  -	    || (r->server->keep_alive_max > hconn->keepalives))
  +	    || (r->server->keep_alive_max > r->connection->keepalives))
   	&& !ap_status_drops_connection(r->status)
   	&& !wimpy
   	&& !ap_find_token(r->pool, conn, "close")
  @@ -155,10 +154,10 @@
   	    || apr_table_get(r->headers_in, "Via"))
   	&& ((ka_sent = ap_find_token(r->pool, conn, "keep-alive"))
   	    || (r->proto_num >= HTTP_VERSION(1,1)))) {
  -        int left = r->server->keep_alive_max - hconn->keepalives;
  +        int left = r->server->keep_alive_max - r->connection->keepalives;
   
           r->connection->keepalive = 1;
  -        hconn->keepalives++;
  +        r->connection->keepalives++;
   
           /* If they sent a Keep-Alive token, send one back */
           if (ka_sent) {
  
  
  
  1.9       +0 -9      httpd-2.0/modules/http/mod_core.h
  
  Index: mod_core.h
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/modules/http/mod_core.h,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- mod_core.h	2001/04/18 18:39:10	1.8
  +++ mod_core.h	2001/04/21 12:23:35	1.9
  @@ -70,13 +70,6 @@
    * @package mod_core private header file
    */
   
  -typedef struct ap_http_conn_rec ap_http_conn_rec;
  -
  -struct ap_http_conn_rec {
  -    /** How many times have we used it? */
  -    int keepalives;
  -};
  -
   /*
    * These (input) filters are internal to the mod_core operation.
    */
  @@ -98,8 +91,6 @@
    
   AP_DECLARE(int) ap_send_http_trace(request_rec *r);
   int ap_send_http_options(request_rec *r);
  -
  -AP_DECLARE_DATA extern module http_module;
   
   #ifdef __cplusplus
   }
  
  
  
  1.56      +0 -1      httpd-2.0/modules/loggers/mod_log_config.c
  
  Index: mod_log_config.c
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/modules/loggers/mod_log_config.c,v
  retrieving revision 1.55
  retrieving revision 1.56
  diff -u -r1.55 -r1.56
  --- mod_log_config.c	2001/04/20 17:59:05	1.55
  +++ mod_log_config.c	2001/04/21 12:23:37	1.56
  @@ -194,7 +194,6 @@
   #include "http_core.h"          /* For REMOTE_NAME */
   #include "http_log.h"
   #include "http_protocol.h"
  -#include "mod_core.h"
   
   #if APR_HAVE_UNISTD_H
   #include <unistd.h>
  
  
  

Mime
View raw message