Читать полный HTTP-заголовок запроса - PullRequest
0 голосов
/ 13 января 2012

В настоящее время я создаю небольшой веб-сервер (для целей тестирования), и у меня возникает проблема с чтением заголовка HTTP-запроса (из браузера, в моем случае - с хромом).

Сначала я просто попробовал что-то вроде этого:

BufferedReader in = new BufferedReader(
  new InputStreamReader(client_socket.getInputStream(), "UTF-8")
);
StringBuilder builder = new StringBuilder();
while (in.ready()){
    builder.append(in.readLine());
}
return builder.toString();

Это работало нормально для первого запроса. Однако после того, как был выполнен первый запрос, ready() -метод возвратил только false (я закрыл client_socket, как и все читатели / писатели).

После небольшого поиска я наткнулся на этот старый вопрос: Чтение / преобразование InputStream в строку

Я попробовал первые четыре решения (два с Apache Commons, одно с Scanner и одно с циклом do-while). Все они заблокированы навсегда, и браузер выдал мне ошибку «Веб-сайт недоступен».

Я бы хотел сделать это самостоятельно (без использования каких-либо библиотек или встроенных серверов), поэтому я даже стараюсь.

Я сейчас немного растерян, как бы вы поступили?

Ответы [ 2 ]

1 голос
/ 10 октября 2014

Решение, предложенное выше Реми Лебо, неверно, как было показано в моем тесте. Эта альтернатива отказоустойчива:

StringBuilder builder = new StringBuilder(); 
String line;
do
{
    line = in.readLine(); 
    if (line.equals("")) break;
    builder.append(line);
}
while (true);

См. Как сравнить строки в Java?

1 голос
/ 14 января 2012

Вы читаете из сокета, пока нет больше данных для чтения. Это не правильно. Вам нужно продолжать чтение, пока не встретите строку длиной 0, затем обработайте полученные заголовки, чтобы определить, есть ли еще данные для чтения (ищите заголовки Content-Length: ... и Transfer-Encoding: chunked), например:

StringBuilder builder = new StringBuilder(); 
String line;
do
{
    line = in.readLine(); 
    if (line == "") break;
    builder.append(line);
}
while (true);
// use builder as needed...
// read message body data if headers say there
// is a body to read, per RFC 2616 Section 4.4...

Прочтите RFC 2616 Раздел 4 для более подробной информации. Это не только облегчает правильное чтение запросов, но и позволяет корректно поддерживать HTTP keep-alive (для отправки нескольких запросов по одному соединению).

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