You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@httpd.apache.org by Jason Burns/DHD <ja...@danni.com> on 2001/08/23 00:03:32 UTC
[PATCH] to allow computation of time_connected and bytes_per_second
We recently made some small additions to apache_1.3.20 in order to
support new server modules we have developed. Although these additions
were originally made for our own use, we feel that they provide vital
services that may be useful for others developing similar modules.
These additions are small and are limited to two source files,
scoreboard.h and http_main.c. Provided in the remainder of this document
is a description of the changes we have made in each file.
1. Changes to scoreboard.h
We have added two fields to the short_score structure. These fields are
connect_time and original_client. A description of these fields is
provided below.
1.1 connect_time ? This field contains the time at which the client
application connected to the httpd process.
Knowing the current time and the time of the connection allows us to
calculate how long a client has been connected to the httpd process.
This information is useful in modules that must know the duration of
the connection in order to perform rate calculations.
Example:
To compute the rate at which data has been served to a client:
time_connected = time_now ? connect_time
bytes_per_second = bytes_served / time_connected
1.2 original_client ? For connections made through proxy servers this
field contains the identity of the original client. This information is
extracted directly from the X-Forwarded-For field in the HTTP header.
This field distinguishes individual clients connecting through a
common proxy server. This field, along with the existing client
field, allows us to quickly and accurately scan the scoreboard and
determine how many connections exist for any unique client.
--- scoreboard-old.h Wed Aug 22 14:48:47 2001
+++ scoreboard.h Wed Aug 22 14:49:41 2001
@@ -151,6 +151,14 @@
struct timeval start_time;
struct timeval stop_time;
#endif
+
+#if defined(NO_GETTIMEOFDAY)
+ clock_t connect_time;
+#else
+ struct timeval connect_time;
+#endif
+ char original_client[32]; /* Client behind proxy */
+
#ifndef NO_TIMES
struct tms times;
#endif
2. Changes to http_main.c
In order to support the additions we have made to the short_score
structure we have also made small additions to the
ap_update_child_status function in the http_main.c file. These
additions update the new fields in the short_score structure when a new
connection is made or an existing connection is broken.
As a brief summary, when a new connection is made the time of the
connection and, if applicable, the X-Forwarded-For data are recorded in
the connect_time and original_client fields of the scoreboard. When a
connection is dropped these fields are cleared.
The modified ap_update_child_status function is shown below.
--- http_main-old.c Wed Aug 22 14:48:14 2001
+++ http_main.c Wed Aug 22 14:53:43 2001
@@ -2240,6 +2240,11 @@
int old_status;
short_score *ss;
+ const char *address; /* Forwarded address */
+#if defined(NO_GETTIMEOFDAY) && !defined(NO_TIMES)
+ struct tms tms_blk;
+#endif
+
if (child_num < 0)
return -1;
@@ -2271,11 +2276,44 @@
}
ss->conn_count = (unsigned short) 0;
ss->conn_bytes = (unsigned long) 0;
- }
+
+#if defined(NO_GETTIMEOFDAY)
+ ss->connect_time = (clock_t)0;
+#else
+ ss->connect_time.tv_sec = 0L;
+ ss->connect_time.tv_usec = 0L;
+#endif
+ } else {
+ if (status == SERVER_BUSY_READ) {
+#if defined(NO_GETTIMEOFDAY)
+#ifndef NO_TIMES
+ if ((ss->connect_time = times(&tms_blk)) == -1)
+#endif
+ ss->connect_time = (clock_t)0;
+#else
+ if (gettimeofday(&(ss->connect_time),
+ (struct timezone *)0) < 0) {
+ ss->connect_time.tv_sec = 0L;
+ ss->connect_time.tv_usec = 0L;
+ }
+#endif
+ }
+ }
+
if (r) {
conn_rec *c = r->connection;
ap_cpystrn(ss->client, ap_get_remote_host(c,
r->per_dir_config,
REMOTE_NOLOOKUP),
sizeof(ss->client));
+
+ address = ap_table_get(r->headers_in, "X-Forwarded-For");
+ if (address == 0) { /* Not set? */
+ ap_cpystrn(ss->original_client, "",
sizeof(ss->original_client));
+ } else {
+ ap_cpystrn(ss->original_client, /* Copy converted name */
+ address,
+ sizeof(ss->original_client));
+ }
+
if (r->the_request == NULL) {
ap_cpystrn(ss->request, "NULL",
sizeof(ss->request));
} else if (r->parsed_uri.password == NULL) {
---
Jason Burns
Director of Technology
Danni's Hard Drive