質問

私はプロジェクトでcom.sun.net.httpserver.httpserverを使用しています。ただし、HTTP接続から無効なデータを取得すると、サーバーが接続をリークするようです。バグはこれです:

http://bugs.sun.com/view_bug.do; jsessionid=dfe841c3152d878571573bafceb8?bug_id=6946825

現在、これはバージョン「7(b94)」で修正されていると報告されていますが、まだJava 1.6を使用しているため、この時点でJavaバージョンを切り替えることはまずありません。

だから、私はこの状況を修正する方法を探しています。私には時間があまりありませんので、今のところ機能する簡単な解決策を好むことを望みます。

私はこれをどのように進めるかについていくつかのアイデアを持っています:

  • より最近のJavaに更新します - これは私がやりたくないことです。
  • com.sun.net.httpserverの最新バージョンのみを含む瓶を見つけ、システムジャーの前にjarがロードされることを確認してください。
  • com.sun.net.httpserverのドロップイン交換を見つける - ここではポインターを受け入れています。
  • コードを変更して、別の埋め込まれたHTTPサーバーで動作します。サーバーのセットアップコードをある程度書き直すことはできますが、ほとんどのインターフェイスは同じままです。
  • com.sun.net.httpserver.serverimplクラスを逆コンパイルし、問題のある場所を修正し、その単一のクラスを独自の瓶に再コンパイルします

しかし、私は良い提案を受け入れています!

前もって感謝します。


修正が実装され、機能します。他の誰かがこれらを必要としている場合、私はここに関連するビットを貼り付けます:

final Field httpserverimpl_server = Class.forName("sun.net.httpserver.HttpServerImpl").getDeclaredField("server");
final Field httpsserverimpl_server = Class.forName("sun.net.httpserver.HttpsServerImpl").getDeclaredField("server");
final Field serverimpl_allconnections = Class.forName("sun.net.httpserver.ServerImpl").getDeclaredField("allConnections");
final Field httpconnection_closed = Class.forName("sun.net.httpserver.HttpConnection").getDeclaredField("closed");

httpserverimpl_server.setAccessible(true);
httpsserverimpl_server.setAccessible(true);
serverimpl_allconnections.setAccessible(true);
httpconnection_closed.setAccessible(true);

Object serverimpl = httpserverimpl_server.get(server);
Set allconnections = (Set)serverimpl_allconnections.get(serverimpl);
LinkedList<Object> toRemove = new LinkedList<Object>();
for (Object conn : allconnections) {
    if (httpconnection_closed.getBoolean(conn)) {
        toRemove.add(conn);
    }
}
for (Object conn : toRemove) {
    allconnections.remove(conn);
}
役に立ちましたか?

解決

Java 7のプレリリースビルドへのアップグレードに抵抗があることを理解できます。

これが私の提案です:

  • OracleからJavaサポート契約を入手し、バグを修正するJava 6のパッチを提供してもらいます。

  • 現在使用しているリリースのJava 6ソースをダウンロードし、Java 7ソースからバグ修正をバックポートしてビルドします。たぶん、特定のJARファイルのビルドを実行するだけである必要があります。

  • コードを見て、回避策を開発できるかどうかを確認してください。たとえば、リフレクションを使用して、バグレポートが話している「HTTPConnectionインスタンスのリスト」を掘り出し、死んでいるように見えるエントリを定期的に削除できる場合があります。 (私はこれを最後の手段として扱います。)


(更新:2012-05-15)

そして、今ではJava 7がうまくリリースされています(私たちは現在1.7U4になりました):

  • Java 7にアップグレードします

  • 一時的な回避策として使用した厄介な反射ハックを取り除きます。

他のヒント

httpサーバーの逆プロキシ前部を置いて、既知の適切なリクエストのみが許可されていることを確認できますか?ワニスまたはイカまたはアパッチ?

または何かをノックアップします 桟橋 それが逆プロキシとして機能するように?

別のアプローチは、をつかむことです ソースコード 固定バージョンの場合、クラスとパッケージの名前を変更して、プロジェクトに収まり、クラスを公開してから、代わりにその実装を使用します。

7(b94)にアクセスできますか?次に、ソースを比較して、異なるアクセサーをオーバーライドまたは提供することで修正できるかどうかを確認できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top