coar 99/04/29 08:44:32
Modified: src CHANGES
src/modules/standard mod_usertrack.c
htdocs/manual/mod mod_usertrack.html
Log:
A minor but frequest request: allow Webmaster control over the
name of the tracking cookie.
PR: 2921, 4303
Revision Changes Path
1.1332 +3 -0 apache-1.3/src/CHANGES
Index: CHANGES
===================================================================
RCS file: /home/cvs/apache-1.3/src/CHANGES,v
retrieving revision 1.1331
retrieving revision 1.1332
diff -u -r1.1331 -r1.1332
--- CHANGES 1999/04/29 15:06:50 1.1331
+++ CHANGES 1999/04/29 15:44:28 1.1332
@@ -1,5 +1,8 @@
Changes with Apache 1.3.7
+ *) Add a directive to allow customising of the tracking cookie name.
+ [Ken Coar] PR#2921, 4303
+
*) Add "force-no-vary" envariable to allow servers to work around
clients that choke on "Vary" fields in the response header.
[Ken Coar] PR#4118
1.39 +53 -22 apache-1.3/src/modules/standard/mod_usertrack.c
Index: mod_usertrack.c
===================================================================
RCS file: /home/cvs/apache-1.3/src/modules/standard/mod_usertrack.c,v
retrieving revision 1.38
retrieving revision 1.39
diff -u -r1.38 -r1.39
--- mod_usertrack.c 1999/01/01 19:05:15 1.38
+++ mod_usertrack.c 1999/04/29 15:44:31 1.39
@@ -111,8 +111,13 @@
typedef struct {
int always;
time_t expires;
-} cookie_log_state;
+} cookie_log_state;
+typedef struct {
+ int enabled;
+ char *cookie_name;
+} cookie_dir_rec;
+
/* Define this to allow post-2000 cookies. Cookies use two-digit dates,
* so it might be dicey. (Netscape does it correctly, but others may not)
*/
@@ -121,12 +126,12 @@
/* Make Cookie: Now we have to generate something that is going to be
* pretty unique. We can base it on the pid, time, hostip */
-#define COOKIE_NAME "Apache="
+#define COOKIE_NAME "Apache"
static void make_cookie(request_rec *r)
{
cookie_log_state *cls = ap_get_module_config(r->server->module_config,
- &usertrack_module);
+ &usertrack_module);
#if defined(NO_GETTIMEOFDAY) && !defined(NO_TIMES)
clock_t mpe_times;
struct tms mpe_tms;
@@ -138,7 +143,10 @@
char cookiebuf[1024];
char *new_cookie;
const char *rname = ap_get_remote_host(r->connection, r->per_dir_config,
- REMOTE_NAME);
+ REMOTE_NAME);
+ cookie_dir_rec *dcfg;
+
+ dcfg = ap_get_module_config(r->per_dir_config, &usertrack_module);
#if defined(NO_GETTIMEOFDAY) && !defined(NO_TIMES)
/* We lack gettimeofday(), so we must use time() to obtain the epoch
@@ -147,7 +155,8 @@
mpe_times = times(&mpe_tms);
- ap_snprintf(cookiebuf, sizeof(cookiebuf), "%s.%d%ld%ld", rname, (int)
getpid(),
+ ap_snprintf(cookiebuf, sizeof(cookiebuf), "%s.%d%ld%ld", rname,
+ (int) getpid(),
(long) r->request_time, (long) mpe_tms.tms_utime);
#elif defined(WIN32)
/*
@@ -156,13 +165,15 @@
* was started. It should be relatively unique.
*/
- ap_snprintf(cookiebuf, sizeof(cookiebuf), "%s.%d%ld%ld", rname, (int)
getpid(),
+ ap_snprintf(cookiebuf, sizeof(cookiebuf), "%s.%d%ld%ld", rname,
+ (int) getpid(),
(long) r->request_time, (long) GetTickCount());
#else
gettimeofday(&tv, &tz);
- ap_snprintf(cookiebuf, sizeof(cookiebuf), "%s.%d%ld%d", rname, (int)
getpid(),
+ ap_snprintf(cookiebuf, sizeof(cookiebuf), "%s.%d%ld%d", rname,
+ (int) getpid(),
(long) tv.tv_sec, (int) tv.tv_usec / 1000);
#endif
@@ -184,14 +195,16 @@
/* Cookie with date; as strftime '%a, %d-%h-%y %H:%M:%S GMT' */
new_cookie = ap_psprintf(r->pool,
- "%s%s; path=/; expires=%s, %.2d-%s-%.2d %.2d:%.2d:%.2d GMT",
- COOKIE_NAME, cookiebuf, ap_day_snames[tms->tm_wday],
+ "%s=%s; path=/; expires=%s, %.2d-%s-%.2d %.2d:%.2d:%.2d GMT",
+ dcfg->cookie_name, cookiebuf,
ap_day_snames[tms->tm_wday],
tms->tm_mday, ap_month_snames[tms->tm_mon],
tms->tm_year % 100,
tms->tm_hour, tms->tm_min, tms->tm_sec);
}
- else
- new_cookie = ap_psprintf(r->pool, "%s%s; path=/", COOKIE_NAME,
cookiebuf);
+ else {
+ new_cookie = ap_psprintf(r->pool, "%s=%s; path=/",
+ dcfg->cookie_name, cookiebuf);
+ }
ap_table_setn(r->headers_out, "Set-Cookie", new_cookie);
ap_table_setn(r->notes, "cookie", ap_pstrdup(r->pool, cookiebuf)); /*
log first time */
@@ -200,19 +213,20 @@
static int spot_cookie(request_rec *r)
{
- int *enable = (int *) ap_get_module_config(r->per_dir_config,
- &usertrack_module);
+ cookie_dir_rec *dcfg = ap_get_module_config(r->per_dir_config,
+ &usertrack_module);
const char *cookie;
char *value;
- if (!*enable)
+ if (!dcfg->enabled) {
return DECLINED;
+ }
if ((cookie = ap_table_get(r->headers_in, "Cookie")))
- if ((value = strstr(cookie, COOKIE_NAME))) {
+ if ((value = strstr(cookie, dcfg->cookie_name))) {
char *cookiebuf, *cookieend;
- value += strlen(COOKIE_NAME);
+ value += strlen(dcfg->cookie_name) + 1; /* Skip over the '=' */
cookiebuf = ap_pstrdup(r->pool, value);
cookieend = strchr(cookiebuf, ';');
if (cookieend)
@@ -221,7 +235,7 @@
/* Set the cookie in a note, for logging */
ap_table_setn(r->notes, "cookie", cookiebuf);
- return DECLINED; /* Theres already a cookie, no new one */
+ return DECLINED; /* There's already a cookie, no new one */
}
make_cookie(r);
return OK; /* We set our cookie */
@@ -239,12 +253,19 @@
static void *make_cookie_dir(pool *p, char *d)
{
- return (void *) ap_pcalloc(p, sizeof(int));
+ cookie_dir_rec *dcfg;
+
+ dcfg = (cookie_dir_rec *) ap_pcalloc(p, sizeof(cookie_dir_rec));
+ dcfg->cookie_name = COOKIE_NAME;
+ dcfg->enabled = 0;
+ return dcfg;
}
-static const char *set_cookie_enable(cmd_parms *cmd, int *c, int arg)
+static const char *set_cookie_enable(cmd_parms *cmd, void *mconfig, int arg)
{
- *c = arg;
+ cookie_dir_rec *dcfg = mconfig;
+
+ dcfg->enabled = arg;
return NULL;
}
@@ -315,11 +336,21 @@
return NULL;
}
+static const char *set_cookie_name(cmd_parms *cmd, void *mconfig, char *name)
+{
+ cookie_dir_rec *dcfg = (cookie_dir_rec *) mconfig;
+
+ dcfg->cookie_name = ap_pstrdup(cmd->pool, name);
+ return NULL;
+}
+
static const command_rec cookie_log_cmds[] = {
{"CookieExpires", set_cookie_exp, NULL, RSRC_CONF, TAKE1,
- "an expiry date code"},
+ "an expiry date code"},
{"CookieTracking", set_cookie_enable, NULL, OR_FILEINFO, FLAG,
- "whether or not to enable cookies"},
+ "whether or not to enable cookies"},
+ {"CookieName", set_cookie_name, NULL, OR_FILEINFO, TAKE1,
+ "name of the tracking cookie"},
{NULL}
};
1.18 +41 -0 apache-1.3/htdocs/manual/mod/mod_usertrack.html
Index: mod_usertrack.html
===================================================================
RCS file: /home/cvs/apache-1.3/htdocs/manual/mod/mod_usertrack.html,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -r1.17 -r1.18
--- mod_usertrack.html 1998/07/01 06:52:32 1.17
+++ mod_usertrack.html 1999/04/29 15:44:32 1.18
@@ -47,6 +47,7 @@
<UL>
<LI><A HREF="#cookieexpires">CookieExpires</A>
+<LI><A HREF="#cookiename">CookieName</A>
<LI><A HREF="#cookietracking">CookieTracking</A>
</UL>
@@ -80,6 +81,46 @@
<P>If this directive is not used, cookies last only for the current
browser session.</P>
+
+<H2><A NAME="cookiename">CookieName</A></H2>
+<A
+ HREF="directive-dict.html#Syntax"
+ REL="Help"
+><STRONG>Syntax:</STRONG></A> CookieName <EM>token</EM>
+<BR>
+<A
+ HREF="directive-dict.html#Default"
+ REL="Help"
+><STRONG>Default:</STRONG></A> <EM>Apache</EM>
+<BR>
+<A
+ HREF="directive-dict.html#Context"
+ REL="Help"
+><STRONG>Context:</STRONG></A> server config, virtual host, directory,
+.htaccess<BR>
+<A
+ HREF="directive-dict.html#Status"
+ REL="Help"
+><STRONG>Status:</STRONG></A> optional<BR>
+<A
+ HREF="directive-dict.html#Module"
+ REL="Help"
+><STRONG>Module:</STRONG></A> mod_usertrack
+<BR>
+<A
+ HREF="directive-dict.html#Compatibility"
+ REL="Help"
+><STRONG>Compatibility:</STRONG></A> Apache 1.3.7 and later
+<P>
+This directive allows you to change the name of the cookie this module
+uses for its tracking purposes. By default the cookie is named
+"<CODE>Apache</CODE>".
+</P>
+<P>
+You must specify a valid cookie name; results are unpredictable if
+you use a name containing unusual characters. Valid characters
+include A-Z, a-z, 0-9, "_", and "-".
+</P>
<H2><A NAME="cookietracking">CookieTracking</A></H2>
<A