summaryrefslogtreecommitdiffstats
path: root/src/functions20.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/functions20.h')
-rw-r--r--src/functions20.h116
1 files changed, 116 insertions, 0 deletions
diff --git a/src/functions20.h b/src/functions20.h
new file mode 100644
index 0000000..5220b7c
--- /dev/null
+++ b/src/functions20.h
@@ -0,0 +1,116 @@
1/* $Id$ */
2
3static const char *extract_bytes_sent(request_rec *r, char *a)
4{
5 if (!r->sent_bodyct || !r->bytes_sent) {
6 return "-";
7 } else {
8 return apr_psprintf(r->pool, "%" APR_OFF_T_FMT, r->bytes_sent);
9 }
10}
11
12static const char *extract_request_time_custom(request_rec *r, char *a,
13 apr_time_exp_t *xt)
14{
15 apr_size_t retcode;
16 char tstr[MAX_STRING_LEN];
17 apr_strftime(tstr, &retcode, sizeof(tstr), a, xt);
18 return apr_pstrdup(r->pool, tstr);
19}
20
21#define DEFAULT_REQUEST_TIME_SIZE 32
22typedef struct {
23 unsigned t;
24 char timestr[DEFAULT_REQUEST_TIME_SIZE];
25 unsigned t_validate;
26} cached_request_time;
27
28#define TIME_CACHE_SIZE 4
29#define TIME_CACHE_MASK 3
30static cached_request_time request_time_cache[TIME_CACHE_SIZE];
31
32static const char *extract_request_time(request_rec *r, char *a)
33{
34 apr_time_exp_t xt;
35
36 /* Please read comments in mod_log_config.h for more info about
37 * the I_INSIST....COMPLIANCE define
38 */
39 if (a && *a) { /* Custom format */
40#ifdef I_INSIST_ON_EXTRA_CYCLES_FOR_CLF_COMPLIANCE
41 ap_explode_recent_localtime(&xt, apr_time_now());
42#else
43 ap_explode_recent_localtime(&xt, r->request_time);
44#endif
45 return extract_request_time_custom(r, a, &xt);
46 } else { /* CLF format */
47 /* This code uses the same technique as ap_explode_recent_localtime():
48 * optimistic caching with logic to detect and correct race conditions.
49 * See the comments in server/util_time.c for more information.
50 */
51 cached_request_time* cached_time = apr_palloc(r->pool,
52 sizeof(*cached_time));
53#ifdef I_INSIST_ON_EXTRA_CYCLES_FOR_CLF_COMPLIANCE
54 apr_time_t request_time = apr_time_now();
55#else
56 apr_time_t request_time = r->request_time;
57#endif
58 unsigned t_seconds = (unsigned)apr_time_sec(request_time);
59 unsigned i = t_seconds & TIME_CACHE_MASK;
60 memcpy(cached_time, &(request_time_cache[i]), sizeof(*cached_time));
61 if ((t_seconds != cached_time->t) ||
62 (t_seconds != cached_time->t_validate)) {
63
64 /* Invalid or old snapshot, so compute the proper time string
65 * and store it in the cache
66 */
67 char sign;
68 int timz;
69
70 ap_explode_recent_localtime(&xt, r->request_time);
71 timz = xt.tm_gmtoff;
72 if (timz < 0) {
73 timz = -timz;
74 sign = '-';
75 }
76 else {
77 sign = '+';
78 }
79 cached_time->t = t_seconds;
80 apr_snprintf(cached_time->timestr, DEFAULT_REQUEST_TIME_SIZE,
81 "[%02d/%s/%d:%02d:%02d:%02d %c%.2d%.2d]",
82 xt.tm_mday, apr_month_snames[xt.tm_mon],
83 xt.tm_year+1900, xt.tm_hour, xt.tm_min, xt.tm_sec,
84 sign, timz / (60*60), timz % (60*60));
85 cached_time->t_validate = t_seconds;
86 memcpy(&(request_time_cache[i]), cached_time,
87 sizeof(*cached_time));
88 }
89 return cached_time->timestr;
90 }
91}
92
93static const char *extract_request_duration(request_rec *r, char *a)
94{
95 apr_time_t duration = apr_time_now() - r->request_time;
96 return apr_psprintf(r->pool, "%" APR_TIME_T_FMT, apr_time_sec(duration));
97}
98
99static const char *extract_request_timestamp(request_rec *r, char *a)
100{
101 return apr_psprintf(r->pool, "%"APR_TIME_T_FMT, apr_time_sec(apr_time_now()));
102}
103
104static const char *extract_connection_status(request_rec *r, char *a) __attribute__((unused));
105static const char *extract_connection_status(request_rec *r, char *a)
106{
107 if (r->connection->aborted)
108 return "X";
109
110 if (r->connection->keepalive == AP_CONN_KEEPALIVE &&
111 (!r->server->keep_alive_max ||
112 (r->server->keep_alive_max - r->connection->keepalives) > 0)) {
113 return "+";
114 }
115 return "-";
116}