J'utilise com.sun.net.httpserver.HttpServer dans mon projet. Cependant, il semble que le serveur fuit les connexions lorsqu'il reçoit des données invalides de la connexion HTTP. Le bug est celui-ci:Sun Java HTTPServer a un bug, comment y remédier?
http://bugs.sun.com/view_bug.do;jsessionid=dfe841c3152d878571573bafceb8?bug_id=6946825
Maintenant, cela devrait être résolu dans la version « 7 (B94) » - cependant, nous utilisons encore Java 1.6 et il est peu probable que nous voulons commutateur Java versions à ce stade. Donc, je cherche des façons de résoudre cette situation. Je n'ai pas beaucoup de temps, donc je préfère des solutions rapides qui fonctionnent pour le moment, plutôt que de réimplémenter beaucoup de choses pour plus tard.
J'ai quelques idées sur la façon d'aller à ce sujet:
- Mise à jour une version plus récente de Java - c'est quelque chose que je ne veux pas faire.
- Recherchez un fichier jar contenant uniquement une version plus récente de com.sun.net.httpserver et assurez-vous que le fichier jar est chargé avant les fichiers système.
- Trouver un remplaçant pour com.sun.net.httpserver - Je suis ouvert aux pointeurs ici.
- Modifiez le code pour qu'il fonctionne avec un autre serveur HTTP intégré, avec un peu de chance, un peu différent de l'actuel. Je peux réécrire le code de configuration du serveur, mais la plupart des interfaces devraient rester les mêmes.
- décompiler la classe com.sun.net.httpserver.ServerImpl, fixer les lieux incriminés, et recompiler cette classe unique à un pot de son propre
Mais, je suis ouvert à de bonnes suggestions!
Merci d'avance.
Le correctif est maintenant implémenté et fonctionne. Je vais coller ici les bits pertinents si quelqu'un d'autre a besoin de ces:
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);
}
trouvé le changeset de fixation ainsi: http://hg.openjdk.java.net/jdk7/jdk7/jdk/rev/0bda20126372 – Nakedible