pcs 98/12/04 09:37:14
Modified: htdocs/manual content-negotiation.html
src CHANGES
src/modules/standard mod_negotiation.c
Log:
Fix negotiation so that we prefer an encoded variant over an unencoded
variant if the user-agent explicitly says it can accept that encoding.
Previously we always preferred the unencoded variant.
PR: 3447
Submitted by: Paul Ausbeck <[EMAIL PROTECTED]>
Reviewed by: Paul Sutton
Revision Changes Path
1.19 +6 -3 apache-1.3/htdocs/manual/content-negotiation.html
Index: content-negotiation.html
===================================================================
RCS file: /export/home/cvs/apache-1.3/htdocs/manual/content-negotiation.html,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -r1.18 -r1.19
--- content-negotiation.html 1998/09/17 14:14:47 1.18
+++ content-negotiation.html 1998/12/04 17:37:06 1.19
@@ -301,9 +301,12 @@
<LI>Select the variants with the highest 'level' media parameter
(used to give the version of text/html media types).
-<LI>Select only unencoded variants, if there is a mix of encoded
- and non-encoded variants. If either all variants are encoded
- or all variants are not encoded, select all.
+<LI>Select the variants with the best encoding. If there are
+ variants with an encoding that is acceptable to the user-agent,
+ select only these variants. Otherwise if there is a mix of encoded
+ and non-encoded variants, select only the unencoded variants.
+ If either all variants are encoded or all variants are not encoded,
+ select all variants.
<LI>Select only variants with acceptable charset media parameters,
as given on the Accept-Charset header line. Charset ISO-8859-1
1.1160 +6 -0 apache-1.3/src/CHANGES
Index: CHANGES
===================================================================
RCS file: /export/home/cvs/apache-1.3/src/CHANGES,v
retrieving revision 1.1159
retrieving revision 1.1160
diff -u -r1.1159 -r1.1160
--- CHANGES 1998/12/02 19:24:46 1.1159
+++ CHANGES 1998/12/04 17:37:09 1.1160
@@ -1,4 +1,10 @@
Changes with Apache 1.3.4
+
+ *) Fix negotiation so that we prefer an encoded variant over an
+ unencoded variant if the user-agent explicitly says it can
+ accept that encoding. Previously we always preferred the unencoded
+ variant.
+ [Paul Ausbeck <[EMAIL PROTECTED]>, Paul Sutton] PR#3447
*) Fix APXS tool: query variables LIBS_SHLIB and TARGET were not recognized
and the usage page was inconsistent with the functionality and manpage.
1.86 +39 -4 apache-1.3/src/modules/standard/mod_negotiation.c
Index: mod_negotiation.c
===================================================================
RCS file: /export/home/cvs/apache-1.3/src/modules/standard/mod_negotiation.c,v
retrieving revision 1.85
retrieving revision 1.86
diff -u -r1.85 -r1.86
--- mod_negotiation.c 1998/11/23 09:56:38 1.85
+++ mod_negotiation.c 1998/12/04 17:37:12 1.86
@@ -1454,6 +1454,33 @@
|| !strcmp(enc, "binary"));
}
+/*
+ * set_encoding_quality determines whether the encoding for a particular
+ * variant is acceptable for the user-agent. There are no q-values on
+ * encodings, so this is set as an integer value variant->encoding_quality.
+ *
+ * The rules for encoding are that if the user-agent does not supply
+ * any Accept-Encoding header, then all encodings are allowed. If
+ * there is an empty Accept-Encoding header, then no encodings are
+ * acceptable. If there is a non-empty Accept-Encoding header, then
+ * any of the listed encodings are acceptable, as well as no encoding.
+ *
+ * In the later case, we assume that it is preferable to return a
+ * suitable encoded variant in preference to an unencoded variant.
+ *
+ * The variant with the higher value should be prefered over variants
+ * with lower values. The values used are 0 if this variant is
+ * unacceptable (if it is encoded but the user-agent does not accept
+ * this encoding or any encodings), 1 if this variant is acceptable to
+ * the user-agent either because this variant is unencoded or the
+ * user-agent does not give an Accept-Encoding header, or 2 if this
+ * variant is encoding and the user-agent specifically asks for this
+ * encoding on its Accept-Encoding header. The effect of this is to
+ * prefer encoded variants when they user-agent explicitly says that
+ * the encoding is acceptable, otherwise encoded and unencoded
+ * variants get the same encoding_quality.
+ */
+
static void set_encoding_quality(negotiation_state *neg, var_rec *variant)
{
int i;
@@ -1487,7 +1514,7 @@
}
if (!strcmp(name, enc)) {
- variant->encoding_quality = 1;
+ variant->encoding_quality = 2;
return;
}
}
@@ -1666,10 +1693,18 @@
*p_bestq = q;
return 1;
}
+
+ /* Prefer the highest value for encoding_quality. If they are
+ * equal, prefer the variant without any encoding.
+ */
+ if (variant->encoding_quality < best->encoding_quality) {
+ return 0;
+ }
+ if (variant->encoding_quality > best->encoding_quality) {
+ *p_bestq = q;
+ return 1;
+ }
- /* encoding -- can only be 1 or 0, and if 0 we eliminated this
- * variant at the start of this function. However we
- * prefer variants with no encoding over those with encoding */
if (best->content_encoding == NULL && variant->content_encoding) {
return 0;
}