home *** CD-ROM | disk | FTP | other *** search
-
- <HTML>
- <HEAD>
- <TITLE>choose - choose a variant of a document to serve</TITLE>
- <LINK REL="stylesheet" HREF="../../../Active.css" TYPE="text/css">
- <LINK REV="made" HREF="mailto:">
- </HEAD>
-
- <BODY>
- <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=100%>
- <TR><TD CLASS=block VALIGN=MIDDLE WIDTH=100% BGCOLOR="#cccccc">
- <STRONG><P CLASS=block> choose - choose a variant of a document to serve</P></STRONG>
- </TD></TR>
- </TABLE>
-
- <A NAME="__index__"></A>
- <!-- INDEX BEGIN -->
-
- <UL>
-
- <LI><A HREF="#name">NAME</A></LI><LI><A HREF="#supportedplatforms">SUPPORTED PLATFORMS</A></LI>
-
- <LI><A HREF="#synopsis">SYNOPSIS</A></LI>
- <LI><A HREF="#description">DESCRIPTION</A></LI>
- <LI><A HREF="#variants">VARIANTS</A></LI>
- <LI><A HREF="#accept headers">ACCEPT HEADERS</A></LI>
- <LI><A HREF="#copyright">COPYRIGHT</A></LI>
- <LI><A HREF="#author">AUTHOR</A></LI>
- </UL>
- <!-- INDEX END -->
-
- <HR>
- <P>
- <H1><A NAME="name">NAME</A></H1>
- <P>choose - choose a variant of a document to serve (HTTP content negotiation)</P>
- <P>
- <HR>
- <H1><A NAME="supportedplatforms">SUPPORTED PLATFORMS</A></H1>
- <UL>
- <LI>Linux</LI>
- <LI>Solaris</LI>
- <LI>Windows</LI>
- </UL>
- <HR>
- <H1><A NAME="synopsis">SYNOPSIS</A></H1>
- <PRE>
- use HTTP::Negotiate;</PRE>
- <PRE>
- # ID QS Content-Type Encoding Char-Set Lang Size
- $variants =
- [['var1', 1.000, 'text/html', undef, 'iso-8859-1', 'en', 3000],
- ['var2', 0.950, 'text/plain', 'gzip', 'us-ascii', 'no', 400],
- ['var3', 0.3, 'image/gif', undef, undef, undef, 43555],
- ];</PRE>
- <PRE>
- @prefered = choose($variants, $request_headers);
- $the_one = choose($variants);</PRE>
- <P>
- <HR>
- <H1><A NAME="description">DESCRIPTION</A></H1>
- <P>This module provides a complete implementation of the HTTP content
- negotiation algorithm specified in <EM>draft-ietf-http-v11-spec-00.ps</EM>
- chapter 12. Content negotiation allows for the selection of a
- preferred content representation based upon attributes of the
- negotiable variants and the value of the various Accept* header fields
- in the request.</P>
- <P>The variants are ordered by preference by calling the function
- choose().</P>
- <P>The first parameter is reference to an array of the variants to
- choose among.
- Each element in this array is an array with the values [$id, $qs,
- $content_type, $content_encoding, $charset, $content_language,
- $content_length] whose meanings are described
- below. The $content_encoding and $content_language can be either a
- single scalar value or an array reference if there are several values.</P>
- <P>The second optional parameter is either a HTTP::Headers or a HTTP::Request
- object which is searched for ``Accept*'' headers. If this
- parameter is missing, then the accept specification is initialized
- from the CGI environment variables HTTP_ACCEPT, HTTP_ACCEPT_CHARSET,
- HTTP_ACCEPT_ENCODING and HTTP_ACCEPT_LANGUAGE.</P>
- <P>In an array context, <CODE>choose()</CODE> returns a list of variant
- identifier/calculated quality pairs. The values are sorted by
- quality, highest quality first. If the calculated quality is the same
- for two variants, then they are sorted by size (smallest first). <EM>E.g.</EM>:</P>
- <PRE>
- (['var1' => 1], ['var2', 0.3], ['var3' => 0]);</PRE>
- <P>Note that also zero quality variants are included in the return list
- even if these should never be served to the client.</P>
- <P>In a scalar context, it returns the identifier of the variant with the
- highest score or <A HREF="../../../lib/Pod/perlfunc.html#item_undef"><CODE>undef</CODE></A> if none have non-zero quality.</P>
- <P>If the $HTTP::Negotiate::DEBUG variable is set to TRUE, then a lot of
- noise is generated on STDOUT during evaluation of choose().</P>
- <P>
- <HR>
- <H1><A NAME="variants">VARIANTS</A></H1>
- <P>A variant is described by a list of the following values. If the
- attribute does not make sense or is unknown for a variant, then use
- <A HREF="../../../lib/Pod/perlfunc.html#item_undef"><CODE>undef</CODE></A> instead.</P>
- <DL>
- <DT><STRONG><A NAME="item_identifier">identifier</A></STRONG><BR>
- <DD>
- This is a string that you use as the name for the variant. This
- identifier for the preferred variants returned by choose().
- <P></P>
- <DT><STRONG><A NAME="item_qs">qs</A></STRONG><BR>
- <DD>
- This is a number between 0.000 and 1.000 that describes the ``source
- quality''. This is what <EM>draft-ietf-http-v11-spec-00.ps</EM> says about this
- value:
- <P>Source quality is measured by the content provider as representing the
- amount of degradation from the original source. For example, a
- picture in JPEG form would have a lower qs when translated to the XBM
- format, and much lower qs when translated to an ASCII-art
- representation. Note, however, that this is a function of the source
- - an original piece of ASCII-art may degrade in quality if it is
- captured in JPEG form. The qs values should be assigned to each
- variant by the content provider; if no qs value has been assigned, the
- default is generally ``qs=1''.</P>
- <P></P>
- <DT><STRONG><A NAME="item_content%2Dtype">content-type</A></STRONG><BR>
- <DD>
- This is the media type of the variant. The media type does not
- include a charset attribute, but might contain other parameters.
- Examples are:
- <PRE>
- text/html
- text/html;version=2.0
- text/plain
- image/gif
- image/jpg</PRE>
- <P></P>
- <DT><STRONG><A NAME="item_content%2Dencoding">content-encoding</A></STRONG><BR>
- <DD>
- This is one or more content encodings that has been applied to the
- variant. The content encoding is generally used as a modifier to the
- content media type. The most common content encodings are:
- <PRE>
- gzip
- compress</PRE>
- <P></P>
- <DT><STRONG><A NAME="item_content%2Dcharset">content-charset</A></STRONG><BR>
- <DD>
- This is the character set used when the variant contains text.
- The charset value should generally be <A HREF="../../../lib/Pod/perlfunc.html#item_undef"><CODE>undef</CODE></A> or one of these:
- <PRE>
- us-ascii
- iso-8859-1 ... iso-8859-9
- iso-2022-jp
- iso-2022-jp-2
- iso-2022-kr
- unicode-1-1
- unicode-1-1-utf-7
- unicode-1-1-utf-8</PRE>
- <P></P>
- <DT><STRONG><A NAME="item_content%2Dlanguage">content-language</A></STRONG><BR>
- <DD>
- This describes one or more languages that are used in the variant.
- Language is described like this in <EM>draft-ietf-http-v11-spec-00.ps</EM>: A
- language is in this context a natural language spoken, written, or
- otherwise conveyed by human beings for communication of information to
- other human beings. Computer languages are explicitly excluded.
- <P>The language tags are defined by RFC-1766. Examples
- are:</P>
- <PRE>
- no Norwegian
- en International English
- en-US US English
- en-cockney</PRE>
- <P></P>
- <DT><STRONG><A NAME="item_content%2Dlength">content-length</A></STRONG><BR>
- <DD>
- This is the number of bytes used to represent the content.
- <P></P></DL>
- <P>
- <HR>
- <H1><A NAME="accept headers">ACCEPT HEADERS</A></H1>
- <P>The following Accept* headers can be used for describing content
- preferences in a request (This description is an edited extract from
- <EM>draft-ietf-http-v11-spec-00.ps</EM>):</P>
- <DL>
- <DT><STRONG><A NAME="item_Accept">Accept</A></STRONG><BR>
- <DD>
- This header can be used to indicate a list of media ranges which are
- acceptable as a reponse to the request. The ``*'' character is used to
- group media types into ranges, with ``*/*'' indicating all media types
- and ``type/*'' indicating all subtypes of that type.
- <P>The parameter q is used to indicate the quality factor, which
- represents the user's preference for that range of media types. The
- parameter mbx gives the maximum acceptable size of the response
- content. The default values are: q=1 and mbx=infinity. If no Accept
- header is present, then the client accepts all media types with q=1.</P>
- <P>For example:</P>
- <PRE>
- Accept: audio/*;q=0.2;mbx=200000, audio/basic</PRE>
- <P>would mean: ``I prefer audio/basic (of any size), but send me any audio
- type if it is the best available after an 80% mark-down in quality and
- its size is less than 200000 bytes''</P>
- <P></P>
- <DT><STRONG><A NAME="item_Accept%2DCharset">Accept-Charset</A></STRONG><BR>
- <DD>
- Used to indicate what character sets are acceptable for the response.
- The ``us-ascii'' character set is assumed to be acceptable for all user
- agents. If no Accept-Charset field is given, the default is that any
- charset is acceptable. Example:
- <PRE>
- Accept-Charset: iso-8859-1, unicode-1-1</PRE>
- <P></P>
- <DT><STRONG><A NAME="item_Accept%2DEncoding">Accept-Encoding</A></STRONG><BR>
- <DD>
- Restricts the Content-Encoding values which are acceptable in the
- response. If no Accept-Encoding field is present, the server may
- assume that the client will accept any content encoding. An empty
- Accept-Encoding means that no content encoding is acceptable. Example:
- <PRE>
- Accept-Encoding: compress, gzip</PRE>
- <P></P>
- <DT><STRONG><A NAME="item_Accept%2DLanguage">Accept-Language</A></STRONG><BR>
- <DD>
- This field is similar to Accept, but restricts the set of natural
- languages that are preferred in a response. Each language may be
- given an associated quality value which represents an estimate of the
- user's comprehension of that language. For example:
- <PRE>
- Accept-Language: no, en-gb;q=0.8, de;q=0.55</PRE>
- <P>would mean: ``I prefer Norwegian, but will accept British English (with
- 80% comprehension) or German (with 55% comprehension).</P>
- <P></P></DL>
- <P>
- <HR>
- <H1><A NAME="copyright">COPYRIGHT</A></H1>
- <P>Copyright 1996, Gisle Aas.</P>
- <P>This library is free software; you can redistribute it and/or
- modify it under the same terms as Perl itself.</P>
- <P>
- <HR>
- <H1><A NAME="author">AUTHOR</A></H1>
- <P>Gisle Aas <<A HREF="mailto:aas@sn.no">aas@sn.no</A>></P>
- <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=100%>
- <TR><TD CLASS=block VALIGN=MIDDLE WIDTH=100% BGCOLOR="#cccccc">
- <STRONG><P CLASS=block> choose - choose a variant of a document to serve</P></STRONG>
- </TD></TR>
- </TABLE>
-
- </BODY>
-
- </HTML>
-