この文書は、 D. Eastlake 3rd, C. Smith, D. Soroka: HTTP MIME Type Handler Detection (RFC 2936), September 2000. を 橋本英彦 が日本語訳した物です。 この文書の取り扱いについては、[Studying HTTP] の RFC 日本語訳を利用するにあたってに従って下さい。
Network Working Group Request for Comments: 2936 Category: Informational
D. Eastlake
Motorola
C. Smith
Royal Bank of Canada
D. Soroka
IBM
September 2000
この文書はインターネットコミュニティのための情報を提供する物である。 この文書はいかなる種のインターネットの標準も明述する物ではない。 この文書の配布に制限は無い。
Copyright © The Internet Society (2000). All Rights Reserved.
ハイパーテキスト転送プロトコル (HTTP) を通してサービスを提供するための web ページを作成するためのエンティティは度々、ユーザのブラウザにてどんな多目的インターネットメール拡張 (MIME) タイプのハンドラがインストールされているかを知らないという問題を持っている。 例えば、Internet Open Trading Protocol (IOTP) や VRML や SET やいくつかのストリーミングメディアのハンドラが利用可能かどうかである。 いくつかの場面では、それらは異なる web ページ、あるいはMIME ハンドラの利用可能性に基づいた内容を表示したいだろう。 この文書は、2000 年始めの時点でインターネット上に実際に利用されるほとんどのブラウザが抱えるこの問題を解決するために妥当な技術を要約する。 これは発展されるであろう技術に基づくより優れた標準が広まるまでの間、実装者によっての現実的な使い方であるとする意図を持つ。
{Tony Lewis of Visa} の有益なる注釈が組み込まれている。
[HTTP] を通じてサービスを提供する web ページを形成するエンティティはしばしばユーザのブラウザにどんな [MIME] タイプのハンドラがインストールされているかを知らないという問題を抱えている。 例えば、[IOTP] やVRML や [SET] や他のストリーミングメディアが利用可能かどうかである。 多くの場合、ページ作成者は MIME ハンドラの利用可能性に応じて、異なるweb ページや内容を表示したいと思うだろう。 サポートされていない MIMEタイプを含むレスポンスを送る事は、しばしばユーザの経験の流れを中断するという結果を生み、ブラウザは送られているデータをどのように処理するかについて問い合わせ、その結果起こるであろう振る舞いが、正しい MIMEタイプハンドラがインストールされているという事を伝える事に失敗する。
この文書は 2000 年の前半の時点でインターネット上で実際に利用されている多くのブラウザにおいてこの問題を解決するための道理にかなった技術を記述する。 これは、改良された技術に基づいた、より上級な標準が広まるまでの間、実装者への実用のためという狙いがある。 これは application/iotpか application/x-iotp のためのハンドラが存在するかどうかを決定するという点から書かれているが、他の MIME タイプにも同等に適用できる。
その問題は、受け入れられる [MIME] タイプを列挙したハイパーテキスト転送プロトコル [HTTP] リクエスト "Accept" ヘッダによって解決されるべきである。 このヘッダは HTTP の 1.0 と 1.1 の両方で与えられており、その内容は受け入れられる MIME タイプ及びサブタイプの列挙とされている。 唯一の問題は、多くのブラウザは "*/*" や似たようなもののみを送るという事である。
もしあなたが探している特定の MIME タイプが Accept ヘッダ内に明記されていたら、一般にそのハンドラが実際にインストールされている、あるいはブラウザの一部であるという事を仮定できる。
注: この文書の主題には含まれないが、もしあなたがある MIME タイプを扱えるソフトウェアを設計していて、かつあなたのソフトウェアが扱う MIMEタイプ群を Accept ヘッダへ差し込めるように要求できるようなブラウザインタフェースにアクセスできるのであれば、一般にそうするべきである。 それはそのような MIME タイプに敏感なサーバにとって正しくレスポンスする事を簡単にするであろう。
最近の多くのブラウザは、一つ以上のスクリプティング言語をサポートしているが、最も広く受け入れられているのは "JavaScript" である。 このスクリプティング言語は web ページ内に表され、ブラウザ環境を調べる事や、場合によっては表示するために異なるページ内容をもたらす事等ができるプログラミング言語構造の解釈的実行を許可する。 例えば、付録 A では web ページを表示している OS、ブラウザ、そのバージョンを決定するためのNetscape web サイトから利用できる JavaScript を示す。
注: JavaScript は SUN Microsystems, Inc の登録商標である。 元々はLiveScript と呼ばれていた。 Java 言語とは関係が無い。
スクリプトを使う文法では、スクリプトをサポートしていないブラウザがそれらのものを無視する様にハイパーテキストマークアップ言語 (HTML) のコメントで表す。 つまり、スクリプト使用は "<!--" で始まり、"-->" で終わる。 以下は MIME タイプハンドラ発見用 JavaScript に基づく web ページの一部での条件分岐実行の簡単な例である。
<SCRIPT LANGUAGE=JAVASCRIPT>
<!-- hide it
if (navigator.mimeTypes && navigator.mimeTypes.length > 0) {
if ( navigator.mimeTypes["application/iotp"] ||
navigator.mimeTypes["application/x-iotp"]) {
// here if IOTP handler exists
}
else {
// here if IOTP handler does not exist
}
}
// end and hide -->
</SCRIPT>
Microsoft Windows Internet Explorer のバージョン 3 や 4 を実行させている場合、ローカルでの MIME タイプのサポートを決定するために WindowsRegistry に問い合わせる必要がある。 これらのブラウザは JavaScript をサポートしているが、バージョン 3 では mimeType 配列は提供されておらず、またバージョン 4 では mimeType 配列は提供されているもののその中身は常に空である。 例えば、以下のコードを実行する事で IOTP タイプをサポートしているかを調べる事ができる。
CString iotpString, xiotpString;
char* Key, Keyx;
int rc, rcx;
iotpString =
"SOFTWARE\Classes\MIME\Database\Content Type\application/iotp";
xiotpString =
"SOFTWARE\Classes\MIME\Database\Content Type\application/x-iotp";
Key = iotpString.GetBuffer(1);
Keyx = xiotpString.GetBuffer(1);
rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, Key, 0, KEY_READ, hDefKey);
rcx = RegOpenKeyEx(HKEY_LOCAL_MACHINE, Keyx, 0, KEY_READ, hDefKey);
if ( ( rc == ERROR_SUCCESS ) || ( rcx == ERROR_SUCCESS ) )
{
// IOTP Handler exists
}
else
{
// No IOTP Handler
}
注: ActiveX は Microsoft の登録商標であり、本来は Sweeper と呼ばれていた。
産業会は最近電子商取引にて使用される分野のための標準を勧告している。 この分野では、"札入れ" ソフトウェアが顧客がどんな支払いに関連するプロトコルが顧客のサイトにてサポートされているかという情報を含む、標準化された情報を取引先へと伝える様に動作させる事ができる。 [ECML] を見よ。
以下の図表はこれらの技術をどのように組み合せる事ができるかを示すものである。
start>-----+
|
+------------------+
| Accept 内に望むタ| NO +-------------------------+
|イプがあったか? |------------>| JavaScript が利用可能で |
+------------------+ |そのタイプを表せるか? |
| +-------------------------+
YES | | | |
|<---------------------------+ | NO |
| YES | |
| +---<explorer<--+ |
| | |
| +----------------------+ |
| | ActiveX が利用可能で | |
| |そのタイプを表せるか?| |
| +----------------------+ |
| YES | | | NO |
|<-----------+ | +----------------->|
| V |
サポート | 確定できない。 サポート |
されて |. 既定の動作を行え。 されて |
*いる* と| *いない* と |
みなす | みなす |
X done X
内容やネゴシエーション能力に関する IETF や World Wide Web Consortium [W3C] や他の標準化団体や産業団体の積極的な作業が続いている。 この作業はここに記述される機能を実装するための方法を改良する狙いがある。 しかし、そのような新しい標準/特徴をほとんど世界的に展開させるには時間がかかるだろう。 従って、あなたは古い方法とさせるためにここに与えられる方法を期待すべきであるが、おそらくしばらくはそうはならないであろう。
上記にて提案された様々な ActiveX コントロールは、ユーザのレジストリを読み込んでおり、つまり、そのコンピュータを調べ、そこで発見したいくつかの情報を送り返しているという事に注目すべきである。 これはいくらかのユーザの間で関係するかもしれない。
一般的に、JavaScript の使用は、ActiveX はよりそうであるのだが、とても強力であるが故に危険なものである。 web ページからの JavaScript やActiveX はクライアントへ目に見えないほどのダメージを与える可能性がある。
web 相互作用のセキュリティは通常、[TLS] のように、サーバへ接続するブラウザ上で経路暗号化を採用する事によって提供される。 そのような HTTPの外側{outside} のいくつかの追加的セキュリティを実施しない場合、リクエストやレスポンスは偽造されたり、あるいは不正に変更されたりするかもしれない。
この中で記述される独特な手法は無い。 MIME タイプやタイプの登録手続きについては、[MIME: RFCs 2046, 2048] を参照。
<SCRIPT LANGUAGE="JavaScript">
// 究極のクライアントサイド JavaScript クライアントの探知
// © Netscape Communications 1999.
// 再利用及び配付を認める
// 99 年 5 月 17 日改訂:is_nav5up と is_ie5up を追加 (下記参照)。
// あなたの JavaScript クライアントについて知りたいと思っているが、尋
// ねる事が恐れる事の全てである。以下の "is_" 変数を生成する。
// (1) ブラウザのベンダ:
// is_nav, is_ie, is_opera
// (2) ブラウザのバージョン番号:
// is_major (メジャーバージョン番号を示す整数値: 2, 3, 4 ...)
// is_minor (完全なるバージョン番号を示す小数値:
// 2.02, 3.01, 4.04 ...)
// (3) ブラウザのベンダとメジャーバージョン番号
// is_nav2, is_nav3, is_nav4, is_nav4up, is_nav5, is_nav5up,
// is_ie3, is_ie4, is_ie4up
// (4) JavaScript バージョン番号:
// is_js (完全なる JavaScript バージョン番号を示す小数値:
// 1, 1.1, 1.2 ...)
// (5) OS プラットフォームとバージョン:
// is_win, is_win16, is_win32, is_win31,
// is_win95, is_winnt, is_win98
// is_os2
// is_mac, is_mac68k, is_macppc
// is_unix
// is_sun, is_sun4, is_sun5, is_suni86
// is_irix, is_irix5, is_irix6
// is_hpux, is_hpux9, is_hpux10
// is_aix, is_aix1, is_aix2, is_aix3, is_aix4
// is_linux, is_sco, is_unixware, is_mpras, is_reliant
// is_dec, is_sinix, is_freebsd, is_bsd
// is_vms
//
// userAgent 文字列の詳細なリストについては
// http://www.it97.de/JavaScript/JS_tutorial/bstat/navobj.html と
// http://www.it97.de/JavaScript/JS_tutorial/bstat/Browseraol.html を
// 参照。
//
// 注: 将来のバージョン上で走らせたいコード中にてバージョンをチェ
// ックするために is_nav4 や is_ie4 の代わりに is_nav4up ("Nav4 以降")
// と is_ie4up ("IE4 以降") を使う条件分岐中で、Nav5 や IE5 (及びそれ
// 以降) がリリースされれば、Nav4 や IE4 のコードを "消し" たり、また
// はその働きを止めたりはしない。
// 探査を簡単にするため全ての文字を小文字に置換する
var agt=navigator.userAgent.toLowerCase();
// *** ブラウザのバージョン ***
// 注: IE5 では、ここで 4 を返すので、IE5 の判別のためには is_ie5up
// を使用せよ。
var is_major = parseInt(navigator.appVersion);
var is_minor = parseFloat(navigator.appVersion);
// 注: Opera や WebTV は Navigator を名乗る。我々は厳密なクライアン
// ト判別を行うのである。もしあなたがこれを認めるのであれば、 opera や
// webtv のためにこの判別を取り除け。
var is_nav = ((agt.indexOf('mozilla')!=-1)
&& (agt.indexOf('spoofer')==-1)
&& (agt.indexOf('compatible') == -1)
&& (agt.indexOf('opera')==-1)
&& (agt.indexOf('webtv')==-1));
var is_nav2 = (is_nav && (is_major == 2));
var is_nav3 = (is_nav && (is_major == 3));
var is_nav4 = (is_nav && (is_major == 4));
var is_nav4up = (is_nav && (is_major >= 4));
var is_navonly = (is_nav && ((agt.indexOf(";nav") != -1) ||
(agt.indexOf("; nav") != -1)) );
var is_nav5 = (is_nav && (is_major == 5));
var is_nav5up = (is_nav && (is_major >= 5));
var is_ie = (agt.indexOf("msie") != -1);
var is_ie3 = (is_ie && (is_major < 4));
var is_ie4 = (is_ie && (is_major == 4)
&& (agt.indexOf("msie 5.0")==-1) );
var is_ie4up = (is_ie && (is_major >= 4));
var is_ie5 = (is_ie && (is_major == 4)
&& (agt.indexOf("msie 5.0")!=-1) );
var is_ie5up = (is_ie && !is_ie3 && !is_ie4);
// 既知のバグ: AOL4 上では、IE3 が埋めこまれたブラウザ、あるいはこれが
// 開かれた最初のブラウザウィンドウの場合、false を返す。従って、
// is_aol, is_aol3, is_aol4 の各変数は 100% 信頼できるものではない。
var is_aol = (agt.indexOf("aol") != -1);
var is_aol3 = (is_aol && is_ie3);
var is_aol4 = (is_aol && is_ie4);
var is_opera = (agt.indexOf("opera") != -1);
var is_webtv = (agt.indexOf("webtv") != -1);
// *** JAVASCRIPT バージョンチェック ***
var is_js;
if (is_nav2 || is_ie3) is_js = 1.0
else if (is_nav3 || is_opera) is_js = 1.1
else if ((is_nav4 && (is_minor <= 4.05)) || is_ie4) is_js = 1.2
else if ((is_nav4 && (is_minor > 4.05)) || is_ie5) is_js = 1.3
else if (is_nav5) is_js = 1.4
// 注: 将来において、新しいバージョンの JS がリリースされた時にはこ
// のコードを更新せよ。現在のために、将来のバージョンの Nav や IE が
// *少なくとも* JS 1.x の利用可能を示すであろうためにいくつかの上方互
// 換性の提供を試みる。> や >= を使って JS バージョンの互換性を常にチ
// ェックせよ。
else if (is_nav && (is_major > 5)) is_js = 1.4
else if (is_ie && (is_major > 5)) is_js = 1.3
// HACK: 他のブラウザについてはこの概念が無い;
// よって > や >= を使って JS バージョンを常にチェックせよ。
else is_js = 0.0;
// *** プラットフォーム ***
var is_win = ( (agt.indexOf("win")!=-1) ||
(agt.indexOf("16bit")!=-1) );
// 注: Opera 3.0 上では、userAgent 文字列はすべての Win32 上で
// "Windows 95/NT4" を含むので、Win95 と WinNT の区別はできない。
var is_win95 = ((agt.indexOf("win95")!=-1) ||
(agt.indexOf("windows 95")!=-1));
// 16 bit compiled version か?
var is_win16 = ((agt.indexOf("win16")!=-1) ||
(agt.indexOf("16bit")!=-1) ||
(agt.indexOf("windows 3.1")!=-1) ||
(agt.indexOf("windows 16-bit")!=-1) );
var is_win31 = ((agt.indexOf("windows 3.1")!=-1) ||
(agt.indexOf("win16")!=-1) ||
(agt.indexOf("windows 16-bit")!=-1));
// 注: Win98 の信頼できる判別は可能ではないだろう。
// それは以下にて現れる:
// - Nav 4.x 以下では userAgent 中に単純な "Windows" を得るだろう。
// - Mercury クライアント上では、32-bit バージョンでは "Win98" を返す
// が、Win98 上で走っている 16-bit バージョンはそれでもなお "Win95"
// を返すであろう。
var is_win98 = ((agt.indexOf("win98")!=-1) ||
(agt.indexOf("windows 98")!=-1));
var is_winnt = ((agt.indexOf("winnt")!=-1) ||
(agt.indexOf("windows nt")!=-1));
var is_win32 = (is_win95 || is_winnt || is_win98 ||
((is_major >= 4) &&
(navigator.platform == "Win32")) ||
(agt.indexOf("win32")!=-1) ||
(agt.indexOf("32bit")!=-1));
var is_os2 = ((agt.indexOf("os/2")!=-1) ||
(navigator.appVersion.indexOf("OS/2")!=-1) ||
(agt.indexOf("ibm-webexplorer")!=-1));
var is_mac = (agt.indexOf("mac")!=-1);
var is_mac68k = (is_mac && ((agt.indexOf("68k")!=-1) ||
(agt.indexOf("68000")!=-1)));
var is_macppc = (is_mac && ((agt.indexOf("ppc")!=-1) ||
(agt.indexOf("powerpc")!=-1)));
var is_sun = (agt.indexOf("sunos")!=-1);
var is_sun4 = (agt.indexOf("sunos 4")!=-1);
var is_sun5 = (agt.indexOf("sunos 5")!=-1);
var is_suni86= (is_sun && (agt.indexOf("i86")!=-1));
var is_irix = (agt.indexOf("irix") !=-1); // SGI
var is_irix5 = (agt.indexOf("irix 5") !=-1);
var is_irix6 = ((agt.indexOf("irix 6") !=-1) ||
(agt.indexOf("irix6") !=-1));
var is_hpux = (agt.indexOf("hp-ux")!=-1);
var is_hpux9 = (is_hpux && (agt.indexOf("09.")!=-1));
var is_hpux10= (is_hpux && (agt.indexOf("10.")!=-1));
var is_aix = (agt.indexOf("aix") !=-1); // IBM
var is_aix1 = (agt.indexOf("aix 1") !=-1);
var is_aix2 = (agt.indexOf("aix 2") !=-1);
var is_aix3 = (agt.indexOf("aix 3") !=-1);
var is_aix4 = (agt.indexOf("aix 4") !=-1);
var is_linux = (agt.indexOf("inux")!=-1);
var is_sco = (agt.indexOf("sco")!=-1) ||
(agt.indexOf("unix_sv")!=-1);
var is_unixware = (agt.indexOf("unix_system_v")!=-1);
var is_mpras = (agt.indexOf("ncr")!=-1);
var is_reliant = (agt.indexOf("reliantunix")!=-1);
var is_dec = ((agt.indexOf("dec")!=-1) ||
(agt.indexOf("osf1")!=-1) ||
(agt.indexOf("dec_alpha")!=-1) ||
(agt.indexOf("alphaserver")!=-1) ||
(agt.indexOf("ultrix")!=-1) ||
(agt.indexOf("alphastation")!=-1));
var is_sinix = (agt.indexOf("sinix")!=-1);
var is_freebsd = (agt.indexOf("freebsd")!=-1);
var is_bsd = (agt.indexOf("bsd")!=-1);
var is_unix = ((agt.indexOf("x11")!=-1) || is_sun ||
is_irix || is_hpux ||
is_sco ||is_unixware || is_mpras || is_reliant ||
is_dec || is_sinix || is_aix || is_linux ||
is_bsd || is_freebsd);
var is_vms = ((agt.indexOf("vax")!=-1) ||
(agt.indexOf("openvms")!=-1));
</SCRIPT>
Donald E. Eastlake 3rd
Motorola
140 Forest Avenue
Hudson, MA 01749 USA
Phone: +1 978-562-2827(h)
+1 508-261-5434(w)
Fax: +1 508-261-4447(w)
EMail: Donald.Eastlake@motorola.com
Chris J. Smith
Royal Bank of Canada
277 Front Street West
Toronto, Ontario M5V 3A4 CANADA
Phone: +1 416-348-6090
Fax: +1 416-348-2210
EMail: chris.smith@royalbank.com
David M. Soroka
IBM
Raleigh, NC
Phone: +1 919-486-2684
Fax: +1 919-543-4653
EMail: dsoroka@us.ibm.com
Copyright © The Internet Society (2000). All Rights Reserved.
この文章とその翻訳は、複製し他人に配布する事ができ、またその実装についてのコメント、その他の方法を用いた説明、その補助となるような派生的作業はそれらの中に上の著作権表示とこの段落を含む事によって、その全て又は一部を、いかなる制約も受けずに、作成、複製、発表、及び配布する事ができる。 しかしながら、インターネット標準化プロセスにて定義されている著作権のための手続きに従わなければならないような場合の中でインターネット標準を開発するという目的に必要である、あるいは英語以外の言語に翻訳する必要があるという場合を除いて、この文章自体を、その著作権表示や、インターネット学会あるいは他のインターネット団体への参照を削除するような、いかなる変更もできない。
上で認めた制限された許諾は永続的なものであり、インターネット学会及びその継承者や譲渡者によって取り消される事は無い。
この文書とここに含まれた情報は、"そのまま {AS IS}" である事を基に提供され、インターネット学会、及び IETF は、この中の情報の使用が、商用利用及び特定用途においていかなる権利もいかなる暗黙的保障も侵害していないという保障への制限を含め、明示的に又は暗黙的に、全ての保障を放棄する。
RFC Editer 機構の資金は、現在インターネット学会から提供されている。