--- squid-2.6.STABLE18/src/http.c.orig	2007-11-26 06:04:30.000000000 -0500
+++ squid-2.6.STABLE18/src/http.c	2008-01-11 09:48:42.252702122 -0500
@@ -367,17 +367,6 @@
 	char *name = xmalloc(ilen + 1);
 	xstrncpy(name, item, ilen + 1);
 	Tolower(name);
-	if (strcmp(name, "accept-encoding") == 0) {
-	    aclCheck_t checklist;
-	    memset(&checklist, 0, sizeof(checklist));
-	    checklist.request = request;
-	    checklist.reply = reply;
-	    if (Config.accessList.vary_encoding && aclCheckFast(Config.accessList.vary_encoding, &checklist)) {
-		stringClean(&request->vary_encoding);
-		request->vary_encoding = httpHeaderGetStrOrList(&request->header, HDR_ACCEPT_ENCODING);
-		strCat(request->vary_encoding, "");
-	    }
-	}
 	if (strcmp(name, "*") == 0) {
 	    /* Can not handle "Vary: *" efficiently, bail out making the response not cached */
 	    safe_free(name);
@@ -386,15 +375,39 @@
 	    break;
 	}
 	strListAdd(&vstr, name, ',');
-	hdr = httpHeaderGetByName(&request->header, name);
-	safe_free(name);
-	value = strBuf(hdr);
-	if (value) {
-	    value = rfc1738_escape_part(value);
-	    stringAppend(&vstr, "=\"", 2);
-	    stringAppend(&vstr, value, strlen(value));
-	    stringAppend(&vstr, "\"", 1);
+	if (strcmp(name, "accept-encoding") == 0) {
+	    aclCheck_t checklist;
+	    memset(&checklist, 0, sizeof(checklist));
+	    checklist.request = request;
+	    checklist.reply = reply;
+	    
+	    hdr = httpHeaderGetStrOrList(&request->header, HDR_ACCEPT_ENCODING);
+	    strCat(hdr, "");
+	    
+	    String vary_encoding;
+	    if (strstr(strBuf(hdr), "gzip")) {
+		stringAppend(&vstr, "=\"", 2);
+		stringAppend(&vstr, "gzip", 4);
+		stringAppend(&vstr, "\"", 1);
+		stringInit(&vary_encoding, "gzip");
+	    } else {
+		stringInit(&vary_encoding, "");
+	    }
+	    if (Config.accessList.vary_encoding && aclCheckFast(Config.accessList.vary_encoding, &checklist)) {
+		stringReset(&request->vary_encoding, strBuf(vary_encoding));
+	    }
+	    stringClean(&vary_encoding);
+	} else {
+	    hdr = httpHeaderGetByName(&request->header, name);
+	    value = strBuf(hdr);
+	    if (value) {
+		value = rfc1738_escape_part(value);
+		stringAppend(&vstr, "=\"", 2);
+		stringAppend(&vstr, value, strlen(value));
+		stringAppend(&vstr, "\"", 1);
+	    }
 	}
+	safe_free(name);
 	stringClean(&hdr);
     }
     safe_free(request->vary_hdr);
@@ -1168,6 +1181,11 @@
 	    if (!opt_forwarded_for)
 		httpHeaderAddEntry(hdr_out, httpHeaderEntryClone(e));
 	    break;
+	case HDR_ACCEPT_ENCODING:
+	    /* Strip everything other encoding, except gzip. x-gzip is equivalent of gzip */
+	    if (strstr(strBuf(e->value),"gzip"))
+		 httpHeaderPutStr(hdr_out, HDR_ACCEPT_ENCODING, "gzip");
+	    break;
 	case HDR_RANGE:
 	case HDR_IF_RANGE:
 	case HDR_REQUEST_RANGE:
