ZnZ さん
>応答のヘッダの中にContent-Locationがある場合はそれを使えばいいと思うのですが。
RFC2616の14.4に
|A cache cannot assume that an entity with a Content-Location
|different from the URI used to retrieve it can be used to respond to
|later requests on that Content-Location URI.
とか書いてあるのでよくありません。
応答のヘッダの中にContent-Locationがある場合はそれを使えばいいと思うのですが。
中田さん、ご返答ありがとうございます。
>Perl for Win32 の時の PerlIS はそのつど GetServerVariable() を使っていたように思
いますが、ActivePerl では 直接読み取るようになったようです。
やはり変数の読み出し方が違ったんですね。
>現状では、この問題の解決は年を越しそうです。
私も調べてみて、かなり厄介な問題で時間がかかると認識していますので、無理をなさらずよろしくお願いします。
ちょっと追加。
下の環境変数の話と、REQUEST_METHOD (GET/POST) や REMOTE_ADDR などが混ざる話とは原因は同じと考えています。
(違うのかもしれませんが。。。)
tomita さん、
そうですね。 ISAPIのDLLもhttpd.exeと環境領域は共有するはずですが、httpd.exeの環境変数が変わってもISAPIの方は変わらないので、(最初に)どこかに保管しているように見えます。
Perl for Win32 の時の PerlIS はそのつど GetServerVariable() を使っていたように思いますが、ActivePerl では 直接読み取るようになったようです。
現状では、この問題の解決は年を越しそうです。
ActivePerl の Perlis.dll のソースや仕様が分かるのが最もいいのですが、
SambarServer に ISAPI サンプルのソースが添付されていましたので見てみました。
変数の取得については、GetServerVariable()以外特に変な関数コールしていないようです。
あと、環境変数のやりとりとしては、グローバル変数として渡されているかもしれません。
#include <windows.h>
#include <httpext.h>
#include <string.h>
#include <stdio.h>
#include <stdarg.h>
となっていて、 httpext.h 内では EXTENSION_CONTROL_BLOCK はありますが、 DOS環境変数
はここでは渡されない様に重います。
windows.h は手元に無いので分かりませんが、DOS環境変数を定義している場所として怪しい
のではないでしょうか。ここでは、 httpd.exe 自体の DOS環境変数のポインタをグローバル
変数として定義している様な気がするのですが、違うでしょうか?
だからと言って、 ActivePerl(ISAPI) の不具合とどう関係があるのかは
関係ありそうな気配がするだけで、イマイチ不明です。
ちょっと訂正。
requireは「require 式」なので演算が行えます。
注:飽くまでσ(>_<)が持っているマニュアルが正しいとして。
なお前から書いている通り(例えばふぁいんさんの例だと)「require './fcpl_' . $file . '.pl';」
の方が良いと思いますが。この方が若干速い気がしますし最近日本語を使いたい人が多いようで
すので(他の箇所でも同様。注意事項あり)。
AN HTTP Serverには関係ないですけど。
>ふぁいんさん
IPアドレスの件に関してREMOTE_ADDRがAN HTTP Serverが動いているIPアドレスとなってし
まうようです(ローカルでしか確認していませんが)。
これに付いてはもう消えてしまっているかもしれませんが過去に若干の回答があったりします。
requireに関してPerlはちゃんと処理してくれるようですね。細かく動作チェックはしていま
せんが。$fileに値が入っていないことがあるということがあったりはしないのでしょうか。
因みにrequireは@INCですね。というより'.'から始めているので関係なしの筈?
なおAN HTTP Serverが重くなるという件でまず起こった記憶はないのですが先日異常に重い
と思ったら待機中であるのに100%になっていました(WinNT4.0S+SP5)。一応カーネルは60%程
度のようでした(AN HTTP Serverとしては97,8%辺りをうろうろ)。
AN HTTP Serverを終了させただけではウィンドウが閉じずカーネルが0%近くまで落ちただけ
で100%の状態が続いていました。AN HTTP Serverを強制的に殺して普通の状態に戻りましたが。
立ち上げっぱなしですのでその前(数時間?)に最後に実行したCGI等でおかしくなったのか
も知れませんが何時かは特定できていません。
Office2000のインストールを要求されてから不安定になった感じがあったりするので今まで
特に何もなかったしその所為かもしれませんが。
以下のログにある私の書き込みに誤りがありました。
大変、申し訳ありませんでした。m(_)m
tomitaさんが言われている様に、%ENVでの問題は私の所でも確認
されています。具体的な事は全く分からないのですが^^;。。。
ISPを利用してPPPでインターネットで接続している状態で、外部
?からアクセスして貰った時に、外部からアクセスされた方のIP
が私のIPと同一となってしまいます。。。。
私が接続した時に割り当てられたIPが999.999.999.999(例え)だ
とした場合、IPが111.111.111.111のゲストから
http://999.999.999.999/ にアクセスして貰い、その人のIPを拾得
すると「999.999.999.999」の様に同一になってしまいます。
>どうも、機動後 一番はじめに処理するものがCGI(plも含む?)の場合に
>問題がある様です。
>*.shtmlや*.htmlにあるハイパーリンクから、cgiに移行した場合は ちゃ
>んと処理されます。(私の場合)
以下のログにある、この件に関してはCGIが正常に処理された訳では
ありませんでした。本当に申し訳ありません。。
私のPerlのソース?の問題だと想うのですが、AnHTTPd 機動後、一番初めに
CGI(Perl)を処理するとエラーになるのです。
原因は「require "./fcpl_$file.pl";」の様に$fileを使用してplを指定して
いるからだとは分かっているのですが。。
本当は いけないんでしょうね。。こういう書き方^^;。
良く分からないのですが、%ENVに影響を受けているからではないかと・・・。
PHPの件では、今までに3回ほどフリーズしましたが、どうもAnHTTPd起動後
、重たい処理をするとフリーズしてしまうみたいです。^^;
Perlでも たまにフリーズするので。。苦笑
tomita さん、
そうですね。GetServerVariable() は変数名を指定してその値を取り込むので $ENV はそのままですけど、%ENV はそれ以外だろうと思うのですが、ISAPIの範囲では他に環境変数を取得する仕組みがみあたりません。強いて言えば、特殊な変数名としてALL_HTTP などですべてのHTTP変数取得(AN HTTPDでは未実装)というのがあるのですが、これもDOS環境変数を取得するべきものでもなさそうです。
まあこれは、 %ENV があったとき(あるいはそれ以前に)PerlIS が何を呼んでいるかはわかるので確認してみます。 Samba Serverのようにそのログも出せるといいのでまずそうしようと思います。
推測で結構なので他にも何かあれば遠慮なく書いてください。
中田さん、ぴゅあさん、早速のご返答ありがとうございます。
私はシステムの中身が分からないので、現象からしか言えませんが、GetServerVariable()
をコールする前に既に %ENV 変数がセットされている可能性がないかと思います。
例えば、DOS環境変数は GetServerVariable() で取得する以前に、dll ロード時にその
ポインタが渡っていると思うのですが、このDOS環境変数に引っ付いてcgi変数も渡ってし
まっている可能性はないでしょうか?
# 勝手な推察で申し訳ありませんが...
★%ENVに付いて
tomitaさんの件を含めPerl(ActivePerl)側での問題ではないかと思っていましたが
ActiveStateでは探しきれませんでした。
ただ以前Argentがおかしいという点について新たな事実として発生だけ確認できましたので
報告しておきます。
これがPerlかIEにあるのかも知れないということはapache上で確認できたためです。
プロバイダのサーバapache 1.3.9,Perl v5.004_04(と思われる)でネスケでアクセスし
た後IEでアクセスしたときにHTTP_USER_AGENTがおかしいことを確認しました。
従って以前の件に関してAN HTTP Serverが原因であることはないだろうということです。
というかIEのバグなのだろうか?
クライアントはWinNT4.0W SP5,ネスケv4.7/en,IE4.01 SP1(4.72.3110.8)です。
最初にアクセスしたときはネスケ風/Win95(v4.0/IEではないよという表示)と通知されてい
ました。
3回目のアクセスでIE/WinNTと通知されました。
Agentはブラウザが発行していると思いますのでIEのバグの可能性が高いような気がします。
ファイアウォール/プロクシサーバの関連だとしても(注:AN HTTP Serverのプロクシは
通していません。従ってAN HTTP Serverは関係していない筈)Win95はここ数ヶ月立ち上げて
いませんのでWin95と通知されること自体がおかしいですが(因みに同時期に他からWin95/ネスケ
でアクセスされた可能性はゼロに等しい筈です)。
何故IEでネスケのAgentが出るのかはIEに聞かないと判りませんがWinを使っている以上ネスケ
はIEの上に被さっているとも考えられなくないと思いますのでIEに混乱させられたということ
は十分に考えられるでしょう。
尤も最新のIEでは直っているのかもしれませんが邪魔くさいのでどうしても必要なときにし
か使っていませんし何かの機会があるまではそのままでしょう。折角構築しなおしたのがおか
しくなるのも嫌ですし。モデムが不信な動作をしてしまうのには困っていますが。
取り敢えずIEを使うとおかしい結果が得られる場合があるということで。
ああそう言えば直前にInternet Ninja 4がIEに対して表示モードで動作中,WebWhacker
EXPRESS v3がダウンロード処理が終わって終了後ではありましたが。どちらもIEに繋がってい
ます。
後で直接テストしなおせばIEに原因があるのかどうかは判るでしょう。今は作業中ですので。
また以前にAgentがおかしい件に対してこの手のソフトの関連もあるのかもしれない(σ(^ー^)
は使っていないので確認はしませんがReGetやIria等を使われている方もいらっしゃるようなの
でこれらが関係するかもしれないでしょう)ということで。
冨田(tomita)さん、
詳細なご報告ありがとうございます。
ISAPIでの環境変数についての不具合は確かにここやメールでも話があり、冨田さんのお話も含めて見直したいと思っています。
現在、httpdのプロセスの環境領域を切り替えて使ってISAPI同士は排他処理で混ざらないようにしているのですが、それがうまくいっていないようです。
ISAPI毎に環境変数の領域を作ってやる必要があるのだろうと思っています。
なお、ISAPIでは、GetServerVariable() 以外に ServerFunc() のファンクションをみまわしても %ENV を取得できるようなものはなかったと思うのですが、最近は何か追加されているのかもしれません。これもあわせて見直してみます。
お久しぶりです。
tomitaさんの件と同じなのですが。。
どうも、機動後 一番はじめに処理するものがCGI(plも含む?)の場合に
問題がある様です。
*.shtmlや*.htmlにあるハイパーリンクから、cgiに移行した場合は ちゃ
んと処理されます。(私の場合)
はじめまして、冨田と申します。 AnHTTPd 便利に使わせて頂いてます。
今回、Perl+Perlis(316) から ActivePerl(522) に変更して ISAPI での動作が変です。
perl.exe では動いているのですが、過去にも何件か問題が報告されているようですし、
できれば ISAPI で使いたいと思いますので、私の環境での現象を報告します。
【現象】
ActivePerl で ISAPI だと、環境変数 %ENV 内のデータが一部元のままになってしまい、
ひどい時は %ENV が全く変更されません。HTTPd を終了するまで症状が続き、再起動す
ると一回目はうまく行きます。
具体的には、一回目に POST でパラメータを渡すと、REQUEST_METHOD が POST に固定さ
れ CONTENT_LENGTH が固定されてしまいます。一回目に GET METHOD でも同様で、 GET
に固定され、 QUERY_STRING も変わらない場合があります。
PerlWin32, ActivePerl とも perl.exe では問題なく動作しているようです。
また、 ActivePerl + SambarServer で試すと、 ISAPI で動作するようです。
現象解明のため、 foreach(keys %ENV) { print "[$_] $ENV{$_}\n"; } として、
スクリプトの *最初* で %ENV のダンプを取ってみました。
PerlWin32(ISAPI動作) の場合、 PERLXS のみが出力されます。
ActivePerl(ISAPI動作) の場合、全ての DOS, CGI 環境変数が出力されます。
PerlWin32, ActivePerl とも、EXE動作では、全ての DOS,CGI 環境変数が出力されます。
ActivePerl+SambarServer(ISAPI動作) の場合、DOS 環境変数のみが出力されます。
PerlWin32+SambarServer(ISAPI) では応答なくエラーとなります。
ISAPI 動作の時出力されない場合の変数は、 $ENV{'QUERY_STRING'} の様にすれば読み出
すことができ、読み出した変数はその後に keys を使ってダンプできます。
なお、ActivePerl+AnHTTPd(ISAPI動作) で一端全環境変数をダンプすると、以降のアクセス
では環境変数が全く変更されなくなりました。
【推測】
現象から推察するに、 %ENV は純粋な Perl のハッシュではなく、ハッシュに無い変数に
遭遇すると、システムコールか何かで値を取得し、ハッシュにセットする様に思います。
一端ハッシュにセットされた変数の場合、値を読みに行かないのではないでしょうか。
アクセス毎に、この変数領域が初期化されず、引き継がれるような現象が起こっているの
ではないかと思えます。
どこか、環境変数領域の受け渡しや、メモリ管理での相性が問題なのでしょうか?
Windows が無い頃、 DOS の環境変数領域が足りないエラーが出て、環境変数が変更でき
なくなった現象に近いようにも思えます。(例えが古くてすみません)
Perl.exe で実行する場合は、 command.com 起動毎に新たな環境変数領域が割り当てられ
るので(?)、問題がないのかとも思います。
以上、参考になりますでしょうか?
SambarServer では ISAPI コールのログを取る設定ができますので、参考例を付けます。
# ActivePerl + SambarServer(ISAPI動作)
Loading perlis.dll: Perl for Win32
perlis.dll: Run for <ipアドレス>
perlis.dll: ServerFunc() HSE_REQ_MAP_URL_TO_PATH 'D:\*省略*'
perlis.dll: GetServerVariable 'SCRIPT_NAME' returned: /schedule/schehead.pli
perlis.dll: GetServerVariable 'LC_ALL' not found
perlis.dll: GetServerVariable 'LANG' not found
perlis.dll: GetServerVariable 'PERL5OPT' not found
perlis.dll: GetServerVariable 'PERL5LIB' not found
perlis.dll: GetServerVariable 'PERLLIB' not found
perlis.dll: GetServerVariable 'REMOTE_ADDR' returned: <ipアドレス>
perlis.dll: GetServerVariable 'HTTP_COOKIE' returned: DAYS=14; LIST
perlis.dll: GetServerVariable 'DOCUMENT_NAME' not found
perlis.dll: GetServerVariable 'SCRIPT_NAME' returned: /schedule/schehead.pli
perlis.dll: GetServerVariable 'REMOTE_USER' returned: tomita
perlis.dll: WriteClient(16 bytes) HTTP/1.0 200 OK
perlis.dll: WriteClient(25 bytes) Content-type: text/html
perlis.dll: WriteClient(73 bytes) <HTML><HEAD>
<中略>
perlis.dll: WriteClient(15 bytes) </body></html>
perlis.dll: Returned HSE_STATUS_SUCCESS
【試験環境】
Windows98(4.10.1998) / PentiumU(RAM63.0MB)
InternetExplorer 4.0(4.72.3110.1;SP1)
AnHTTPd V1.22c or SambarServerV4.2
Perl for Win32 + Perlis.dll(316) or ActivePerl(522)
サーバ、ブラウザとも同一マシン(LAN接続)