📄 negotiate.pm
字号:
if (!defined($sel_q) || $sel_specificness < $specificness) { $sel_q = $accept{'type'}{$at}{'q'}; $sel_mbx = $accept{'type'}{$at}{'mbx'}; $sel_specificness = $specificness; } } $q = $sel_q || 0; $mbx = $sel_mbx; } my $Q; if (!defined($mbx) || $mbx >= $bs) { $Q = $qs * $qe * $qc * $ql * $q; } else { $Q = 0; print "Variant's size is too large ==> Q=0\n" if $DEBUG; } if ($DEBUG) { $mbx = "undef" unless defined $mbx; printf "Q=%.4f", $Q; print " (q=$q, mbx=$mbx, qe=$qe, qc=$qc, ql=$ql, qs=$qs)\n"; } push(@Q, [$id, $Q, $bs]); } @Q = sort { $b->[1] <=> $a->[1] || $a->[2] <=> $b->[2] } @Q; return @Q if wantarray; return undef unless @Q; return undef if $Q[0][1] == 0; $Q[0][0];}1;__END__=head1 NAMEHTTP::Negotiate - choose a variant to serve=head1 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], ]; @prefered = choose($variants, $request_headers); $the_one = choose($variants);=head1 DESCRIPTIONThis module provides a complete implementation of the HTTP contentnegotiation algorithm specified in F<draft-ietf-http-v11-spec-00.ps>chapter 12. Content negotiation allows for the selection of apreferred content representation based upon attributes of thenegotiable variants and the value of the various Accept* header fieldsin the request.The variants are ordered by preference by calling the functionchoose().The first parameter is reference to an array of the variants tochoose 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 describedbelow. The $content_encoding and $content_language can be either asingle scalar value or an array reference if there are several values.The second optional parameter is either a HTTP::Headers or a HTTP::Requestobject which is searched for "Accept*" headers. If thisparameter is missing, then the accept specification is initializedfrom 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 [variantidentifier, calculated quality, size] tuples. The values are sorted byquality, highest quality first. If the calculated quality is the samefor two variants, then they are sorted by size (smallest first). I<E.g.>: (['var1', 1, 2000], ['var2', 0.3, 512], ['var3', 0.3, 1024]);Note that also zero quality variants are included in the return listeven if these should never be served to the client.In a scalar context, it returns the identifier of the variant with thehighest score or C<undef> if none have non-zero quality.If the $HTTP::Negotiate::DEBUG variable is set to TRUE, then a lot ofnoise is generated on STDOUT during evaluation of choose().=head1 VARIANTSA variant is described by a list of the following values. If theattribute does not make sense or is unknown for a variant, then useC<undef> instead.=over 3=item identifierThis is a string that you use as the name for the variant. Thisidentifier for the preferred variants returned by choose().=item qsThis is a number between 0.000 and 1.000 that describes the "sourcequality". This is what F<draft-ietf-http-v11-spec-00.ps> says about thisvalue:Source quality is measured by the content provider as representing theamount of degradation from the original source. For example, apicture in JPEG form would have a lower qs when translated to the XBMformat, and much lower qs when translated to an ASCII-artrepresentation. Note, however, that this is a function of the source- an original piece of ASCII-art may degrade in quality if it iscaptured in JPEG form. The qs values should be assigned to eachvariant by the content provider; if no qs value has been assigned, thedefault is generally "qs=1".=item content-typeThis is the media type of the variant. The media type does notinclude a charset attribute, but might contain other parameters.Examples are: text/html text/html;version=2.0 text/plain image/gif image/jpg=item content-encodingThis is one or more content encodings that has been applied to thevariant. The content encoding is generally used as a modifier to thecontent media type. The most common content encodings are: gzip compress=item content-charsetThis is the character set used when the variant contains text.The charset value should generally be C<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=item content-languageThis describes one or more languages that are used in the variant.Language is described like this in F<draft-ietf-http-v11-spec-00.ps>: Alanguage is in this context a natural language spoken, written, orotherwise conveyed by human beings for communication of information toother human beings. Computer languages are explicitly excluded.The language tags are defined by RFC 3066. Examplesare: no Norwegian en International English en-US US English en-cockney=item content-lengthThis is the number of bytes used to represent the content.=back=head1 ACCEPT HEADERSThe following Accept* headers can be used for describing contentpreferences in a request (This description is an edited extract fromF<draft-ietf-http-v11-spec-00.ps>):=over 3=item AcceptThis header can be used to indicate a list of media ranges which areacceptable as a response to the request. The "*" character is used togroup media types into ranges, with "*/*" indicating all media typesand "type/*" indicating all subtypes of that type.The parameter q is used to indicate the quality factor, whichrepresents the user's preference for that range of media types. Theparameter mbx gives the maximum acceptable size of the responsecontent. The default values are: q=1 and mbx=infinity. If no Acceptheader is present, then the client accepts all media types with q=1.For example: Accept: audio/*;q=0.2;mbx=200000, audio/basicwould mean: "I prefer audio/basic (of any size), but send me any audiotype if it is the best available after an 80% mark-down in quality andits size is less than 200000 bytes"=item Accept-CharsetUsed to indicate what character sets are acceptable for the response.The "us-ascii" character set is assumed to be acceptable for all useragents. If no Accept-Charset field is given, the default is that anycharset is acceptable. Example: Accept-Charset: iso-8859-1, unicode-1-1=item Accept-EncodingRestricts the Content-Encoding values which are acceptable in theresponse. If no Accept-Encoding field is present, the server mayassume that the client will accept any content encoding. An emptyAccept-Encoding means that no content encoding is acceptable. Example: Accept-Encoding: compress, gzip=item Accept-LanguageThis field is similar to Accept, but restricts the set of naturallanguages that are preferred in a response. Each language may begiven an associated quality value which represents an estimate of theuser's comprehension of that language. For example: Accept-Language: no, en-gb;q=0.8, de;q=0.55would mean: "I prefer Norwegian, but will accept British English (with80% comprehension) or German (with 55% comprehension).=back=head1 COPYRIGHTCopyright 1996,2001 Gisle Aas.This library is free software; you can redistribute it and/ormodify it under the same terms as Perl itself.=head1 AUTHORGisle Aas <gisle@aas.no>=cut
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -