Netscape 1.1 以降では、異なる二つのダイナミックドキュメント機能をサポー トしています。これらのメカニズムは『クライアントポップ』と『サーバプッ シュ』と呼ばれ、HTML3.0 の META タグやMIMEを利用しています。
<META HTTP-EQUIV="Refresh" CONTENT=1> <title>Document ONE</title> <h1>これは書類ONEです</h1> ここにテキストがあります。<p>
このMETAタグは以下のように指定します。
<META HTTP-EQUIV="Refresh" CONTENT=n>
<META HTTP-EQUIV="Refresh" CONTENT="n ; URL=http://server/file">
HTTP-EQUIV
- HTTPで送るディレクティブ。ここで"Refresh"は再ロードをし なさいというの意味です。
CONTENT
- HTTPで送られるメタ情報。ここでは再ロードの間隔(秒)を表します。
URL
- 書類を再ロードする際に別のURLにリンクできます。但し、URLは自ホ スト内の書類でも必ずホスト名を含んだフルURLで記述しなければなり ません (例えば http://server/file)。
<META HTTP-EQUIV="Refresh" CONTENT="1; URL=http://www.foo.co.jp/sound/open.au">
サーバプッシュの仕組みは、"multipart/x-mixed-replace" というMIMEタイプ を使用し、一つの文書に複数の文書を梱包するような形の文書を作ることにあ ります。この複数の文書を作る場合、ループ文を使えば永遠に送り続けること も可能です。そして、サーバ側でデータ送信を止めない限り、データは送り続 けることになってしまいますが、クライアント側で "Stop" ボタンを 押す事によって、いつでも割り込みをかけ中止することができます。
また、ブラウザがデータをバッファ するのを防止するため(ブラウザはデータをバッファリングしてから表示する ため、ある程度データが溜らないと表示してくれません)、サーバプッシュの CGIスクリプトは NPHスクリプト(nph-foo.cgiと、スクリプト のファイル名にnph-を頭に付けておく)で実行させます。そのため、下 記の例では最初にHTTP応答ヘッダ ("HTTP/1.0 200 Okay") を出力し ければなりません。
#!/bin/sh echo "HTTP/1.0 200" echo "Content-type: multipart/x-mixed-replace;boundary=境界文字列" echo "" echo "--境界文字列" while true do echo "Content-type: text/html" echo "" echo "<title>PS</title>>" echo "<h2>Process on WWW</h2>" <pre> ps ax </pre> echo "--境界文字列--" sleep 5 done
<IMG SRC="nph-script.cgi?anything.txt">
$|=1
$browser = $ENV{"HTTP_USER_AGENT"};
if ($browser =~ /^Mozilla/i) {
print "Netscape\n";
&アニメーションルーチン;
} else {
print "HTTP/1.0 200 Okay\n";
print "Content-Type: image/gif\n\n";
print GIFまたはJPEGイメージ;
}
print "HTTP/1.0 200 Okay\n";
print "Content-Type: multipart/x-mixed-replace;boundary=境界文字\n\n";
境界文字は任意の文字を指定します。
print "--境界文字\n";
open(IMAGEFILES, @ARGV[0]) || die "can not open @ARGV[0]: $!";
この方法によって、nph-script.cgi?list.txtで実行します。
list.txt は、イメージのリストを次のように記述します。
gif0.gif
gif1.gif
:
gifn.gif
while (<IMAGEFILES>) {
chop $_;
print "Content-Type: image/gif\n\n";
open (S,$_);
print (<S>);
close (S);
print "\n--境界文字\n";
}
close(IMAGEFILES)
#!/usr/bin/perl
# ブラウザ名
$browser = $ENV{"HTTP_USER_AGENT"};
# Perl で標準出力バッファしません。
$|=1;
# ブラウザがNetscape かどうかを判断します。
if ($browser =~ /^Mozilla\/1.[1-9]/i) {
&animation;
} else {
print "HTTP/1.0 200 Okay\n";
print "Content-type: image/gif\n\n";
open (S, "gif0.gif");
print (<S>);
close S;
}
# アニメーションルーチン
sub animation {
print "HTTP/1.0 200 Okey\n";
print "Content-type: multipart/x-mixed-replace;boundary=sometex\n\n";
print "--sometext\n";
while (1) {
for ($i=0; $i<17; $i++) {
print "Content-type: image/gif\n\n";
open (S, "gif$i.gif");
print (<S>);
close S;
print "\n--sometext\n";
}
}
}
このNPHスクリプトをインラインイメージの<IMG>タグ部を次 のように設定します。
<IMG SRC="nph-script.cgi">
Netscape 社のサーバプッシュのス クリプト例に、Cによるソースコードがあります。この コードはパブリックドメインです。このコードを使った場合、ブラウザのバッ ファ問題が起こる事があるので、注意が必要です。NPHスクリプトになるよう に改造してみました。
<A HREF="/cgi-bin/imagemap/...><IMG BORDER=0 SRC=/nph-script.cgi" ISMAP></A>とします。
Content-type: multipart/x-mixed-replace;boundary=境界文字は解釈できますが、下記のようにboundryの前にスペースを空けると解釈でき ない場合があります。
Content-type: multipart/x-mixed-replace; boundary=境界文字