Можно ли вызывать ServletRequest.getInputStream () несколько раз в цикле? - PullRequest
0 голосов
/ 04 декабря 2018

Обнаружен некоторый код, выполняющий это внутри сервлета:

while ((read = request.getInputStream().read(bytes)) != -1)
    buffer.write(bytes, 0, read);

Хотя в большинстве случаев request.getInputStream() просто возвращает где-то поле, я думал, что могут быть динамические оболочки или такие, которые могут попасть вплохое состояние.

Есть ли что-то написанное в документации о том, что я могу использовать в качестве примера для извлечения кода getInputStream() из цикла?

1 Ответ

0 голосов
/ 04 декабря 2018

Можно вызывать getInputStream() несколько раз, спецификация сервлета запрещает использовать его только вместе с getReader().Согласно метод ServletRequest#getInputStream() javadoc :

Извлекает тело запроса в виде двоичных данных, используя ServletInputStream.Этот метод или getReader () могут быть вызваны для чтения тела, а не обоих.

Возвращает:

объект ServletInputStream, содержащий тело запроса

Броски:

  • IllegalStateException - если метод getReader () уже был вызван для этого запроса
  • IOException - если возникла исключительная ситуация ввода или вывода

Определенная реализация сервлета может возвращать объект-оболочку, но в конце дня каждый всегда должен ожидать, что ServletInputStream может бросить throw IOException в какой-то момент (например,сброс соединения).

Если мы возьмем в качестве примера Apache Tomcat, логика обработки HTTP-соединения находится в AbstractProtocol.ConnectionHandler.process() методе и очень оборонительна.Код очистки для HTTP-соединения и базового сокета запускается после catch(Throwable ), поэтому ошибка приложения не должна мешать очистке ресурса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...