/[suikacvs]/webroot/www/2004/id/draft-holtman-http-negotiation-02.txt
Suika

Contents of /webroot/www/2004/id/draft-holtman-http-negotiation-02.txt

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1 - (hide annotations) (download)
Tue Jun 15 08:04:04 2004 UTC (20 years, 10 months ago) by wakaba
Branch: MAIN
CVS Tags: HEAD
File MIME type: text/plain
New

1 wakaba 1.1 Internet-Draft Koen Holtman/TUE
2     Expires: February 14, 1997 August 14, 1996
3    
4    
5     Transparent Content Negotiation in HTTP
6    
7     draft-holtman-http-negotiation-02.txt
8    
9    
10     STATUS OF THIS MEMO
11    
12    
13     This document is an Internet-Draft. Internet-Drafts are
14     working documents of the Internet Engineering Task Force
15     (IETF), its areas, and its working groups. Note that other
16     groups may also distribute working documents as
17     Internet-Drafts.
18    
19     Internet-Drafts are draft documents valid for a maximum of
20     six months and may be updated, replaced, or obsoleted by
21     other documents at any time. It is inappropriate to use
22     Internet-Drafts as reference material or to cite them other
23     than as "work in progress".
24    
25     To learn the current status of any Internet-Draft, please
26     check the "1id-abstracts.txt" listing contained in the
27     Internet-Drafts Shadow Directories on ftp.is.co.za
28     (Africa), nic.nordu.net (Europe), munnari.oz.au (Pacific
29     Rim), ds.internic.net (US East Coast), or ftp.isi.edu (US
30     West Coast).
31    
32     Distribution of this document is unlimited. Please send
33     comments to the HTTP working group at
34     <http-wg@cuckoo.hpl.hp.com>. Discussions of the working
35     group are archived at
36     <URL:http://www.ics.uci.edu/pub/ietf/http/>. General
37     discussions about HTTP and the applications which use HTTP
38     should take place on the <www-talk@w3.org> mailing list.
39    
40    
41     ABSTRACT
42    
43     HTTP allows one to put multiple versions of the same
44     information under a single URL. Transparent content
45     negotiation is a mechanism, layered on top of HTTP, for
46     automatically selecting the best version when the URL is
47     accessed. This enables the smooth deployment of new web data
48     formats and markup tags.
49    
50     Design goals for transparent content negotiation include low
51     overhead on the request message size, downwards compatibility,
52     extensibility, enabling the rapid introduction of new areas of
53     negotiation, scalability, low cost of minimal support, end
54     user control, and good cachability.
55    
56    
57     TABLE OF CONTENTS
58    
59     1 Introduction
60     1.1 Background
61     1.2 Note for readers
62    
63     2 Terminology
64     2.1 Terms from HTTP/1.1
65     2.2 New terms
66    
67     3 Notation
68    
69     4 Overview
70     4.1 Content negotiation
71     4.2 HTTP/1.0 style negotiation scheme
72     4.3 Transparent content negotiation scheme
73     4.4 Optimizing the negotiation process
74     4.5 Retrieving a variant by hand
75     4.6 Dimensions of negotiation
76     4.7 Feature negotiation
77    
78     5 Variant descriptions
79     5.1 Syntax
80     5.2 URI
81     5.3 Source-quality
82     5.4 Type, language, length, and charset.
83     5.5 Features
84     5.6 Description
85     5.7 Extension-attribute
86    
87     6 Feature negotiation
88     6.1 Feature tags
89     6.2 Accept-Features header
90     6.3 Feature predicates
91     6.4 Features attribute
92    
93     7 Feature negotiation examples
94     7.1 Use of feature tags
95     7.2 Use of numeric feature tags
96    
97     8 Feature tag registration
98     8.1 Evolution of feature tags
99     8.2 Core set of feature tags
100     8.3 Feature tag design
101    
102     9 Content negotiation response codes and headers
103     9.1 506 Variant Also Negotiates
104     9.2 Accept-Features
105     9.3 Content-Features
106     9.4 Alternates
107     9.5 Alternates-Older
108     9.6 Negotiate
109     9.7 Variant-Vary
110    
111     10 Content negotiation responses
112     10.1 List response
113     10.2 Choice response
114     10.2.1 Construction by origin servers
115     10.2.2 Construction by proxies
116     10.3 Reusing the Alternates header
117     10.4 Extracting a normal response from a choice response
118     10.5 Elaborate Vary headers
119     10.5.1 Construction of an elaborate Vary header
120     10.5.2 Caching of an elaborate Vary header
121    
122     11 The network negotiation algorithm
123     11.1 Input
124     11.2 Output
125     11.2.1 Output for proxies
126     11.2.2 Output for origin servers
127     11.2.3 Output for user agents
128     11.3 Computing the overall quality values
129     11.4 Definite and speculative quality values
130     11.5 Determining the result
131     11.5.1 Result for proxies and origin servers
132     11.5.2 Result for user agents
133     11.6 Construction of short requests
134    
135     12 User agent support for transparent negotiation
136     12.1 Handling of responses
137     12.2 Presentation of a transparently negotiated resource
138    
139     13 Origin server support for transparent negotiation
140     13.1 Requirements
141     13.2 Negotiation on transactions other than GET and HEAD
142    
143     14 Proxy support for transparent negotiation
144    
145     15 Security and privacy considerations
146     15.1 Accept headers revealing information of a private nature
147     15.2 Spoofing of responses from variant resources
148    
149     16 Acknowledgments
150    
151     17 References
152    
153     18 Author's address
154    
155     19 Appendices
156     19.1 Adding an Expires header to ensure HTTP/1.0 compatibility
157     19.2 Origin server implementation considerations
158     19.2.1 Implementation with a CGI script
159     19.2.2 Direct support by the HTTP server
160     19.2.3 Negotiable content authoring
161     19.3 Open issues in transparent content negotiation
162     19.4 Other negotiation specifications
163     19.4.1 User-Agent Display Attributes Headers
164     19.4.2 PEP: An Extension Mechanism for HTTP/1.1
165     19.5 Related issues
166     19.5.1 Current negotiation practice
167     19.5.2 Bandwidth negotiation
168     19.5.3 Content transformation by proxies
169    
170    
171     1 Introduction
172    
173     HTTP allows one to put multiple versions of the same
174     information under a single URI. Each of these versions is called a
175     `variant'. Transparent content negotiation is a mechanism, layered
176     on top of the HTTP/1.1 protocol [1], for automatically and
177     efficiently retrieving the best variant when a GET or HEAD request
178     is made. This enables the smooth deployment of new web data
179     formats and markup tags.
180    
181     Transparent negotiation is called `transparent' because it makes
182     all variants inside the origin server visible to outside parties.
183    
184    
185     1.1 Background
186    
187     The addition of content negotiation to the web infrastructure has
188     been considered important since the early days of the web. Among
189     the expected benefits of a sufficiently powerful system for content
190     negotiation are
191    
192     * smooth deployment of new data formats and markup tags,
193     allowing graceful evolution of the web
194    
195     * elimination of the need to choose between a `state of the art
196     multimedia homepage' and one which can be viewed by all web
197     users
198    
199     * ability to offer good service to a wider range of browsing
200     platforms (from low-end PDA's to high-end VR setups)
201    
202     * elimination of the need for error-prone and cache-unfriendly
203     User-Agent based negotiation
204    
205     * ability to construct sites without `click here for the X
206     version' links
207    
208     * internationalization, and the ability to offer multi-lingual
209     content without a bias towards one language.
210    
211     Nevertheless, the development of content negotiation has been a
212     slow process, maybe because the expected benefits are mostly
213     long-term benefits. Also, all immediately obvious content
214     negotiation solutions involve the sending of larger HTTP request
215     messages. Larger request messages are unacceptable to many people:
216     a small overhead on the request size is often cited as the main
217     technical requirement for any scheme which offers the above
218     benefits.
219    
220     Therefore, a low overhead on the request message size is one of the
221     main design goals of this specification; a large fraction of the
222     text below is devoted to the definition of mechanisms for meeting
223     this design goal. The desire to provide for good cachability in
224     all cases accounts for another considerable part of the size of
225     this document.
226    
227     Other design goals include downwards compatibility, extensibility,
228     enabling the rapid introduction of new areas of negotiation,
229     scalability, low cost of minimal support, and end user control.
230     End user control, the option to manually retrieve other variants if
231     desired, is the one redeeming quality of the `click here for the X
232     version' type of negotiation, and it is considered important that
233     this option is preserved.
234    
235    
236     1.2 Note for readers
237    
238     Some sections in this document discuss requirements for proxy
239     caches only. Implementers of origin servers and user agents (but
240     not implementers of user agent caches) can skip these sections.
241     The sections which can be skipped are:
242    
243     9.5 Alternates-Older
244     9.7 Variant-Vary
245     10.2.2 Choice response construction by proxies
246     10.3 Reusing the Alternates header
247     10.4 Extracting a normal response from a choice response
248     10.5.2 Caching of an elaborate Vary header
249     14 Proxy support for transparent negotiation
250    
251     The skipping of these sections is also recommended on first
252     reading.
253    
254    
255     2 Terminology
256    
257     2.1 Terms from HTTP/1.1
258    
259     This specification mostly uses the terminology of the HTTP/1.1
260     specification [1]. The definitions below were reproduced from [1].
261    
262     request
263     An HTTP request message.
264    
265     response
266     An HTTP response message.
267    
268     resource
269     A network data object or service that can be identified by a URI.
270     Resources may be available in multiple representations
271     (e.g. multiple languages, data formats, size, resolutions) or
272     vary in other ways.
273    
274     content negotiation
275     The mechanism for selecting the appropriate representation when
276     servicing a request.
277    
278     variant
279     A resource may have one, or more than one, representation(s)
280     associated with it at any given instant. Each of these
281     representations is termed a `variant.' Use of the term `variant'
282     does not necessarily imply that the resource is subject to
283     content negotiation.
284    
285     client
286     A program that establishes connections for the purpose of sending
287     requests.
288    
289     user agent
290     The client which initiates a request. These are often browsers,
291     editors, spiders (web-traversing robots), or other end user
292     tools.
293    
294     server
295     An application program that accepts connections in order to
296     service requests by sending back responses. Any given program may
297     be capable of being both a client and a server; our use of these
298     terms refers only to the role being performed by the program for
299     a particular connection, rather than to the program's
300     capabilities in general. Likewise, any server may act as an
301     origin server, proxy, gateway, or tunnel, switching behavior
302     based on the nature of each request.
303    
304     origin server
305     The server on which a given resource resides or is to be created.
306    
307     proxy
308     An intermediary program which acts as both a server and a client
309     for the purpose of making requests on behalf of other
310     clients. Requests are serviced internally or by passing them on,
311     with possible translation, to other servers. A proxy must
312     implement both the client and server requirements of this
313     specification.
314    
315     first-hand
316     A response is first-hand if it comes directly and without
317     unnecessary delay from the origin server, perhaps via one or more
318     proxies. A response is also first-hand if its validity has just
319     been checked directly with the origin server.
320    
321     age
322     The age of a response is the time since it was sent by, or
323     successfully validated with, the origin server.
324    
325     fresh
326     A response is fresh if its age has not yet exceeded its freshness
327     lifetime.
328    
329     2.2 New terms
330    
331     transparently negotiable resource
332     A resource which supports transparent content negotiation. A
333     transparently negotiable resource always has a variant list bound
334     to it, usually represented as an Alternates header.
335    
336     variant list
337     The list of variants bound to a transparently negotiable
338     resource.
339    
340     variant description
341     A machine-readable description of a variant, usually found in a
342     variant list. A variant description contains the variant
343     resource URI and various attributes which describe properties of
344     the variant. Variant descriptions are defined in Section 5.
345    
346     variant resource
347     A resource from which a variant of a negotiable resource can be
348     retrieved with a simple GET request.
349    
350     list response
351     A list response contains the variant list of the negotiable
352     resource, but no variant data. It is generated if the sever
353     cannot or does not want to choose a particular best variant for
354     the request. List responses are defined in Section 10.1.
355    
356     choice response
357     A choice response contains both the variant list of the
358     negotiable resource, and a representation of the best variant for
359     the request. Choice responses are defined in Section 10.2.
360    
361     normal response
362     A HTTP response which is not a list response or a choice
363     response. Normal responses are never generated by transparently
364     negotiable resources, and are always generated by variant
365     resources.
366    
367     Accept headers
368     The request headers Accept, Accept-Charset, Accept-Language, and
369     Accept-Features.
370    
371     network negotiation algorithm
372     A standardized algorithm by which a party in the negotiation
373     process can choose a best variant on behalf of another party.
374     The algorithm computes if the Accept headers in the request
375     contain sufficient information to allow a choice, and, if so,
376     which variant must be chosen. The network negotiation algorithm
377     is defined in Section 11.
378    
379     neighbor
380     Two resources are called neighbors if the absolute URI of the
381     first resource up to its last slash equals the absolute URI of
382     the second resource up to its last slash. The neighboring
383     relation is important because of security considerations, see
384     Section 15.2.
385    
386     [##Historical note: In the context of old versions of the HTTP/1.1
387     specification like [2], list responses can be called `pre-emptive
388     negotiation responses', and choice responses can be called
389     `reactive negotiation responses'.##]
390    
391     [##Note: In the context of the HTTP/1.1 specification [1], both
392     list and choice responses are the result of server-driven
393     negotiation, though a list response is a server-driven negotiation
394     response meant to initiate agent-driven negotiation.##]
395    
396    
397     3 Notation
398    
399     The notation [## ... ##] in this document encloses an editorial
400     comment. Such a comment will be either removed or replaced by real
401     text in the final version of this document.
402    
403     The version of BNF used in this document is taken from [1], and
404     many of the nonterminals used are defined in [1].
405    
406     One new BNF construct is added:
407    
408     1%rule
409    
410     stands for one or more instances of "rule", separated by
411     whitespace:
412    
413     1%rule = rule *( 1*LWS rule )
414    
415    
416     4 Overview
417    
418     This section gives an overview of transparent content negotiation.
419     It starts with a more general discussion of negotiation as provided
420     by HTTP.
421    
422    
423     4.1 Content negotiation
424    
425     HTTP/1.1 allows one to put multiple versions of the same
426     information under a single resource URI. Each of these versions is
427     called a `variant'. For example, a resource http://x.org/paper
428     could bind to three different variants of a paper:
429    
430     1. HTML, English
431     2. HTML, French
432     3. Postscript, English
433    
434     Content negotiation is the process by which the best variant is
435     selected if the resource is accessed. The selection is done by
436     matching the properties of the available variants to the
437     capabilities of the user agent and the preferences of the user.
438    
439     It has always been possible under HTTP to have multiple
440     representations available for one resource, and to return the most
441     appropriate representation for each subsequent request. However,
442     HTTP/1.1 is the first version of HTTP which has provisions for
443     doing this in a cache-friendly way. These provisions include the
444     Vary response header, entity tags, and the If-None-Match request
445     header.
446    
447    
448     4.2 HTTP/1.0 style negotiation scheme
449    
450     The HTTP/1.0 protocol elements allow for a negotiation scheme as
451     follows:
452    
453     Server _____ proxy _____ proxy _____ user
454     x.org cache cache agent
455    
456     < ----------------------------------
457     | GET http://x.org/paper
458     | Accept headers
459     choose
460     |
461     ---------------------------------- >
462     Best variant
463    
464     When the resource is accessed, the user agent sends, along with its
465     request, various Accept headers which express the user agent
466     capabilities and the user preferences. Then, the origin server
467     uses these Accept headers to choose the best variant, which is
468     returned in the response.
469    
470     The biggest problem with this scheme is that it does not scale
471     well. For all but the most minimal user agents, Accept headers
472     expressing all capabilities and preferences would be very large,
473     and sending them in every request would be hugely inefficient, in
474     particular because only a small fraction of the resources on the
475     web will have multiple variants.
476    
477    
478     4.3 Transparent content negotiation scheme
479    
480     The transparent negotiation scheme eliminates the need to send huge
481     Accept headers, and nevertheless allows for a selection process
482     that always yields either the best variant, or an error message
483     indicating that user agent is not capable of displaying any of the
484     available variants.
485    
486     Under the transparent content negotiation scheme, the server sends
487     a list with the available variants and their properties to the user
488     agent. An example of a list with three variants is
489    
490     {"paper.html.en" 0.9 {type text/html} {language en}},
491     {"paper.html.fr" 0.7 {type text/html} {language fr}},
492     {"paper.ps.en" 1.0 {type application/postscript} {language en}}
493    
494     The syntax and semantics of the variant descriptions in this list
495     are covered in depth in Section 5. When the list is received, the
496     user agent can choose the best variant and retrieve it.
497     Graphically, the communication can be represented as follows:
498    
499     Server _____ proxy _____ proxy _____ user
500     x.org cache cache agent
501    
502     < ----------------------------------
503     | GET http://x.org/paper
504     |
505     ----------------------------------- > [list response]
506     return of list |
507     choose
508     |
509     < ----------------------------------
510     | GET http://x.org/paper.html.en
511     |
512     ---------------------------------- > [normal response]
513     return of html.en
514    
515     The first response returning the list of variants is called a `list
516     response'. The second response is a normal HTTP response: it does
517     not contain special content negotiation related information. Only
518     the user agent needs to know that the second request actually
519     retrieves a variant, for the other parties in the communication,
520     the second transaction is indistinguishable from a normal HTTP
521     transaction.
522    
523     With this scheme, the information about capabilities and
524     preferences is only used by the user agent itself. Therefore, the
525     sending of such information in large Accept headers is unnecessary.
526     Accept headers do have a limited use in transparent content
527     negotiation however: the sending of small Accept headers can often
528     speed up the negotiation process, this is covered in Section 4.4.
529    
530     List responses are covered in depth in Section 10.1. As an
531     example, the list response in the above picture could be:
532    
533     HTTP/1.1 300 Multiple Choices
534     Date: Tue, 11 Jun 1996 19:39:48 GMT
535     Alternates: {"paper.html.en" 0.9 {type text/html} {language en}},
536     {"paper.html.fr" 0.7 {type text/html} {language fr}},
537     {"paper.ps.en" 1.0 {type application/postscript}
538     {language en}}
539     Vary: *
540     Content-Type: text/html
541     Content-Length: 227
542    
543     <h2>Multiple Choices:</h2>
544     <ul>
545     <li><a href=paper.html.en>HTML, English version</a>
546     <li><a href=paper.html.fr>HTML, French version</a>
547     <li><a href=paper.ps.en>Postscript, English version</a>
548     </ul>
549    
550     The HTML entity included in the response ensures compatibility with
551     (existing) user agents which do not support transparent content
552     negotiation. Such user agents will ignore the computer-readable
553     list in the Alternates header and just display the HTML entity,
554     allowing the user to select the best variant by hand.
555    
556    
557     4.4 Optimizing the negotiation process
558    
559     The basic transparent negotiation scheme involves two HTTP
560     transactions: one to retrieve the list, and a second one to retrieve
561     the chosen variant. There are however several ways to `cut corners'
562     in the data flow path of the basic scheme.
563    
564     First, caching proxies can cache both variant lists and complete
565     responses. Such caching can reduce the communication overhead, as
566     shown in the following example:
567    
568     Server _____ proxy _____ proxy __________ user
569     x.org cache cache agent
570    
571     < --------------
572     | GET ../paper
573     |
574     has the list
575     in cache
576     |
577     ------------- > [list response]
578     list |
579     |
580     choose
581     |
582     < --------------------------
583     | GET ../paper.html.en
584     |
585     has the variant
586     in cache
587     |
588     -------------------------- > [normal response]
589     return of html.en
590    
591     Second, the user agent can send small Accept headers which could
592     allow a server to determine the choice the user agent would make on
593     receiving the list. If the Accept headers contain enough
594     information, the origin server can send back the variant directly:
595    
596     Server _____ proxy _____ proxy _____ user
597     x.org cache cache agent
598    
599     < ----------------------------------
600     | GET http://x.org/paper
601     | small Accept headers
602     |
603     able to choose on
604     behalf of user agent
605     |
606     ---------------------------------- > [choice response]
607     return of html.en and list
608    
609     This choosing based on small accept headers can be done with the
610     network negotiation algorithm (Section 11). This algorithm takes
611     the variant list and the Accept headers as input. It computes if
612     the Accept headers contain sufficient information to allow a choice
613     on behalf of the user agent, and, if so, which variant must be
614     chosen.
615    
616     The response in the above diagram is called a choice response: it
617     transmits both the chosen variant and the list of all variants
618     bound to the negotiable resource. Choice responses are covered in
619     depth in Section 10.2. As an example, the choice response in the
620     above picture could be:
621    
622     HTTP/1.1 200 OK
623     Date: Tue, 11 Jun 1996 19:39:54 GMT
624     Content-Type: text/html
625     Content-Length: 5327
626     Content-Location: paper.html.en
627     Alternates: {"paper.html.en" 0.9 {type text/html} {language en}},
628     {"paper.html.fr" 0.7 {type text/html} {language fr}},
629     {"paper.ps.en" 1.0 {type application/postscript}
630     {language en}}
631     Vary: *
632    
633     <title>A paper about ....
634    
635     Finally, the above two kinds of optimization can be combined: a
636     caching proxy which has the list will sometimes be able to choose on
637     behalf of the user agent. This could lead to the following
638     communication pattern:
639    
640     Server _____ proxy _____ proxy __________ user
641     x.org cache cache agent
642    
643     < ---------------
644     | GET ../paper
645     | small Accept
646     |
647     able to choose
648     on behalf
649     |
650     < ----------
651     | GET ../paper.html.en
652     |
653     ---------- > [normal response]
654     html.en |
655     ---------------- > [choice response]
656     html.en and list
657    
658     Here, the proxy cache nearest to the user agent was able to use a
659     cached variant list to choose on behalf of the user agent.
660    
661    
662     4.5 Retrieving a variant by hand
663    
664     If a transparently negotiated resource is accessed, the user agent
665     will always at some point receive the list of available variants.
666     The user agent can use this list to make available a menu (in HTML or
667     not) which lists all variants and their characteristics to the user.
668     Such a menu will allow the user to randomly browse other variants,
669     and will also make it possible to manually correct any sub-optimal
670     choice made by the automatic negotiation process.
671    
672    
673     4.6 Dimensions of negotiation
674    
675     Transparent content negotiation defines four dimensions of
676     negotiation:
677    
678     1. Media type (MIME type)
679     2. Charset
680     3. Language
681     4. Features
682    
683     The first three dimensions have traditionally been present in HTTP.
684     The fourth dimension is added by this specification. Additional
685     dimensions, beyond the four mentioned above, could be added by
686     future specifications.
687    
688     Negotiation on the content encoding of a response (gzipped,
689     compressed, etc.) is left outside of the realm of transparent
690     negotiation. Transparent negotiation does not prohibit proxies to
691     encode or decode a relayed or cached response on the fly: the
692     response still contains the same variant as far as transparent
693     content negotiation is concerned.
694    
695    
696     4.7 Feature negotiation
697    
698     Feature negotiation intends to provide for all areas of negotiation
699     not covered by the type, charset, and language dimensions.
700     Examples are negotiation on
701    
702     * HTML extensions
703     * Extensions of other media types
704     * Color capabilities of the user agent
705     * Screen size
706     * Output medium (screen, paper, ...)
707     * Preference for speed vs. preference for graphical detail
708    
709     The feature negotiation framework is the main means by which
710     transparent negotiation offers extensibility: a new dimension of
711     negotiation (really a sub-dimension of the feature dimension) can be
712     added without the need for a new standards effort, by the simple
713     registration of a `feature tag'.
714    
715    
716     5 Variant descriptions
717    
718     5.1 Syntax
719    
720     A variant can be described in a machine-readable way with a variant
721     description.
722    
723     variant-descr =
724     "{" <"> URI <">
725     source-quality
726     [ "{" "type" media-type "}" ]
727     [ "{" "charset" charset "}" ]
728     [ "{" "language" 1#language-tag "}" ]
729     [ "{" "length" 1*DIGIT "}" ]
730     [ "{" "features" feature-list "}" ]
731     [ "{" "description" quoted-string "}" ]
732     [ extension-attribute ]
733     "}"
734    
735     source-quality = qvalue
736    
737     extension-attribute = "{" extension-name extension-value "}"
738     extension-name = token
739     extension-value = *( token | quoted-string | LWS
740     | extension-specials )
741    
742     extension-specials = <any element of tspecials except <"> and "}">
743    
744     Examples are
745    
746     {"paper.html.fr" 0.7 {type text/html} {language fr}}
747    
748     {"paper.html.tables" 0.9 {type text/html} {features tables}}
749    
750     The various attributes which can be present in a variant
751     description are covered in the subsections below.
752    
753    
754     5.2 URI
755    
756     The URI attribute gives the URI of the resource from which the
757     variant can be retrieved with a GET request. It can be absolute or
758     relative to the Request-URI. The variant resource may vary (on the
759     Cookie request header, for example), but must not engage in
760     transparent content negotiation itself.
761    
762    
763     5.3 Source-quality
764    
765     The source-quality attribute gives the quality of the variant, as a
766     representation of the negotiable resource, when this variant is
767     rendered with a perfect rendering engine on the best possible
768     output medium.
769    
770     If the source-quality is less than 1, it often expresses a quality
771     degradation caused by a lossy conversion to a particular data
772     format. For example, a picture originally in JPEG form would have
773     a lower source quality when translated to the XBM format, and a
774     much lower source quality when translated to an ASCII-art variant.
775     Note, however, that degradation is a function of the source -- an
776     original piece of ASCII-art may degrade in quality if it is
777     captured in JPEG form.
778    
779     It is important that content providers do not assign very low
780     source quality values without good reason, as this would limit the
781     ability of users to influence the negotiation process with their
782     own preference settings. The following table should be used as a
783     guide when assigning source quality values:
784    
785     1.000 no degradation
786     0.999-0.900 no noticeable degradation
787     0.899-0.700 noticeable, but acceptable degradation
788     0.699-0.500 barely acceptable degradation
789     0.499-0.000 unacceptable degradation
790    
791     [##Issue to be resolved: can we come up with a word other than
792     `degradation' that covers better the case of variants not converted
793     from one source?##]
794    
795     When assigning source-quality values, content providers must not
796     account for the size of the variant and its impact on transmission
797     and rendering delays. Source-quality values are assigned assuming
798     instantaneous transmission and rendering. This rule ensures that a
799     future mechanism for bandwidth negotiation (see Appendix 19.5.2)
800     can be cleanly added.
801    
802    
803     5.4 Type, language, length, and charset.
804    
805     The type, language, and length attributes of a variant description
806     can carry the same information as their Content-* response header
807     counterparts as defined in [1]. The counterpart of the charset
808     attribute is the charset parameter which can be present in the
809     Content-Type response header, for example
810    
811     Content-Type: text/html; charset=ISO-8859-4
812    
813     Though all of these attributes are optional, it is often desirable
814     to include as many attributes as possible as this will increase the
815     quality of the negotiation process.
816    
817     The length attribute, if present, must reflect the length of the
818     variant only, not the length of the variant plus the length of any
819     objects inlined or embedded by the variant.
820    
821     Note: A server need not necessarily maintain a one-to-one
822     correspondence between attributes in the description of a
823     variant and the Content-* headers in responses containing that
824     variant. For example, if the variant description contains a
825     language attribute, the response does not necessarily have to
826     contain a Content-Language header, and if a Content-Language
827     header is present, it does not have to contain an exact copy of
828     the information in the language attribute.
829    
830    
831     5.5 Features
832    
833     The features attribute specifies how the presence or absence of
834     particular features in the user agent affects the overall quality of
835     the variant. This attribute is covered in Section 6.4.
836    
837    
838     5.6 Description
839    
840     The description attribute is meant to provide a textual description
841     of the variant, to be displayed by a user agent when showing a menu
842     of available variants (Section 12.2). This attribute can be
843     included if the URI and normal attributes of a variant are
844     considered too opaque to allow interpretation by the user.
845    
846    
847     5.7 Extension-attribute
848    
849     The extension-attribute allows future specifications to
850     incrementally define new dimensions of negotiation, and eases
851     content negotiation experiments under HTTP/1.1. In experimental
852     situations, servers must only generate extension-attributes whose
853     names start with "x-". User agents should ignore all extension
854     attributes they do not recognize. Proxies must not run the network
855     negotiation algorithm if an unknown extension attribute is present
856     in the variant list.
857    
858    
859     6 Feature negotiation
860    
861     Feature negotiation has been introduced in Section 4.7. This
862     section defines the feature negotiation mechanism, Section 7
863     contains examples of its use.
864    
865    
866     6.1 Feature tags
867    
868     A feature tag (ftag) identifies a capability of a user agent or a
869     preference of a user. A feature is said to be `present' in a user
870     agent if the corresponding capability is implemented, or if the
871     user has expressed corresponding preference.
872    
873     ftag = 1*<any CHAR except CTLs or tspecials or "!">
874    
875     tspecials = "(" | ")" | "<" | ">" | "@"
876     | "," | ";" | ":" | "\" | <">
877     | "/" | "[" | "]" | "?" | "="
878     | "{" | "}" | SP | HT
879    
880     (tspecials definition reproduced from [1])
881    
882     Examples are
883    
884     ns_tables, fonts, blebber, wolx, screenwidth, colordepth
885    
886     An example of the use of feature tags in a variant description is
887    
888     {"index.html" 1.0 {type text/html} {features ns_tables ns_frames}}
889    
890     Feature-tags are case-insensitive. The definition of a feature tag
891     may state that a feature tag, if present, must have associated with
892     it a numeric value which reflects a particular capability or
893     preference. For example, a feature tag `screenwidth' could be
894     present with a value of 640.
895    
896     Note that it sometimes depends on context whether a feature tag
897     expresses a capability or a preference. For a text-only browser,
898     the `textonly' tag is naturally present, but the user of a
899     graphical browser could set the tag to be present if text-only
900     content is preferred to graphical content.
901    
902     As feature registration will be an ongoing process, it is generally
903     not possible for a user agent to know the meaning of all feature
904     tags it can possibly encounter in a variant description. A user
905     agent should treat all features with tags unknown to it as absent.
906    
907    
908     6.2 Accept-Features header
909    
910     The Accept-Features request header can be used by a client to give
911     information about the presence or absence of certain features.
912    
913     Accept-Features = "Accept-Features" : #( ftag
914     | "!" ftag
915     | ftag "=" number
916     | "*"
917     )
918    
919     number = 1*DIGIT
920    
921     An example is:
922    
923     Accept-Features: blex, !blebber, colordepth=5, *
924    
925     A feature tag must never occur twice in an Accept-Features header.
926     In the Accept-Features header, an ftag without a "!" indicates that
927     the corresponding feature is present, but that is has no numeric
928     value associated with it. An ftag with a "!" indicates that the
929     corresponding feature is absent. An ftag with a number indicates
930     that the corresponding feature is present with the given numeric
931     value.
932    
933     The special construct "*", if present, makes all true feature
934     predicates (Section 6.3) on feature tags not present in the header.
935     Absence of the Accept-Features header in a request is equivalent to
936     the inclusion of
937    
938     Accept-Features: *
939    
940    
941     6.3 Feature predicates
942    
943     Feature predicates are used in the features attribute of a variant
944     description.
945    
946     fpred = ( ftag )
947     | ( "!" ftag )
948     | ( ftag ">=" number )
949     | ( ftag "<" number )
950    
951     Examples feature predicates are
952    
953     blebber, !blebber, colordepth>=5, blex<54
954    
955     The network negotiation algorithm can compute the truth value of a
956     feature predicate by using the contents of the Accept-Features
957     header of the current request.
958    
959     If the ftag in a feature predicate appears in the Accept-Features
960     header, the truth value of the predicate is defined as follows,
961     depending on its form:
962    
963     ftag true if the feature is present according to the
964     Accept-Features header, false otherwise.
965    
966     !ftag true if the feature is absent according to the
967     Accept-Features header, false otherwise.
968    
969     ftag>=N true if the feature is present with a value greater than
970     or equal to N according to the Accept-Features header,
971     false otherwise.
972    
973     ftag<N true if the feature is present with a value less than N
974     according to the Accept-Features header, false otherwise.
975    
976     [##Issues to be resolved: Add ftag<=N and ftag>N for symmetry?
977     Add ftag=N? Add ftag=N as a synonym for ftag>=N?##]
978    
979     If the ftag in a feature predicate does not appear in the
980     Accept-Features header, the value of the predicate is true if there
981     is a "*" in the Accept-Features header, false otherwise.
982    
983     As an example, the header
984    
985     Accept-Features: blex, !blebber, colordepth=5, !screenwidth, *
986    
987     makes the following predicates true:
988    
989     blex, colordepth>=4, colordepth<6, colordepth, !screenwidth,
990     frtnbf, !frtnbf, frtnbf>=4, frtnbf<4
991    
992     and makes the following predicates false:
993    
994     !blex, blex>=0, blebber, colordepth>=6, !colordepth,
995     screenwidth, screenwidth>=640, screenwidth<640
996    
997    
998     6.4 Features attribute
999    
1000     The features attribute
1001    
1002     "{" "features" feature-list "}"
1003    
1004     is used in a variant description to specify how the presence or
1005     absence of particular features in the user agent affects the overall
1006     quality of the variant.
1007    
1008     feature-list = 1%feature-list-element
1009    
1010     feature-list-element = ( fpred | fpred-bag )
1011     [ ":" true-improvement ]
1012     [ "/" false-degradation ]
1013    
1014     fpred-bag = "[" 1%fpred "]"
1015    
1016     true-improvement = 1*3DIGIT [ "." 0*3DIGIT ]
1017     false-degradation = 1*3DIGIT [ "." 0*3DIGIT ]
1018    
1019     Examples are:
1020    
1021     {features !textonly [blebber !wolx] colordepth>=3:0.7 }
1022    
1023     {features !blink/0.5 background:1.5 [blebber !wolx]:1.4/0.8 }
1024    
1025     The default value for the true-improvement is 1. The default value
1026     for the false-degradation is 0, or 1 if a true-improvement value is
1027     given.
1028    
1029     The network negotiation algorithm can compute the quality
1030     degradation factor associated with the features attribute by
1031     multiplying all quality degradation factors of the elements of the
1032     feature-list. Note that the result can be a factor greater than 1.
1033    
1034     A feature list element yields its true-improvement factor if the
1035     corresponding feature predicate is true, or if at least one element
1036     of the corresponding fpred-bag is true. The element yields its
1037     false-degradation factor otherwise.
1038    
1039     [##Issue to be resolved: It is unknown yet whether this features
1040     attribute definition makes the right tradeoff between complexity
1041     and (ease of) expressive power. The attribute grammar above is
1042     designed to be parsable with simple non-recursive parsers. The
1043     true-improvement construct does not add expressive power in a
1044     theoretical sense, but does make the (automatic) construction of
1045     variant lists more straightforward in many cases.##]
1046    
1047     [##Aside for mathematicians: note the similarity between the
1048     feature-list
1049    
1050     [f1 !f2] [!f1 f3]
1051    
1052     and the conjunctive normal form of a boolean expression. This
1053     similarity implies good things about the expressive power of the
1054     features attribute. I have not yet explored how far this power
1055     extends into the non-boolean domain.##]
1056    
1057    
1058     7 Feature negotiation examples
1059    
1060     This section contains examples of the use of feature tags in
1061     variant descriptions.
1062    
1063     [##Note: A future version of this document will probably revise and
1064     extend this section.##]
1065    
1066    
1067     7.1 Use of feature tags
1068    
1069     Feature tags can be used in variant lists to express the quality
1070     degradation associated with the presence or absence of certain
1071     features. One example is
1072    
1073     {"index.html.plain" 0.7 },
1074     {"index.html" 1.0 {features ns_tables ns_frames}}
1075    
1076     Here, the "{features ns_tables ns_frames}" part expresses that
1077     index.html uses the features tagged as ns_tables and ns_frames. If
1078     these features are absent, the overall quality of index.html degrades
1079     to 0. Another example is
1080    
1081     {"home.graphics" 1.0 {features !textonly}},
1082     {"home.textonly" 0.7 }
1083    
1084     where the "{features !textonly}" part expresses that home.graphics
1085     requires the absence of the textonly feature. If the feature is
1086     present, the overall quality of home.graphics degrades to 0.
1087    
1088     The absence of a feature need not always degrade the overall quality
1089     to 0. In the example
1090    
1091     {"x.html.1" 1.0 {features fonts/0.7}}
1092    
1093     the absence of the fonts feature degrades the quality with a factor
1094     of 0.7. "fonts/0.7" can be pronounced as "fonts, or a degradation of
1095     0.7". In the example
1096    
1097     {"x.html.2" 0.5 {features fonts:1.5}}
1098    
1099     the presence of the fonts feature improves the overall quality with a
1100     factor of 1.5. If the fonts feature is absent, the overall quality is
1101     not affected. "fonts:1.5" can be pronounced as "fonts improves with
1102     1.5". Finally, in the example
1103    
1104     {"y.html" 1.0 {features [blebber wolx] }}
1105    
1106     The "[blebber wolx]" expresses that y.html requires the presence of
1107     the blebber feature or the wolx feature. This construct can be
1108     used in a number of cases:
1109    
1110     1. blebber and wolx actually tag the same feature, but they
1111     were registered by different people, and some browsers say
1112     they support blebber while others say they support wolx.
1113    
1114     2. blebber and wolx are HTML tags of different vendors which
1115     implement the same functionality, and which were used
1116     together in y.html without interference.
1117    
1118     3. blebber and wolx are HTML tags of different vendors which
1119     implement the same functionality, and y.html uses conditional
1120     HTML to provide versions using both tags [##Note: conditional
1121     HTML does not yet exist, but it is something people are thinking
1122     about.##]
1123    
1124     4. blebber is a complicated HTML tag with only a sketchy
1125     definition, implemented by one browser vendor, and wolx
1126     indicates implementation of a well-defined subset of the blebber
1127     tag by some other vendor(s). y.html uses only this well-defined
1128     subset.
1129    
1130    
1131     7.2 Use of numeric feature tags
1132    
1133     As an example of negotiation in a numeric area, the following variant
1134     list describes four variants with title graphics designed for
1135     increasing screen widths:
1136    
1137     {"home.pda" 1.0 {features screenwidth<200}},
1138     {"home.narrow" 1.0 {features screenwidth>=200 screenwidth<600}},
1139     {"home.normal" 1.0 {features screenwidth>=600 screenwidth<1000}},
1140     {"home.wide" 1.0 {features screenwidth>=1000}}
1141    
1142     The above variant list has a serious problem, however: a user agent
1143     not supporting screenwidth negotiation is given no guidance on
1144     which variant to select. For such a user agent, the absence of the
1145     screenwidth feature would degrade the overall quality of each
1146     variant to 0. A variant list which solves this problem is
1147    
1148     {"home.pda" 1.0 {features screenwidth<200}},
1149     {"home.narrow" 1.0 {features screenwidth>=200 screenwidth<600}},
1150     {"home.normal" 0.95 },
1151     {"home.wide" 1.0 {features screenwidth>=1000}}
1152    
1153     With this list, a user agent which does not support the screenwidth
1154     feature will always select the home.normal variant. A user agent
1155     which does support the screenwidth feature will only select the
1156     home.normal variant if its screen width is in the range 600..999.
1157    
1158    
1159     8 Feature tag registration
1160    
1161     [##A specification of the feature tag registration process has not
1162     yet been completed. This issue has yet to be discussed by the
1163     http-wg.##]
1164    
1165     [##According to current plans, everybody will be allowed to register
1166     feature tags: registration only requires that the tag follows the
1167     syntax rules, and that a definition of the meaning of the tag is
1168     supplied. In particular, registration will not require actual
1169     implementation of a feature, and there will be no test on whether the
1170     feature definition overlaps with another feature definition.##]
1171    
1172     [##It is unclear yet whether it is desirable for feature tags to
1173     have some hierarchical structure, which would make it easier, for
1174     example, to trace who registered the feature. All that is known
1175     now is that it is desirable to have short feature tags. A naming
1176     scheme like that for SGML-DTDs would probably yield feature tags
1177     which are too long. The main advantage of having a registration
1178     process at all is that it allows for short tags without running the
1179     risk of `tag collision'.##]
1180    
1181    
1182     8.1 Evolution of feature tags
1183    
1184     The feature negotiation mechanism is designed not to break if 1000+
1185     features, partially overlapping, are registered. This allows for
1186     feature tag creation to be an evolutionary process, in which many
1187     tags are created while only a few `survive' to become generally
1188     used.
1189    
1190     As the development of new web content formats is currently in an
1191     evolutionary phase, rather than a standardization phase, it is
1192     thought that this evolutionary approach to feature tag creation has
1193     the best chances of keeping up with new developments.
1194    
1195     It is expected that after the introduction of feature negotiation,
1196     an explosion in feature tag registration will occur, and that only
1197     some of these tags will end up being actively used to label
1198     variants. Web indexing robots could, while traversing the web,
1199     gather statistics about actual use of feature tags. These
1200     statistics could be used by individuals to compile lists, intended
1201     for content authors, of useful feature tags for particular areas of
1202     negotiation. Note that this indexing activity is orthogonal to the
1203     feature registration process. It is expected that, once an area of
1204     negotiation is well-understood, this process will converge on a
1205     commonly-used and commonly-recognized set of feature tags for that
1206     area.
1207    
1208    
1209     8.2 Core set of feature tags
1210    
1211     [##In order to jump-start feature negotiation, it seems useful to
1212     define a `core set' of feature tags in a separate document. These
1213     feature tags would cover the areas of negotiation which are
1214     currently well understood, like negotiation on currently stable
1215     HTML extensions. The transparent content negotiation specification
1216     could then require (or strongly encourage) that user agents
1217     implementing transparent content negotiation must recognize (not
1218     support!) all tags in the core set.
1219    
1220     The core set could be defined in a non-standards track document
1221     which would be completed along with this document.##]
1222    
1223    
1224     8.3 Feature tag design
1225    
1226     When designing a new feature tag, it is important to take into
1227     account that existing user agents, which will not recognize the new
1228     tag, will treat the feature as absent. In general, a new feature
1229     tag needs to be designed in such a way that absence of the tag is
1230     the default case which reflects current practice. If this design
1231     principle is ignored, the resulting feature tag will generally be
1232     unusable.
1233    
1234     As an example, one could try to support negotiation between
1235     monochrome and color content by introducing a `color' feature tag,
1236     the presence of which would indicate the capability to display
1237     color graphics. However, if this new tag is used in a variant
1238     list, for example
1239    
1240     {"rainbow.gif" 1.0 {features color} }
1241     {"rainbow.mono.gif" 0.6 {features !color}}
1242    
1243     then existing user agents, which would not recognize the color tag,
1244     would all display the monochrome rainbow. The color tag is
1245     therefore unusable in situations where optimal results for existing
1246     user agents are desired. To provide for negotiation in this area,
1247     one needs to introduce a `monochrome' feature tag, the presence of
1248     which indicates that the user agent can only render monochrome
1249     graphics.
1250    
1251    
1252     9 Content negotiation response codes and headers
1253    
1254     This specification adds one new response code to those defined in
1255     HTTP/1.1 [1]. This is a 5xx (Server Error) class response. It
1256     also adds six new headers.
1257    
1258    
1259     9.1 506 Variant Also Negotiates
1260    
1261     The server has an internal configuration error: the chosen variant
1262     resource is configured to engage in transparent content negotiation
1263     itself, and is therefore not a proper end point in the negotiation
1264     process.
1265    
1266    
1267     9.2 Accept-Features
1268    
1269     This request header was defined in Section 6.2.
1270    
1271    
1272     9.3 Content-Features
1273    
1274     The Content-Features response header can be used by a server to
1275     indicate how the presence or absence of particular features in the
1276     user agent affects the overall quality of the response.
1277    
1278     Content-Features = "Content-Features" ":" feature-list
1279    
1280    
1281     9.4 Alternates
1282    
1283     The Alternates response header is used to convey the list of
1284     variants bound to a negotiable resource in a response, and can also
1285     contain other directives for the content negotiation process.
1286    
1287     Alternates = "Alternates" ":" 1#( variant-descr
1288     | alternates-directive )
1289    
1290     alternates-directive = ( "max-age" "=" delta-seconds )
1291     | ( "min-q" "=" short-float )
1292     | "forward"
1293     | extension-alternates-directive
1294    
1295     delta-seconds = 1*DIGIT
1296    
1297     short-float = 1*3DIGIT [ "." 0*3DIGIT ]
1298    
1299     extension-alternates-directive =
1300     token [ "=" ( token | quoted-string ) ]
1301    
1302     An example is
1303    
1304     Alternates: {"paper.html.en" 0.9 {type text/html} {language en}},
1305     {"paper.html.fr" 0.7 {type text/html} {language fr}},
1306     {"paper.ps.en" 1.0 {type application/postscript}
1307     {language en}},
1308     min-q=0.4
1309    
1310     Any relative URI specified in a variant-descr field is relative to
1311     the request-URI. The max-age directive, if present, specifies the
1312     freshness lifetime of the information in the Alternates header.
1313     The min-q and forward directives, if present, can influence
1314     decisions made by the network negotiation algorithm on behalf of
1315     the origin server. Clients should ignore all
1316     extension-alternates-directives they do not understand.
1317    
1318     [##Question to be resolved: should this header be called
1319     `Variants'? Probably not, the 1.1 spec already announced that it
1320     would be called `Alternates'.##]
1321    
1322    
1323     9.5 Alternates-Older
1324    
1325     The Alternates-Older response header conveys an estimate of the age
1326     difference between the Alternates header contained in a choice
1327     response and the variant data contained in the response. The age
1328     is measured as the time since generation or revalidation at the
1329     origin server, as in the HTTP/1.1 specification [1].
1330    
1331     Alternates-Older = "Alternates-Older" ":" signed-delta-seconds
1332    
1333     signed-delta-seconds = [ "-" ] 1*DIGIT
1334    
1335     A positive value means that the Alternates header is older, a
1336     negative value means that the Alternates header is less old. If
1337     the Alternates-Older header is absent, it is known or estimated
1338     that there is no age difference between the Alternates header and
1339     the variant data. An example is
1340    
1341     Alternates-Older: 5433
1342    
1343     This header is important for proxies which negotiate using cached
1344     variant lists, see Section 10.3. Only negotiating proxies need to be
1345     able to construct Alternates-Older headers, see Section 10.2.2.
1346    
1347     [##Note: The age of the Alternates header cannot be conveyed in an
1348     Alternates-Age header, because plain HTTP/1.1 caching proxies would
1349     only update the Age header, not the Alternates-Age header, when
1350     serving a choice response from cache memory.##]
1351    
1352    
1353     9.6 Negotiate
1354    
1355     The Negotiate request header can contain directives for any content
1356     negotiation process initiated by the request. Presence of this
1357     header indicates that the user agent supports transparent content
1358     negotiation for the current request.
1359    
1360     Negotiate = "Negotiate" ":" #negotiate-directive
1361    
1362     negotiate-directive = token [ "=" ( token | quoted-string ) ]
1363    
1364     An example is
1365    
1366     Negotiate:
1367    
1368     This specification does not define any negotiate-directives, this
1369     is left to future extensions. Servers should ignore all
1370     negotiate-directives they do not understand. The presence or
1371     absence of a Negotiate header in a request is significant in
1372     calculations performed by the network negotiation algorithm.
1373    
1374     [#Question to be resolved: is it safer to put a keyword in the
1375     negotiate header to signal transparent negotiation capability?
1376     Some cache implementations might treat an empty Negotiate header
1377     the same as an absent Negotiate header under Vary: negotiate. Is
1378     the 1.1 spec clear enough on this?##]
1379    
1380    
1381     9.7 Variant-Vary
1382    
1383     The Variant-Vary response header can be used in a list response to
1384     record any vary information which applies to the variant data
1385     contained in the response, rather than to the response as a whole.
1386    
1387     Variant-Vary = "Variant-Vary" ":" ( "*" | 1#field-name )
1388    
1389     Use of the Variant-Vary header is discussed in Section 10.2.1.
1390    
1391    
1392     10 Content negotiation responses
1393    
1394     A request on a transparently negotiated resource can yield two
1395     types of non-error responses: list responses and choice responses.
1396     A list response contains only the list of variants bound to the
1397     negotiable resource, and is generated if the sever cannot or does
1398     not want to choose a particular best variant for the request. A
1399     choice response contains both the list and a representation of the
1400     best variant.
1401    
1402     Normal responses are non-error responses generated by requests on
1403     resources which are not transparently negotiated. A normal
1404     response never contains an Alternates header, a list or choice
1405     response always contains an Alternates header. A list response
1406     always has the 300 (Multiple Choices) status code, a choice
1407     response never has the 300 status code.
1408    
1409    
1410     10.1 List response
1411    
1412     A list response has the 300 response status code, and must contain,
1413     besides the normal headers required by HTTP, the Alternates header
1414     bound to the negotiable resource, a Vary header and, unless it was
1415     a HEAD request, an entity body which allows the user to manually
1416     select the best variant.
1417    
1418     An example a list response is:
1419    
1420     HTTP/1.1 300 Multiple Choices
1421     Date: Tue, 11 Jun 1996 20:02:21 GMT
1422     Alternates: {"paper.html.en" 0.9 {type text/html} {language en}},
1423     {"paper.html.fr" 0.7 {type text/html} {language fr}},
1424     {"paper.ps.en" 1.0 {type application/postscript}
1425     {language en}}, max-age=86400
1426     Vary: negotiate, accept, accept-language
1427     Etag: "gonkyyyy"
1428     Cache-control: max-age=86400
1429     Content-Type: text/html
1430     Content-Length: 227
1431    
1432     <h2>Multiple Choices:</h2>
1433     <ul>
1434     <li><a href=paper.html.en>HTML, English version</a>
1435     <li><a href=paper.html.fr>HTML, French version</a>
1436     <li><a href=paper.ps.en>Postscript, English version</a>
1437     </ul>
1438    
1439     Note that the same max-age value appears both in the Alternates
1440     header and in the Cache-Control header.
1441    
1442     The Vary header in the response should ensure correct handling by
1443     HTTP/1.1 caching proxies not capable of transparent content
1444     negotiation. This header can either be
1445    
1446     Vary: *
1447    
1448     or a more elaborate header, see Section 10.5.1.
1449    
1450     Only the origin server may construct list responses. List
1451     responses are cachable unless indicated otherwise. A proxy may
1452     reuse a list response as a whole if the response is fresh in the
1453     sense of the HTTP/1.1 specification [1], even if the Alternates
1454     header in the response is no longer fresh by itself.
1455    
1456     According to the HTTP/1.1 specification [1], a user agent not
1457     capable of transparent content negotiation will, when receiving a
1458     list response, display the entity body included in the response.
1459     If the response contains a Location header, however, the user agent
1460     may automatically redirect to this location.
1461    
1462     The handling of list responses by clients supporting transparent
1463     content negotiation is described in Sections 12.1 and 14.
1464    
1465     [##Issue to be resolved: Some existing HTTP/1.0 user agents crash
1466     when getting a 300 response without a Location header. This
1467     problem may be big enough to warrant the allocation of an extra
1468     list response code outside of the 3xx class for possible use in
1469     responses to HTTP/1.0 clients.##]
1470    
1471    
1472     10.2 Choice response
1473    
1474     A choice response merges a normal HTTP response from the chosen
1475     variant with a Content-Location header giving the location of the
1476     variant, and the Alternates and Vary headers bound to the
1477     negotiable resource.
1478    
1479     The cachability of a choice response as a whole is defined in the
1480     HTTP/1.1 specification [1]. Depending on the response code, a
1481     choice response as a whole is either cachable unless indicated
1482     otherwise, or uncachable.
1483    
1484     10.2.1 Construction by origin servers
1485    
1486     Origin servers must construct choice responses with the
1487     following algorithm, or any other algorithm which gives equal
1488     results.
1489    
1490     1. Construct a HTTP request message on the best variant resource
1491     by rewriting the request-URI and Host header (if appropriate)
1492     of the received request message on the negotiable resource.
1493    
1494     2. Generate a valid HTTP response message for the request message
1495     constructed in step 1.
1496    
1497     3. Check for an internal server configuration error. If the HTTP
1498     response message generated in step 2 contains an Alternates
1499     header, a Content-Location header, or has the 300 status code,
1500     then the best variant resource is not a proper end point in
1501     the negotiation process, and a 506 (Variant Also Negotiates)
1502     error response message should be generated instead of going to
1503     step 4.
1504    
1505     4. Add a number of headers to the HTTP response message generated
1506     in step 2.
1507    
1508     a. Add a Content-Location header giving the location of the
1509     chosen variant.
1510    
1511     Note: According to the HTTP/1.1 specification [1], if
1512     the Content-Location header contains a relative URI,
1513     this URI is relative to the URI in the Content-Base
1514     header, if present.
1515    
1516     b. If any Vary headers are present in the response message
1517     from step 2, add, for every Vary header, a Variant-Vary
1518     header with a copy of the contents of this Vary header.
1519    
1520     c. Add the Alternates header bound to the negotiable resource.
1521    
1522     d. Add a Vary header to ensure correct handling by HTTP/1.1
1523     caching proxies not capable of transparent content
1524     negotiation. This header can either be
1525    
1526     Vary: *
1527    
1528     or a more elaborate header, see Section 10.5.1.
1529    
1530     e. To ensure compatibility with HTTP/1.0 caching proxies which
1531     do not recognize the Vary header, an Expires header with a
1532     date in the past may be added. See Appendix 19.1 for more
1533     information.
1534    
1535     An example of a choice response generated by an origin server is:
1536    
1537     HTTP/1.1 200 OK
1538     Date: Tue, 11 Jun 1996 20:05:31 GMT
1539     Content-Type: text/html
1540     Last-Modified: Mon, 10 Jun 1996 10:01:14 GMT
1541     Etag: "497542"
1542     Cache-control: max-age=604800
1543     Content-Length: 5327
1544     Content-Location: paper.html.en
1545     Alternates: {"paper.html.en" 0.9 {type text/html} {language en}},
1546     {"paper.html.fr" 0.7 {type text/html} {language fr}},
1547     {"paper.ps.en" 1.0 {type application/postscript}
1548     {language en}}, max-age=86400
1549     Vary: negotiate, accept, accept-language
1550     Expires: Thu, 01 Jan 1980 00:00:00 GMT
1551    
1552     <title>A paper about ....
1553    
1554    
1555     10.2.2 Construction by proxies
1556    
1557     Proxies must construct choice responses with the following
1558     algorithm, or any other algorithm which gives equal results.
1559    
1560     1. Same as in Section 10.2.1.
1561    
1562     2. Obtain a fresh or first-hand HTTP response message for the
1563     request message constructed in step 1. The message can be
1564     obtained from cache memory, or by passing the constructed HTTP
1565     request message towards the origin server.
1566    
1567     3. Same as in Section 10.2.1.
1568    
1569     4. Add a number of headers to the HTTP response message generated
1570     in step 2.
1571    
1572     a. Same as in Section 10.2.1.
1573    
1574     b. Same as in Section 10.2.1.
1575    
1576     c. Add a fresh or first-hand Alternates header bound to the
1577     negotiable resource. Section 10.3 specifies how this
1578     header can be obtained.
1579    
1580     d. Add a Vary header to ensure correct handling by HTTP/1.1
1581     caching proxies not capable of transparent content
1582     negotiation. This header can either be
1583    
1584     Vary: *
1585    
1586     or a more elaborate fresh or first-hand header,
1587     Section 10.5.2 specifies how this header can be obtained.
1588    
1589     e. Same as in Section 10.2.1.
1590    
1591     f. Compute the age difference between the Alternates header
1592     in the response in the following way.
1593    
1594     - Let variant_age be the age of the response obtained in
1595     step 2, calculated according to the rules in the HTTP/1.1
1596     specification [1]. If the response is known to be
1597     first-hand, variant_age can be 0.
1598    
1599     - Let alternates_age be the age of the Alternates header
1600     added in step c, calculated according to the rules in
1601     Section 10.3, or 0 if the Alternates header is known to
1602     be first-hand.
1603    
1604     - Compute the age difference:
1605    
1606     alternates_older = alternates_age - variant_age
1607    
1608     If the computed alternates_older value is greater than 0,
1609     an Alternates-Older header with this value must be added to
1610     the response. If the value is 0, an Alternates-Older
1611     header with this value need not be added. If the value is
1612     less than 0, an Alternates-Older header with this value
1613     should be added.
1614    
1615     An example of a choice response which could be sent by a caching
1616     proxy is:
1617    
1618     HTTP/1.1 200 OK
1619     Date: Tue, 11 Jun 1996 20:05:31 GMT
1620     Content-Type: text/html
1621     Last-Modified: Mon, 10 Jun 1996 10:01:14 GMT
1622     Etag: "497542"
1623     Cache-control: max-age=604800
1624     Content-Length: 5327
1625     Age: 432000
1626     Content-Location: paper.html.en
1627     Alternates: {"paper.html.en" 0.9 {type text/html} {language en}},
1628     {"paper.html.fr" 0.7 {type text/html} {language fr}},
1629     {"paper.ps.en" 1.0 {type application/postscript}
1630     {language en}}, max-age=86400
1631     Vary: negotiate, accept, accept-language
1632     Alternates-Older: -410400
1633     Expires: Thu, 01 Jan 1980 00:00:00 GMT
1634    
1635     <title>A paper about ....
1636    
1637     Here, the age of the variant data is 432000 seconds (5 days), while
1638     the age of the Alternates header is 432000 + -410400 = 21600
1639     seconds (6 hours).
1640    
1641    
1642     10.3 Reusing the Alternates header
1643    
1644     Proxy caches may extract and cache the Alternates header in any
1645     cachable list or choice response. If the Alternates header is
1646     fresh or first-hand, it may be reused to negotiate on behalf of the
1647     user agent or origin server (Section 14) and to construct choice
1648     responses (Section 10.2.2). The freshness of an Alternates header
1649     is determined in the following way.
1650    
1651     - Let response_age be the current age of the response from which
1652     the header was extracted, calculated according to the rules in
1653     the HTTP/1.1 specification [1].
1654    
1655     - Let alternates_older be the value in the Alternates-Older
1656     header of this response, or 0 if no Alternates-Older header is
1657     present.
1658    
1659     - Let max_age be the value of the max-age directive in the
1660     Alternates header, or positive infinity if a max-age directive
1661     is absent.
1662    
1663     The age of the alternates header is
1664    
1665     alternates_age = response_age + alternates_older .
1666    
1667     The Alternates header is fresh if
1668    
1669     alternates_age < max_age .
1670    
1671     An Alternates header is fist-hand if it is used, without unnecessary
1672     delay, after being extracted from a first-hand response.
1673    
1674    
1675     10.4 Extracting a normal response from a choice response
1676    
1677     If a proxy receives a choice response, it may extract and cache the
1678     normal HTTP response contained therein. The normal response can be
1679     extracted by taking a copy of the choice response and then deleting
1680     the Content-Location, Alternates, Vary, and Alternates-Older
1681     header, and renaming any Variant-Vary headers to Vary headers.
1682    
1683     [##Question to be resolved: A method to get rid of the Expires
1684     header which could have been added in a step 4.e of Section 10.2.1
1685     and 10.2.2 could be invented. Should such a method be added to
1686     this specification? Probably not.##]
1687    
1688     This normal response may then be cached (as a HTTP response to the
1689     variant request as constructed in step 1. of Section 10.2.1) and
1690     reused to answer future direct requests on the variant resource
1691     according to the rules in the HTTP/1.1 specification [1]. This
1692     caching of extracted responses can increase overall efficiency with
1693     up to a factor 2.
1694    
1695     For security reasons (see Section 15.2), an extracted normal
1696     response may only be cached if the negotiable resource and the
1697     variant resource are neighbors. If they are not neighbors, the
1698     proxy should reject the choice response as a probable spoofing
1699     attempt and pass on a 502 (bad gateway) error response instead.
1700    
1701    
1702     10.5 Elaborate Vary headers
1703    
1704     The Vary header added to a list or choice response should ensure
1705     correct handling by HTTP/1.1 caching proxies not capable of
1706     transparent content negotiation. The most simple Vary header which
1707     satisfies this requirement is
1708    
1709     Vary: *
1710    
1711     A more elaborate Vary header can be used to allow for certain
1712     optimizations which could be performed by some HTTP/1.1 caches
1713     which are not capable of transparent content negotiation, but which
1714     do cache multiple variants of one resource based on Vary header
1715     contents.
1716    
1717     10.5.1 Construction of an elaborate Vary header
1718    
1719     Origin servers can construct a more elaborate Vary header in the
1720     following way. First, start with the header
1721    
1722     Vary: negotiate
1723    
1724     Then, if any of the following attributes is present in any variant
1725     description in the Alternates header, add the corresponding header
1726     name to the Vary header
1727    
1728     attribute | header name to add
1729     -----------+---------------------
1730     type | accept
1731     charset | accept-charset
1732     language | accept-language
1733     features | accept-features
1734    
1735     The Vary header constructed in this way specifies the response
1736     variation which can be caused by the use of the network negotiation
1737     algorithm in proxies. If the origin server uses a custom
1738     negotiation algorithm which takes additional headers (for example
1739     User-Agent) into account, these should also be added to the Vary
1740     header.
1741    
1742     10.5.2 Caching of an elaborate Vary header
1743    
1744     Proxy caches cannot construct elaborate Vary headers by themselves,
1745     because they may not assume that the origin server uses the
1746     standard network negotiation algorithm to vary its responses.
1747     However, when extracting an Alternates header from a response
1748     (Section 10.3) caches may also extract the Vary header in the
1749     response, and reuse it along with the Alternates header. A clean
1750     Vary header can however only be extracted if the variant does not
1751     vary itself, i.e. if a Variant-Vary header is absent.
1752    
1753    
1754     11 The network negotiation algorithm
1755    
1756     The network negotiation algorithm is a standardized algorithm by
1757     which a party in the negotiation process can make a choice on
1758     behalf of another party. For example, a proxy could choose a
1759     particular variant on behalf of the user agent in order to speed up
1760     the negotiation process by cutting corners (see Section 4.4).
1761    
1762     General principles underlying the network negotiation algorithm are
1763     as follows.
1764    
1765     - When running on an origin server or proxy, the algorithm will
1766     usually only have partial user agent capabilities and
1767     preferences information as input. Therefore, instead of a
1768     choice for a best variant, the algorithm can also yield an
1769     `insufficient data, cannot choose' result.
1770    
1771     - Decisions are always made on either on behalf of the user agent
1772     or on behalf of the origin server. They are made on behalf of
1773     the user agent if the user agent indicates that it is capable of
1774     transparent content negotiation, and on behalf of the origin
1775     server otherwise.
1776    
1777     - By including an Alternates header in the response, the origin
1778     server gives upstream proxies the permission to perform actions
1779     prescribed by the network negotiation algorithm instead of
1780     actions prescribed by the plain HTTP specification.
1781    
1782     - It is expected that user agents will use the network negotiation
1783     algorithm by default, locally supplying their complete
1784     capabilities and preferences to the algorithm, but this is not
1785     required. User agents may use customized negotiation algorithms
1786     to automatically choose a variant. Such algorithms could for
1787     example account for cross-dependencies between dimensions of
1788     negotiation.
1789    
1790     Note that in this specification, `use of the network negotiation
1791     algorithm' means use of any algorithm which yields equal results.
1792    
1793    
1794     11.1 Input
1795    
1796     The algorithm is always executed for a particular request on a
1797     particular transparently negotiable resource. It takes the
1798     following information as input.
1799    
1800     1. The list of variants of the resource, as present in the
1801     Alternates header of the resource.
1802    
1803     2. Any "min-q" and "forward" directives pertaining to the
1804     negotiation process, as specified by the Alternates header of
1805     the resource.
1806    
1807     3. (Partial) Information about capabilities and preferences of the
1808     user agent for this particular request, as given in the Accept
1809     headers of the request, or, if the algorithm runs on a user
1810     agent, as given by the internal capabilities and preferences
1811     database.
1812    
1813     4. A boolean indicating whether or not the user agent is capable
1814     of transparent content negotiation for this request. (True if
1815     the request includes a Negotiate header, false otherwise).
1816    
1817    
1818     11.2 Output
1819    
1820     As its output, the network negotiation algorithm and will yield the
1821     appropriate action to be performed. Actions have labels `ACT_UA'
1822     for actions performed on behalf of the user agent, and `ACT_OS' for
1823     actions performed on behalf of the origin server.
1824    
1825     11.2.1 Output for proxies
1826    
1827     If the algorithm runs on a proxy, there are five different possible
1828     results. The first two results can be generated if the user agent
1829     is capable of transparent content negotiation:
1830    
1831     Choice_UA
1832    
1833     Choice on behalf of the user agent. The best variant may be
1834     retrieved and returned in a choice response.
1835    
1836     List_UA
1837    
1838     No choice possible, return the list. The Accept headers do
1839     not contain sufficient information to make a choice on behalf
1840     of the user agent possible. A list response should be
1841     returned, allowing the user agent to make the choice itself.
1842    
1843     The following results can be generated if the user agent is not
1844     capable of transparent content negotiation:
1845    
1846     Choice_OS
1847    
1848     Choice on behalf of the origin server. The best variant may
1849     be retrieved and returned in a choice response.
1850    
1851     List_OS
1852    
1853     No choice possible, return the list. The Accept headers do
1854     not contain sufficient information to make a choice on behalf
1855     of the origin server possible. A list response should be
1856     returned, allowing the user to manually select the best
1857     variant.
1858    
1859     Forward_OS
1860    
1861     No choice possible, forward request towards the origin
1862     server. The Accept headers do not contain sufficient
1863     information to make a choice on behalf of the origin server
1864     possible. The request should be forwarded towards the origin
1865     server so that it can choose the most appropriate action with
1866     a custom negotiation algorithm.
1867    
1868     11.2.2 Output for origin servers
1869    
1870     If the algorithm runs on an origin server, all results above,
1871     except Forward_OS, are possible, with the same interpretations.
1872    
1873     11.2.3 Output for user agents
1874    
1875     If the algorithm runs on a user agent, only the results List_UA and
1876     Choice_UA are possible, with the following interpretations.
1877    
1878     Choice_UA
1879    
1880     Automatic choice. A particular variant X must be retrieved and
1881     displayed.
1882    
1883     List_UA
1884    
1885     No automatic choice possible, none of of the variants can be
1886     rendered according to the preferences and capabilities
1887     database. An appropriate action like showing an error message
1888     with the list of variants to the user must be performed.
1889    
1890    
1891     11.3 Computing the overall quality values
1892    
1893     As a first step in the network negotiation algorithm, the overall
1894     qualities of the individual variants in the list are computed.
1895    
1896     The overall quality Q of a variant is the value
1897    
1898     Q = qs * qt * qc * ql * qf
1899    
1900     where the factors qs, qt, qc, ql, and qf are determined as follows.
1901    
1902     qs Is the source quality factor in the variant description.
1903    
1904     qt The media type quality factor is 1 if there is no type
1905     attribute in the variant description, or if there is no
1906     Accept header in the request. Otherwise, it is the quality
1907     assigned by the Accept header to the media type in the type
1908     attribute.
1909    
1910     Note: If a type is matched by none of the elements of an
1911     Accept header, the Accept header assigns the quality factor
1912     0 to that type.
1913    
1914     qc The charset quality factor is 1 if there is no charset
1915     attribute in the variant description, or if there is no
1916     Accept-Charset header in the request. Otherwise, the charset
1917     quality factor is the quality assigned by the Accept-Charset
1918     header to charset in the charset attribute.
1919    
1920     Note: If a charset does not appear in an Accept-Charset
1921     header, the Accept-Charset header assigns the quality
1922     factor 0 to that charset.
1923    
1924     ql The language quality factor is 1 if there is no language
1925     attribute in the variant description, or if there is no
1926     Accept-Language header in the request. Otherwise, the
1927     language quality factor is the highest quality factor
1928     assigned by the Accept-Language header to any one of the
1929     languages listed in the language attribute.
1930    
1931     qf The features quality factor is 1 if there is no features
1932     attribute in the variant description, or if there is no
1933     Accept-Features header in the request. Otherwise, it is
1934     the feature negotiation quality degradation value for the
1935     features attribute, see Section 6.4.
1936    
1937     As an example, if a variant list contains the variant description
1938    
1939     {"paper.html.en" 0.7 {type text/html} {language fr}}
1940    
1941     and if the request contains the Accept headers
1942    
1943     Accept: text/html:q=1.0, */*:q=0.8
1944     Accept-Language: en;q=1.0, fr;q=0.5
1945    
1946     the network negotiation algorithm will compute an overall quality
1947     for the variant as follows:
1948    
1949     {"paper.html.en" 0.7 {type text/html} {language fr}}
1950     | | |
1951     | | |
1952     V V V
1953     0.7 * 1.0 * 0.5 = 0.35
1954    
1955     With the above Accept headers, the complete variant list
1956    
1957     {"paper.html.en" 0.9 {type text/html} {language en}},
1958     {"paper.html.fr" 0.7 {type text/html} {language fr}},
1959     {"paper.ps.en" 1.0 {type application/postscript} {language en}}
1960    
1961     would yield the following computations:
1962    
1963     qs * qt * qc * ql * qf = Q
1964     --- --- --- --- --- ----
1965     paper.html.en: 0.9 * 1.0 * 1.0 * 1.0 * 1.0 = 0.9
1966     paper.html.fr: 0.7 * 1.0 * 1.0 * 0.5 * 1.0 = 0.35
1967     paper.ps.en: 1.0 * 0.8 * 1.0 * 1.0 * 1.0 = 0.8
1968    
1969    
1970     11.4 Definite and speculative quality values
1971    
1972     An overall quality value computed by an origin server or proxy can
1973     be either definite or speculative.
1974    
1975     An overall quality value for a variant is definite if it was
1976     computed without using any wildcard characters '*' in the Accept
1977     headers, and without the need to use the absence of a particular
1978     Accept header. An overall quality value is speculative otherwise.
1979    
1980     As an example, in the previous section, the quality values of
1981     paper.html.en and paper.html.fr are definite, and the quality value
1982     of paper.ps.en is speculative because the type
1983     application/postscript was matched to the range */*.
1984    
1985     Definiteness can be defined more formally as follows. An overall
1986     quality value Q is definite if the same quality value Q could be
1987     computed after the request message is changed in the following way:
1988    
1989     1. If an Accept, Accept-Charset, Accept-Language, or
1990     Accept-Features, header is missing from the request, add
1991     this header with an empty field.
1992    
1993     2. Delete any media ranges containing a wildcard character '*'
1994     from the Accept header. Delete the language-range '*', if
1995     present, from the Accept-Language header. Delete the
1996     wildcard '*', if present, from the Accept-Features header.
1997    
1998     As another example, the overall quality factor for the variant
1999    
2000     {"blah.html" 1 {language en-gb} {features blebber [x y]}}
2001    
2002     is 1 and definite with the Accept headers
2003    
2004     Accept-Language: en-gb, fr
2005     Accept-Features: blebber, x, !y, *
2006    
2007     and
2008    
2009     Accept-Language: en, fr
2010     Accept-Features: blebber, x, *
2011    
2012     The overall quality factor is still 1, but speculative, with the
2013     Accept headers
2014    
2015     Accept-language: en-gb, fr
2016     Accept-Features: blebber, !y, *
2017    
2018     and
2019    
2020     Accept-Language: fr, *
2021     Accept-Features: blebber, x, !y, *
2022    
2023    
2024     11.5 Determining the result
2025    
2026     The best variant, as determined by the network negotiation
2027     algorithm, is the one variant with the highest overall quality
2028     value, or, if there are multiple variants which share the highest
2029     overall quality, the first variant in the list with this value.
2030    
2031     11.5.1 Result for proxies and origin servers
2032    
2033     When running on a proxy or origin server, the result of the network
2034     negotiation algorithm is determined as follows.
2035    
2036     1. If the negotiable resource and the best variant resource are not
2037     neighbors, then the result is List_UA if the user agent is
2038     capable of transparent content negotiation, List_OS otherwise.
2039     This rule exists for security reasons: it prevents some forms of
2040     spoofing, see Section 15.2.
2041    
2042     2. If the above rule does not apply, then
2043    
2044     a. If the user agent is capable of transparent content
2045     negotiation, the result is Choice_UA if the best variant has
2046     a definite overall quality value greater than 0, and List_UA
2047     otherwise.
2048    
2049     b. If the user agent is not capable of transparent content
2050     negotiation, the result is Choose_OS if the best variant has
2051     a (definite or speculative) overall quality value which is
2052     greater than 0, or at least the value of the "min-q"
2053     directive if this directive is present in the Alternates
2054     header. If the result is not Choose_OS, it is Forward_OS if
2055     the Alternates header contains the "forward" directive and
2056     the algorithm is running on a proxy, and List_OS otherwise.
2057    
2058     11.5.2 Result for user agents
2059    
2060     When running on a user agent, the result of the network negotiation
2061     algorithm is Choice_UA if the best variant has an overall quality
2062     value greater than 0, and List_UA otherwise.
2063    
2064    
2065     11.6 Construction of short requests
2066    
2067     Under normal HTTP semantics, the interpretation of the request
2068     header `Accept: */*' is
2069    
2070     `I accept all media types with a quality of 1.0'.
2071    
2072     One of the most important properties of the network negotiation
2073     algorithm is that this interpretation is different if the header is
2074     sent by a user agent which supports transparent content
2075     negotiation. In this case, the interpretation of the header is
2076    
2077     `I accept several media types, and assign quality factors from 0.0
2078     up to 1.0 to them. If this information is insufficient to make a
2079     choice on my behalf, do not make a choice but send the list of
2080     variants'.
2081    
2082     The complete absence of an Accept header from the request would be
2083     interpreted in the same way.
2084    
2085     This means that a user agent which supports transparent content
2086     negotiation can send a minimal request, without any Accept headers
2087     but with a Negotiate header, by default:
2088    
2089     GET /paper HTTP/1.1
2090     Host: x.org
2091     User-Agent: WuxtaWeb/2.4
2092     Negotiate:
2093    
2094     The sending of this minimal request will never have an adverse
2095     effect on the quality of the transparent negotiation process: if
2096     the requested resource happens to be transparently negotiated, the
2097     user agent will always get a list response, so that it can choose
2098     the best variant itself. Only the speed of the negotiation process
2099     can be affected, because servers will no longer be able to cut
2100     corners by choosing on behalf of the user agent.
2101    
2102     If it is found that the requests to a particular origin server
2103     often return a less efficient list response, the user agent can
2104     dynamically introduce short Accept headers in its future requests
2105     to that server, for example
2106    
2107     GET /paper HTTP/1.1
2108     Host: x.org
2109     User-Agent: WuxtaWeb/2.4
2110     Negotiate:
2111     Accept: text/html, application/postscript:q=0.8, */*
2112     Accept-language: en, fr;q=0.5
2113    
2114     This will increase the chance that the network negotiation
2115     algorithm will have sufficient information to choose on behalf of
2116     the user agent, thereby optimizing the negotiation process. A good
2117     strategy for dynamic extension would be to extend the request with
2118     with those media types, languages, charsets, and feature tags
2119     mentioned in the variant lists of past list responses from the
2120     server. The Accept header in the extended request, if present,
2121     will generally contain "*/*" to indicate that only partial
2122     information is given in this header. The Accept-Features header,
2123     if present, will generally contain a "*" for the same reason.
2124    
2125    
2126     12 User agent support for transparent negotiation
2127    
2128     This section specifies the requirements a user agent must satisfy
2129     in order to support transparent negotiation. If the user agent
2130     contains an internal cache, this cache should satisfy the
2131     requirements for proxy caches in Section 14.
2132    
2133    
2134     12.1 Handling of responses
2135    
2136     If a list response is received when a resource is accessed, the
2137     user agent must be able to automatically choose, retrieve, and
2138     display the best variant, or display an error message if it is not
2139     capable of displaying any of the available variants. The
2140     negotiation algorithm which chooses the best variant (or chooses to
2141     display an error message) need not be the network negotiation
2142     algorithm.
2143    
2144     If a choice response is received when a resource is accessed, the
2145     usual action is to automatically display the enclosed variant. A
2146     user agent may however choose to apply its (custom) negotiation
2147     algorithm to the received variant list, and to automatically
2148     retrieve and display another variant if the algorithm indicates
2149     that this other variant has a better quality.
2150    
2151     When receiving a choice response, a user agent should check if the
2152     if the negotiable resource and the chosen variant resource are
2153     neighbors. If this is not the case, the user agent should reject
2154     the choice response as a probable spoofing attempt and display an
2155     error message, for example by internally replacing the choice
2156     response with a 502 (bad gateway) response.
2157    
2158    
2159     12.2 Presentation of a transparently negotiated resource
2160    
2161     If the user agent is displaying, in a main window (i.e. not as an
2162     embedded or inlined object), a variant as the end result of a
2163     request on a transparently negotiated resource, the following
2164     requirements must be met.
2165    
2166     1. The user agent should make available though its user interface
2167     some indication that the resource being displayed is a
2168     negotiated resource.
2169    
2170     2. The user agent should allow the user to review a list of all
2171     variants bound to the negotiable resource, and to manually
2172     retrieve another variant if desired. There are two general
2173     ways of providing such a list. First, the information in the
2174     Alternates header of the negotiable resource could be used to
2175     make an annotated menu of variants. Second, the entity
2176     included in a list response of the negotiable resource could be
2177     displayed. Note that a list response can always be obtained by
2178     doing a GET request on the negotiable resource with a Negotiate
2179     header but without Accept headers. If only this second option
2180     is provided, the user agent should also provide the user with a
2181     means to review the real variant list as used by the
2182     negotiation algorithm (see Section 15.1).
2183    
2184     3. If the user agent shows the URI of the displayed information to
2185     the user, it should be the negotiable resource URI, not the
2186     variant URI.
2187    
2188     4. Similarly, if the user agent stores a reference to the
2189     displayed information for future use, for example in a hotlist,
2190     it should store the negotiable resource URI, not the
2191     variant URI.
2192    
2193     It is encouraged, but not required, that some of the above
2194     functionality is also made available for inlined or embedded
2195     objects, and when a variant which was selected manually is being
2196     displayed.
2197    
2198    
2199     13 Origin server support for transparent negotiation
2200    
2201     This section covers origin server support from a HTTP viewpoint.
2202     see Appendix 19.2 for implementation considerations.
2203    
2204    
2205     13.1 Requirements
2206    
2207     To implement transparent negotiation on a resource, the origin
2208     server must be able to send a list response when getting a GET
2209     request on the resource. It should also be able to send
2210     appropriate list responses for HEAD requests. The origin server
2211     must always send a list response, never a choice response, for a
2212     request with a Negotiate header but without Accept headers.
2213    
2214     The origin server may also return choice responses, except in the
2215     special case above. The negotiation algorithm used need not be the
2216     network negotiation algorithm.
2217    
2218     Negotiability is a binary property: a resource is either
2219     transparently negotiated, or it is not. Origin servers should not
2220     vary the negotiability of a resource, or the variant list bound to
2221     that resource, based on the request headers which are received.
2222     The variant list and the property of being negotiated may however
2223     change through time. The Cache-Control header and the max-age
2224     directive of the Alternates header can be used to control the
2225     propagation of such time-dependent changes through caches.
2226    
2227     It is the responsibility of the author of the negotiable resource
2228     to ensure that all resources in the variant list serve the intended
2229     content, and that the variant resources do not engage in
2230     transparent content negotiation themselves.
2231    
2232    
2233     13.2 Negotiation on transactions other than GET and HEAD
2234    
2235     If a resource is transparently negotiable, this only has an impact
2236     on the GET and HEAD transactions on the resource. Other
2237     transactions are not affected. If it is desired that transparent
2238     content negotiation is done on, for example, the end result of a
2239     POST request, then a 303 (See Other) POST response which redirects
2240     to a negotiable resource could be generated. See the HTTP/1.1
2241     specification [1] for details.
2242    
2243    
2244     14 Proxy support for transparent negotiation
2245    
2246     Transparent content negotiation is designed to work through proxies
2247     which only implement the HTTP/1.1 specification [1]. Thus, in a
2248     sense, all HTTP/1.1 proxies support transparent content
2249     negotiation.
2250    
2251     Plain HTTP/1.1 allows proxies to cache list and choice responses,
2252     and to efficiently revalidate them by using the If-None-Match
2253     header. This specification defines additional optimization
2254     mechanisms.
2255    
2256     First, a proxy may cache and reuse an Alternates header bound to a
2257     negotiable resource (Section 10.3). If it is fresh or first-hand,
2258     the Alternates header may be reused to negotiate on behalf of the
2259     user agent or origin server and to construct choice responses
2260     (Section 10.2.2). Proxies must not use custom negotiation
2261     algorithms, they may only use the network negotiation algorithm.
2262    
2263     Second, if a proxy receives a choice response, it may extract and
2264     cache the normal response embedded therein, as described in
2265     Section 10.4.
2266    
2267    
2268     15 Security and privacy considerations
2269    
2270     15.1 Accept headers revealing information of a private nature
2271    
2272     Accept headers, in particular Accept-Language headers, may reveal
2273     information which the user would rather keep private unless it will
2274     directly improve the quality of service. For example, a user may
2275     not want to send language preferences to sites which do not offer
2276     multi-lingual content. The transparent content negotiation
2277     mechanism allows user agents to omit sending of the Accept-Language
2278     header by default, without this affecting the outcome of the
2279     negotiation process if transparently negotiated multi-lingual
2280     content is accessed.
2281    
2282     However, even if Accept headers are never sent, the automatic
2283     selection and retrieval of a variant by a user agent will reveal a
2284     preference for this variant to the server. A malicious service
2285     author could provide a page with `fake' negotiability on
2286     (ethnicity-correlated) languages, with all variants actually being
2287     the same English document, as a means of obtaining
2288     privacy-sensitive information. Such a plot would however be
2289     visible to an alert victim if the list of available variants and
2290     their properties is reviewed.
2291    
2292     Some additional privacy considerations connected to Accept headers
2293     are discussed in [1].
2294    
2295    
2296     15.2 Spoofing of responses from variant resources
2297    
2298     The caching optimization in Section 10.4 gives the implementer of a
2299     negotiable resource control over the responses cached for all of
2300     its variant resources which are neighbors. This is a security
2301     problem if a neighboring variant resource belongs to another
2302     author. To provide security in this case, the HTTP server will
2303     have to filter the Content-Location headers in the choice responses
2304     generated by the negotiable resource implementation.
2305    
2306    
2307     16 Acknowledgments
2308    
2309     Work on HTTP content negotiation has been done since at least 1993.
2310     The author is unable to trace the origin of many of the ideas
2311     incorporated in this document. This document builds on an earlier
2312     specification of content negotiation as recorded in [2]. Many
2313     members of the HTTP working group have contributed to the work
2314     reflected in this document. The author wishes to thank the
2315     individuals who have commented on earlier versions of this
2316     document, including Brian Behlendorf, Daniel DuBois, Larry
2317     Masinter, and Roy T. Fielding.
2318    
2319    
2320     17 References
2321    
2322     [1] Fielding et al, Hypertext Transfer Protocol -- HTTP/1.1.
2323     Internet-Draft draft-ietf-http-v11-spec-06.txt, HTTP Working
2324     Group, July 4, 1996
2325    
2326     [2] Roy T. Fielding, Henrik Frystyk Nielsen, and Tim Berners-Lee.
2327     Hypertext Transfer Protocol -- HTTP/1.1. Internet-Draft
2328     draft-ietf-http-v11-spec-01.txt, HTTP Working Group, January,
2329     1996.
2330    
2331    
2332     18 Author's address
2333    
2334     Koen Holtman
2335     Technische Universiteit Eindhoven
2336     Postbus 513
2337     Kamer HG 6.57
2338     5600 MB Eindhoven (Holland)
2339    
2340     e-mail: koen@win.tue.nl
2341    
2342    
2343     19 Appendices
2344    
2345     19.1 Adding an Expires header to ensure HTTP/1.0 compatibility
2346    
2347     To ensure compatibility with HTTP/1.0 caching proxies which do not
2348     recognize the Vary header, an Expires header with a date in the
2349     past can be be added to the response, for example
2350    
2351     Expires: Thu, 01 Jan 1980 00:00:00 GMT
2352    
2353     If this is done by an origin server, it should usually also include
2354     a Cache-Control header for the benefit of HTTP/1.1 caches, for
2355     example
2356    
2357     Cache-Control: max-age=604800
2358    
2359     which overrides the freshness lifetime of zero seconds specified by
2360     the included Expires header.
2361    
2362    
2363     19.2 Origin server implementation considerations
2364    
2365     19.2.1 Implementation with a CGI script
2366    
2367     [##Has yet to be written. This section will contain a sample CGI
2368     shell script.##]
2369    
2370     19.2.2 Direct support by the HTTP server
2371    
2372     [##Has yet to be written. Will discuss the interface which a
2373     transparent content negotiation server module could offer to
2374     content authors. Will provide references to existing
2375     implementations of content negotiation modules.##]
2376    
2377     19.2.3 Negotiable content authoring
2378    
2379     [##Has yet to be written. Mainly intends to mention that authoring
2380     tools could automatically produce multiple variants together with
2381     an appropriate variant list.##]
2382    
2383    
2384     19.3 Open issues in transparent content negotiation
2385    
2386     At the time of writing of this specification, the following issues
2387     are still open.
2388    
2389     - The feature tag registration process has yet to be defined.
2390    
2391     - A core set of feature tags (Section 8.2) has not yet been
2392     defined, though there has been some related work on display
2393     attributes, see Appendix 19.4.1.
2394    
2395     - Though it is expected that the feature negotiation framework will
2396     solve many current and future negotiation problems, it is also
2397     expected that there will remain current and future negotiation
2398     problems not solved by feature negotiation. Currently, there is
2399     little experience in this area.
2400    
2401    
2402     19.4 Other negotiation specifications
2403    
2404     19.4.1 User-Agent Display Attributes Headers
2405    
2406     (Comments based on the internet draft
2407     draft-mutz-http-attributes-00.txt and on messages from Andy Mutz.)
2408    
2409     User-Agent Display Attributes provide a means for an HTTP client to
2410     inform a server about its display capabilities. The draft
2411     mentioned above defines a number of such attributes, and presents
2412     them as part of a HTTP/1.0 style negotiation framework (See Section
2413     4.2). However, the the author of the above draft has said that the
2414     draft does not intend to specify a negotiation framework, but
2415     instead intends to use the framework proposed for negotiating
2416     the existing header information. PEP (Section 19.4.2) and
2417     transparent content negotiation are mentioned as possible
2418     frameworks.
2419    
2420     In the opinion of the author of this document, the feature
2421     negotiation framework would be an appropriate mechanism for
2422     negotiation on display attributes. It seems possible and desirable
2423     to encapsulate display attributes in the feature negotiation
2424     mechanism, and to make them part of the core set of feature tags
2425     (Section 8.2).
2426    
2427     The work on feature negotiation has its historical origins in the
2428     desire to negotiate on display agent attributes with a minimum of
2429     overhead to the request size. The work started after a discussion
2430     of color content negotiation on the http-wg mailing list showed
2431     that many participants found the introduction of a header like
2432     Accept-Color unacceptable. Reasons cited were the request size
2433     overhead, and the potential explosion of special-case Accept-*
2434     headers, all of which would require special-case implementations,
2435     implied by the introduction of Accept-Color.
2436    
2437    
2438     19.4.2 PEP: An Extension Mechanism for HTTP/1.1
2439    
2440     (Comments based on the internet draft draft-khare-http-pep-01.txt.)
2441    
2442     PEP is a system for HTTP clients, servers, and proxies to reliably
2443     reason about custom extensions to HTTP. Its purpose places PEP one
2444     meta-level above transparent content negotiation, which is intended
2445     as a (standardized) extension of HTTP.
2446    
2447     Transparent content negotiation and HTTP/1.1 were both carefully
2448     designed to work together without requiring meta-negotiation.
2449     Therefore, transparent content negotiation does not require or rely
2450     on the use of PEP.
2451    
2452     Though PEP and transparent content negotiation both offer
2453     extensible negotiation frameworks, they operate in different areas
2454     of negotiation. PEP negotiates on the use of mutually understood
2455     protocol extensions, while transparent content negotiation is a
2456     method for efficiently retrieving the best representation of some
2457     information. Thus, deployment and use of PEP is orthogonal to
2458     deployment and use of transparent content negotiation.
2459    
2460     Though some elements of PEP resemble some elements of transparent
2461     content negotiation, it does not seem advantageous to attempt to
2462     generalize (parts of) both specifications in order to allow sharing
2463     of code by implementations. The two specifications seem to have
2464     more unrelated parts than similar parts. For example, the handling
2465     of incomplete information in Accept headers in transparent content
2466     negotiation has no counterpart in PEP. On the other hand, PEP's
2467     processing of `scope' has no counterpart in transparent content
2468     negotiation.
2469    
2470    
2471     19.5 Related issues
2472    
2473     19.5.1 Current negotiation practice
2474    
2475     In current practice, most user agents send short Accept headers in
2476     every request. These headers usually inadequately describe the
2477     user agent capabilities and user preferences, except maybe for
2478     inline image requests. Servers providing multiple representations
2479     of the same information usually do so under different URIs, and
2480     allow users to manually select a representation by clicking a
2481     particular link.
2482    
2483     Some HTTP servers implement extensive negotiation capabilities
2484     based on HTTP/1.0 headers. However, with current user agents,
2485     these capabilities can seldom be used effectively.
2486    
2487     Some origin servers use the contents of the User-Agent request
2488     header for negotiation purposes. These contents sometimes allow
2489     the server to infer information about capabilities which cannot be
2490     expressed with the existing Accept headers.
2491    
2492     Some sites use Netscape cookies (persistent client state http
2493     cookies) to implement a user preferences mechanism.
2494    
2495     19.5.2 Bandwidth negotiation
2496    
2497     With a bandwidth negotiation mechanism, the time needed to retrieve
2498     a particular variant over the network can be taken into account
2499     during the negotiation process. Work on mechanisms for bandwidth
2500     negotiation has been done since at least 1993, but this work has
2501     not yet yielded a successful standard mechanism for bandwidth
2502     negotiation. Cascaded proxy caches introduce additional complexity
2503     in this area.
2504    
2505     This specification does not attempt to solve the problem of
2506     bandwidth negotiation. There is some hope that the feature
2507     negotiation framework will allow the introduction of an adequate
2508     solution for bandwidth negotiation.
2509    
2510     19.5.3 Content transformation by proxies
2511    
2512     Recently, there has been some attention to content transformation by
2513     proxies. An example is the transformation of an image/gif response
2514     to a shorter image/jpeg response, with potential degraded quality, to
2515     save bandwidth. Another example is the transformation of an
2516     application/postscript response to a text/html response, with
2517     definite degraded quality, to allow viewing by a user agent which
2518     cannot handle postscript.
2519    
2520     The impact of such transformations on the quality of content on the
2521     web, and the impact on the current model for the allocation of trust
2522     to various parties in a HTTP transaction, has not yet been fully
2523     explored.
2524    
2525     Content transformation could be a useful optimization for transparent
2526     content negotiation. A response with a variant list
2527    
2528     {"map.gif" 1.0 {type image/gif} {features !monochrome}},
2529     {"map.mono.gif" 0.8 {type image/gif} {features monochrome}}
2530    
2531     could include an additional response header
2532    
2533     Allow-Transform: "map.gif" -> "map.mono.gif" with "dither-2"
2534    
2535     to allow a proxy which has cached "map.gif" to create "map.mono.gif"
2536     on demand, by applying a particular standardized transformation to
2537     the "map.gif" data. Another interesting possibility would be
2538    
2539     Allow-Transform: "map.gif" -> "map.mono.gif"
2540     with "http://x.org/java/filters/my_dither"
2541    
2542    
2543    
2544    
2545     Expires: February 14, 1997
2546    

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24