私は、HTTP ベースのクライアントと非 HTTP Java サーバーの間である種のプロキシとして機能するはずのこの古い Perl スクリプトを持っています。クライアントはこの Perl スクリプトにデータを POST し、スクリプトは Java サーバーを呼び出して、応答してクライアントに返します。
Perl 部分は、次のようにサーバーを呼び出します。
$servervars = "-DREMOTE_HOST=$ENV{'REMOTE_HOST'}";
#(a few other server variables passed this way)
system "java $servervars -cp /var/www javaserver";
そして、Javaサーバーは次のようになります。
InputStream serverData = System.in;
serverData.read(); //and read, and read it on
//....
//print response:
System.out.print("Content-type: application/octet-stream\n\n");
System.out.write(...);
問題は、Perl スクリプトが CGI 経由で呼び出された場合は問題なく動作しますが、Perl スクリプトが mod_perl (実際には mod_perl2) によって処理される場合はまったく動作しません。どうやら Java 部分は Perl から STDIN を取得せず (serverData.available() は 0 を返します)、Perl は STDOUT を取得しません。後者は、システム "java..." の代わりに print `java...` (つまり、バッククォート) を実行することで解決できますが、STDIN についてはどうすればよいかわかりません。
Perl スクリプト自体は、POST されたデータを STDIN で読み取ることができます。また、Java アプリケーションの代わりにテスト Perl スクリプトを生成しようとしましたが、親スクリプトの STDIN も取得しません。
説明から判断すると、Apache2::SubProcess の spawn_proc_prog はトリックを実行できます (つまり、POST データを STDIN として子プロセスに渡し、子プロセスの出力を取得します)。別の Perl スクリプト。
子プロセスに親スクリプトの STDIN を継承させる方法はありますか? Perl スクリプトでストリームを読み取り、その内容をコマンド ライン パラメーターとして渡すことができますが、これはコマンド ラインの長さ制限の対象になると思います。そのため、ストリームを継承する方法を本当に理解したいと思います。