=== 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]); } -