dwww Home | Manual pages | Find package

HTTP::Negotiate(3pm)  User Contributed Perl Documentation  HTTP::Negotiate(3pm)

NAME
       HTTP::Negotiate - choose a variant to serve

SYNOPSIS
        use HTTP::Negotiate qw(choose);

        #  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],
         ];

        @preferred = choose($variants, $request_headers);
        $the_one   = choose($variants);

DESCRIPTION
       This module provides a complete implementation of the HTTP content
       negotiation algorithm specified in draft-ietf-http-v11-spec-00.ps
       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.

       The variants are ordered by preference by calling the function choose().

       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.

       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.

       In an array context, choose() returns a list of [variant identifier,
       calculated quality, size] tuples.  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). E.g.:

         (['var1', 1, 2000], ['var2', 0.3, 512], ['var3', 0.3, 1024]);

       Note that also zero quality variants are included in the return list
       even if these should never be served to the client.

       In a scalar context, it returns the identifier of the variant with the
       highest score or "undef" if none have non-zero quality.

       If the $HTTP::Negotiate::DEBUG variable is set to TRUE, then a lot of
       noise is generated on STDOUT during evaluation of choose().

VARIANTS
       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
       "undef" instead.

       identifier
          This  is  a  string  that  you use as the name for the variant.  This
          identifier for the preferred variants returned by choose().

       qs This is a number between 0.000 and 1.000 that describes  the  "source
          quality".   This  is  what  draft-ietf-http-v11-spec-00.ps says about
          this value:

          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".

       content-type
          This is the media type of the  variant.   The  media  type  does  not
          include  a  charset  attribute,  but  might contain other parameters.
          Examples are:

            text/html
            text/html;version=2.0
            text/plain
            image/gif
            image/jpg

       content-encoding
          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:

            gzip
            compress

       content-charset
          This  is  the character set used when the variant contains text.  The
          charset value should generally be "undef" or one of these:

            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

       content-language
          This describes one or more languages that are used  in  the  variant.
          Language  is described like this in draft-ietf-http-v11-spec-00.ps: 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.

          The language tags are defined by RFC 3066.  Examples are:

            no               Norwegian
            en               International English
            en-US            US English
            en-cockney

       content-length
          This is the number of bytes used to represent the content.

ACCEPT HEADERS
       The following  Accept*  headers  can  be  used  for  describing  content
       preferences  in  a  request  (This description is an edited extract from
       draft-ietf-http-v11-spec-00.ps):

       Accept
          This header can be used to indicate a list of media ranges which  are
          acceptable  as  a response 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.

          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.

          For example:

            Accept: audio/*;q=0.2;mbx=200000, audio/basic

          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"

       Accept-Charset
          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:

            Accept-Charset: iso-8859-1, unicode-1-1

       Accept-Encoding
          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:

            Accept-Encoding: compress, gzip

       Accept-Language
          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:

            Accept-Language: no, en-gb;q=0.8, de;q=0.55

          would  mean:  "I  prefer  Norwegian,  but will accept British English
          (with 80% comprehension) or German (with 55% comprehension).

COPYRIGHT
       Copyright 1996,2001 Gisle Aas.

       This library is free software; you can redistribute it and/or modify  it
       under the same terms as Perl itself.

AUTHOR
       Gisle Aas <gisle@aas.no>

perl v5.36.0                       2022-12-06              HTTP::Negotiate(3pm)

Generated by dwww version 1.16 on Tue Dec 16 05:52:01 CET 2025.