0

私は、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 スクリプトでストリームを読み取り、その内容をコマンド ライン パラメーターとして渡すことができますが、これはコマンド ラインの長さ制限の対象になると思います。そのため、ストリームを継承する方法を本当に理解したいと思います。

4

1 に答える 1

1

うわー、これがクライアントからの少量の負荷であることを願っています。mod_perl では、stdin はクライアントからのソケット ハンドルに関連付けられており、stdout と同じです。したがって、STDOUT を Java プロセスに設定するには、*STDOUT を Java サーバーのソケット ハンドルに設定する必要があります。または、プロセスを開いているので、STDOUT を選択し、$| を設定してバッファリングしないようにすることもできます。また、データをクライアントにストリーム バックする場合は、クライアントのソケット ハンドルに直接書き込むか、STDOUT を元の値にリセットする必要があります。

于 2009-11-18T00:40:45.073 に答える