Это не просто плохой дизайн ... он сломан.Скорее всего, BufferedReader
прочитает первую часть тела запроса в свой буфер.Поэтому, когда вы читаете из потока в конце, вы не получите все тело.
После того, как вы завернули InputStream
, вы не должны использовать его напрямую ... особенно если обертка делаетbuffering.
Лучший способ реализовать это - использовать существующую реализацию на стороне HTTP-сервера.Библиотека Apache HTTP Components - хорошая альтернатива для рассмотрения.
Если вам нужно реализовать это самостоятельно, тогда простое решение:
- Оберните
InputStream
в BufferedInputStream
. - Используйте
BufferedInputStream
для чтения строк заголовка по байтам за раз, построения строк и преобразования себя в строку. - Используйте
BufferedInputStream
для чтенияbody.
Мне кажется, что глупый дизайн протокола HTTP делает библиотеку java.io
бесполезной.
Я бы так не сказал.Проблема заключается в том, что протокол HTTP потенциально требует от клиента переключения способа интерпретации символов / байтов запроса или ответного сообщения в середине сообщения.Но если вы думаете об этом, это не является необоснованным.Альтернативы могут быть:
- для отправки отдельных сообщений, которые увеличат издержки протокола, или
- для кодирования и отправки строки запроса / ответа и заголовков в виде байтов, а не символов.
На самом деле у нас есть хитрый вариант использования, который слишком необычен, чтобы его можно было поддерживать в универсальных java.io
библиотеках.Об этом позаботится библиотека поддержки протокола ... если бы вы могли ее использовать.