新しいサーバに変更したところ、今まで体験した事の無いエラーをCGIが出すようになりました。今まではPerl5.08や5.10などを使っていました。
Perl5.26で@INCからカレントディレクトリが削除された事によるエラーはすぐ把握して対処しましたが、それとは違う問題です。
具体的には、下記のCGIにPOST送信でアクセスすると502エラーになります。
###↓POST送信でアクセスすると502エラーになる
perl
1#!/usr/bin/perl 2 3print "Content-type: text/html\n\n"; 4print "Hello";
GET送信や直接アクセスする分にはもちろん「Hello」と表示されます。
Perl歴20年ですが、Perlのバージョンが変わってこんな超初歩のCGIがエラーを出した事、そして、その原因に何時間も費やした事に多大なショックを受けています。
原因を特定して下記の記述なら問題無い事が判明しました。
###↓POST送信でアクセスしても502エラーにならない
perl
1#!/usr/bin/perl 2 3$a = <STDIN>; 4 5print "Content-type: text/html\n\n"; 6print "Hello";
恐らく、STDIN(POST送信されてきたデータ)を読み込んで、STDINの中身が消えてしまえば502エラーにならないのでしょう。こんなもので特定に半日も費やした苛立ちが半端ないです。
いつから、何故、このような訳の分からない仕様になったのでしょうか。正気の沙汰を疑うような誰得?で無価値な制限に思えるのですが、私が何か見落としているのでしょうか。
■502エラーになるサーバ
CentOS8 Perl 5.26 Apache 2.4.37
CentOS7 Perl 5.16 Apache 2.4.06
■502エラーにならないサーバ
CentOS6 Perl 5.10 Apache 2.2.15
CentOS5 Perl 5.08 割愛
恐らく、5.10~5.16の何処かで仕様が変更になったのでしょうか。しかし、perldoc.jp でperl5.10~5.26までSTDIN関連の変更を確認しましたが、該当するような記述は見受けられませんでした。
Perl5.16の「Content-Length が設定されていないとき、もはや STDIN から 読み込まなくなりました」は別問題ですし…。
まさか、サイレント修正なんて事も無いでしょうし…。
この件について何かご存知の方がいらっしゃいましたら、いつから、何故、このような仕様になったのかお教え頂けませんでしょうか。納得できる理由が無いと、20年間愛し続けたPerlの事をディスってしまいそうです…。
「POST送信でSTDIN読まないのってどうなん?」とかの煽りは抜きでお願いします。(STDIN読むまでも無くexitしたい時だってあるのです…。アクセス規制とかね)
Perlの事なので気長に回答をお待ちしています。