В Sun Java HTTPServer есть ошибка, как ее исправить? - PullRequest
0 голосов
/ 19 августа 2010

Я использую 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 - это то, что я не хочу делать.
  • Найдите jar, который содержит только более свежую версию com.sun.net.httpserverи убедитесь, что JAR загружается до того, как система 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);
}

Ответы [ 3 ]

2 голосов
/ 19 августа 2010

Не могли бы вы установить обратный прокси-сервер напротив HTTP-сервера, чтобы обеспечить разрешение только на получение хорошо известных запросов? Лак или кальмар или апач?

Или что-то в Jetty , чтобы оно действовало как обратный прокси-сервер?

Другим подходом было бы получить исходный код фиксированной версии, переименовать класс и пакет так, чтобы они вписывались в ваш проект, сделать класс общедоступным, а затем использовать эту реализацию вместо этого.

2 голосов
/ 19 августа 2010

Я понимаю ваше нежелание перейти на предварительную версию Java 7.

Вот мои предложения:

  • Получите контракт на поддержку Java от Oracle и попросите их предоставить вам исправление для Java 6, исправляющее ошибку.

  • Загрузите исходные коды Java 6 для выпуска, который вы используете в настоящее время, скопируйте исправление ошибки из исходных текстов Java 7 и соберите. Может быть, вам нужно только собрать определенные JAR-файлы.

  • Посмотрите на код и посмотрите, можете ли вы разработать обходной путь. Например, вы можете использовать отражение, чтобы выкопать «список экземпляров HttpConnection», о котором говорится в отчете об ошибке, и периодически удалять записи, которые выглядят как мертвые. (Я бы отнесся к этому как к последнему средству.)


(обновлено: 2012-05-15)

И теперь, когда Java 7 хорошо и по-настоящему выпущена (мы сейчас на 1.7u4):

  • обновление до Java 7 и

  • избавиться от неприятных отражательных взломов, которые вы использовали в качестве временного обходного пути.

0 голосов
/ 19 августа 2010

Есть ли у вас доступ к 7 (b94)?Затем вы можете сравнить источники и посмотреть, сможете ли вы исправить это, переопределив или предоставив различные методы доступа.

...