HTTP::Negotiate(choose)

Hippo2000 (2000/7/28)

HTTP::Negotiateモジュールなのです。

作者はGisle Aasさんです。メールで許可をいただきました。


目次


名前

choose - サービスするドキュメントの変数を選択する(HTTPコンテント・ネゴシエーション)


概要

 use HTTP::Negotiate;
 #  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);

説明

このモジュールは draft-ietf-http-v11-spec-00.ps chapter12で指定されたHTTPコンテント・ネゴシエーションの完全な実装を提供します。コンテント・ネゴシエーションはネゴシエートできる変数とさまざまなAccept*ヘッダ・フィールドの値の属性に基づいた、優先された内容表記の選択を許します。

変数は関数choose()の呼び出しにより、優先順序が並べられます。

最初のパラメータは選択される変数の配列へのリファレンスです。この配列の各要素は[$id, $qs, $content_type, $content_encoding, $charset, $content_language, $content_length] という値をもった配列です。その意味については以下で説明します。$content_encodingと$content_languageは1つのスカラ値または複数の値があれば配列へのリファレンスにすることができます。

2番目のオプションのパラメータはHTTP::HeaderまたはHTTP::Requestオブジェクトのどちらで、"Accept*"ヘッダが探されます。このパラメータがなければ、acceptの指定はCGI環境変数 HTTP_ACCEPT, HTTP_ACCEPT_CHARSET, HTTP_ACCEPT_ENCODING 、 HTTP_ACCEPT_LANGUAGE. によって初期化されます。

配列コンテキストでは、choose()は識別子/計算されたクォリティの組の変数のリストを返します。最も高いクオリティを先頭に、値はクオリティによりソートされます。計算されたクォリティが2つの変数で同じであれば、サイズによりソートされます(小さい方が先)。例:

  (['var1' => 1], ['var2', 0.3], ['var3' => 0]);

クライアントに決して提供されなくても、ゼロのクオリティ変数が返されるリストに含まれることに注意してください。

スカラ・コンテキストでは最も高いスコアの変数の識別子を返すか、何もクオリティがゼロでなければ、undefを返します。

$HTTP::Negotiate::DEBUG 変数がTRUEに設定されれば、choose()の評価の間、多くのノイズがSTDOUTに生成されます。


変数

変数は以下の値のリストにより説明されます。属性がおかしいか、その変数には当てはまらなければ変わりにundefを使ってください。

identifier
その変数のための名前として使う文字列。この選択された変数への識別子はchoose()により返されます。
qs
これは0.000から1.000までの数値で、"source quality"を記述します。これはdraft-ietf-http-v11-spec-00.ps がこの値について記述しています。

Source qualityは、コンテント・プロバイダによって図られ、オリジナルのソースからの劣化の量を表します。例えばJPEG形式の絵はXBM形式に変換されるとより低いqsを持ちます。ASCII-art表現に変換されるとさらに低いqsになります。しかしながらソースの関数であることに注意してください。−それがJPEG形式でキャプチャされたら、元のASCII-artのカケラのほうが品質として劣るかもしれません。qsの値はコンテント・プロバイダにより各変数が設定されなければなりません。qsに値が代入されなければ、デフォルトは一般的に"qs=1"です。

content-type
その変数のメディア・タイプです。メディア・タイプは文字セット属性を持っていませんが、他のパラメータを持つかも知れません。例:
  text/html
  text/html;version=2.0
  text/plain
  image/gif
  image/jpg
content-encoding
その変数に適用される1つまたは複数のコンテント・エンコーディング。コンテント・エンコーディングは一般的にコンテント・メディア・タイプへの修飾子として使われます。よく使われるコンテント・エンコーディングは以下のものがあります:
  gzip
  compress
content-charset
変数にテキストが入っていると使われる文字セットです。文字セット値は一般的にundefであるか、いかのいずれかでなければなりません:
  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
変数で使われる1つまたは複数の言語。言語はdraft-ietf-http-v11-spec-00.ps:で記述されているようなものです。この文脈での言語は、ある人から他の人への情報のコミュニケーションのために話され、書かれ、またはそのほかで伝達される自然言語です。コンピュータ言語は明らかに除外されます:

languageタグはRFC-1766で定義されています。例えば:

  no               Norwegian
  en               International English
  en-US            US English
  en-cockney
content-length
これはコンテントを表すために使われるバイト数。

Accept ヘッダ

以下のAccept*ヘッダはリクエストの中でコンテント優先順位を記述するために使われます。(この説明はdraft-ietf-http-v11-spec-00.psから取り出し編集したものです)

Accept
このヘッダは、リクエストへのレスポンスとして受取ることが出来るメディア範囲のリストを示すために使われます。"*"文字はメディア・タイプのまとめて範囲に入れるために使われます。"*/*"はすべてのメディア・タイプを示し、"type/*"はそのtypeのサブタイプのすべてのを示します。

パラメータqはクオリティ要素を示すために使われます。これはユーザのそのメディア・タイプの範囲のための優先順位を表します。パラメータmbxはレスポンス・コンテントの受信可能な最大サイズを与えます。デフォルトの値はq=1でmbxは無限大です。Acceptがなければ、クライアントはすべてのメディア・タイプをq=1で受取ります。

例:

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

これは"私は(すべての大きさの)audio/basicを好みますが、もし利用できる一番よいものから80%クオリティが落ち、2000000バイトよりも小さいければ、すべてのaudioタイプを送信しなさい"という意味です。

Accept-Charset
レスポンスのためにどの文字セットが受取られるかを示します。"us-ascii"文字セットはすべてのユーザ・エージェントに受け入れられると考えられます。Accept-Charsetフィールドがなければ、デフォルトはすべての文字セットが受取られます。例:
  Accept-Charset: iso-8859-1, unicode-1-1
Accept-Encoding
レスポンスで受取ることが出来るContent-Encodingの値を制限します。Accept-Encodingフィールドがなければ、サーバはクライアントがすべてのcontent encodingを受取ると想定することが出来ます。Accept-Encodingが空であれば、content encodingは何も受取ることが出来ないことを意味します。

例:

  Accept-Encoding: compress, gzip
Accept-Language
このフィールドはAcceptに似ています。しかしレスポンスで選ばれる自然言語のセットを制限します。各言語は、関連付けられた、ユーザがその言語を理解度の評価を表すクォリティの値を与えられるかもしれません。
  Accept-Language: no, en-gb;q=0.8, de;q=0.55

これは"私はノルウェー語を好みますが、しかし英国英語(British English)を(80%の理解度で)やドイツ語(55%の理解度で)も受取ります"ということを示します。


著作権(COPYRIGHT)

(原文のまま)

Copyright 1996, 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 <aas@sn.no>


ホーム Perlの小技 HTTP

ご意見、ご質問はこちらの掲示板で受け付けています。
またメールは河馬屋(Nifty)にお願いします。