Pregunta

Estoy usando com.sun.net.httpserver.HttpServer en mi proyecto. Sin embargo, parece que el servidor se escapa conexiones cuando se pone los datos no válidos a partir de la conexión HTTP. El error es la siguiente:

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

Ahora, esto se informó a ser corregido en la versión "7 (B94)" -. Sin embargo, seguimos utilizando Java 1.6 y es poco probable que nos gustaría cambiar entre versiones de Java en este punto

Por lo tanto, estoy buscando maneras de solucionar esta situación. No tengo mucho tiempo, así que prefiero soluciones rápidas que el trabajo por el momento, más de reimplementar un montón de cosas para más tarde.

Tengo algunas ideas sobre cómo hacer esto:

  • Actualizar a una más reciente de Java -. Esto es algo que no quiero hacer
  • Para un frasco que sólo contiene una versión más reciente de com.sun.net.httpserver y asegúrese de que las cargas jarra antes de los frascos del sistema.
  • encuentre un reemplazo directo para com.sun.net.httpserver -. Estoy abierto a sugerencias aquí
  • Modificar código para trabajar con otro servidor HTTP integrado, es de esperar que no es demasiado diferente de la actual. Puedo volver a escribir el código de configuración del servidor, en cierta medida, pero la mayoría de las interfaces debería permanecer igual.
  • Descompilar la clase com.sun.net.httpserver.ServerImpl, fijar los lugares ofensivos, y volver a compilar esa única clase a un frasco de su propio

Sin embargo, estoy abierto a sugerencias buenas!

Gracias de antemano.


Fix ahora se implementa y funciona. Voy a pegar aquí los bits relevantes si alguien más necesita los siguientes:

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);
}
¿Fue útil?

Solución

Me puede entender su renuencia a actualizar a una versión preliminar de Java 7.

Aquí están mis sugerencias:

  • Obtener un contrato de soporte de Java de Oracle y conseguir que se le proporcionará un parche para Java 6, que corrige el error.

  • descargar el código fuente de Java 6 para la versión que está utilizando actualmente, backport la corrección de errores de los de Java 7 fuentes y de construcción. Tal vez sólo necesita hacer una acumulación de ciertos archivos JAR.

  • Mira el código y ver si se puede desarrollar una solución. Por ejemplo, es posible que pueda utilizar la reflexión para desenterrar la "lista de HttpConnection casos" que el informe de error se refiere, y retirar periódicamente las entradas que parecen que están muertos. (Me gustaría tratar esto como un último recurso.)


(Actualizado: 2012-05-15)

Y, ahora que Java 7 está bien y verdaderamente liberado (ahora estamos en 1.7u4):

  • actualizar a Java 7, y

  • deshacerse de los hacks reflectantes desagradables que utilizó como una solución temporal.

Otros consejos

¿Podría poner un proxy inverso frente del servidor HTTP, para tomar buenas peticiones Seguro de que solo permiten conocido por venir a través? Barniz o calamar o Apache?

o golpear algo en embarcadero para que actúe como un proxy inverso?

Otro enfoque sería para agarrar el código fuente de la versión fija, cambiar el nombre de la clase y el paquete para que se ajuste a su proyecto, hacen que el público de clase, y luego usar esa aplicación en su lugar.

¿Tiene acceso a 7 (B94)? A continuación, puede comparar las fuentes y ver si se puede arreglar anulando o la prestación de los diferentes métodos de acceso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top