=== modified file 'src/esi/VarState.cc'
--- src/esi/VarState.cc	2012-11-19 11:29:31 +0000
+++ src/esi/VarState.cc	2013-03-21 13:53:47 +0000
@@ -857,35 +857,50 @@
     delete currentFunction;
 }
 
-/* XXX FIXME: this should be comma delimited, no? */
 void
-ESIVarState::buildVary (HttpReply *rep)
+ESIVarState::buildVary(HttpReply *rep)
 {
+    /* TODO: use Key header modifiers.
+     * which will mean the eval() function above need to record what
+     * was scanned for in each of these replies.
+     * For now we generate it taking advantage of the modifiers being
+     * optional such that we can use identical Vary and Key headers.
+     */
     char tempstr[1024];
     tempstr[0]='\0';
 
     if (flags.language)
-        strcat (tempstr, "Accept-Language ");
+        strcat(tempstr, ",Accept-Language");
 
     if (flags.cookie)
-        strcat (tempstr, "Cookie ");
+        strcat(tempstr, ",Cookie");
 
     if (flags.host)
-        strcat (tempstr, "Host ");
+        strcat(tempstr, ",Host");
 
     if (flags.referer)
-        strcat (tempstr, "Referer ");
+        strcat(tempstr, ",Referer");
 
     if (flags.useragent)
-        strcat (tempstr, "User-Agent ");
+        strcat(tempstr, ",User-Agent");
 
     if (!tempstr[0])
         return;
 
-    String strVary (rep->header.getList (HDR_VARY));
-
-    if (!strVary.size() || strVary[0] != '*') {
-        rep->header.putStr (HDR_VARY, tempstr);
+    const String strVary(rep->header.getList(HDR_VARY));
+
+    // Vary:* overrides everything including Key:
+    if (strVary.size()>0 && strVary[0] == '*')
+        return;
+
+    const String strKey(rep->header.getList(HDR_KEY));
+    if (strKey.size() == 0 && strVary.size() > 0) {
+        // protect the pre-existing Vary details by upgrading into Key values
+        // unless there is already a Key: supplied.
+        rep->header.putStr(HDR_KEY, strVary.termedBuf());
     }
+
+    // append the above tempstr list to both Vary: and Key:
+    rep->header.putStr(HDR_VARY, &tempstr[1]);
+    rep->header.putStr(HDR_KEY, &tempstr[1]);
 }
-


