2012-01-13 2 views
-1

В настоящее время я создаю небольшой веб-сервер (для тестирования), и у меня есть проблема с чтением заголовка HTTP-запроса (исходящего из браузера, хром в моем случае).Прочитать полный 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 (я закрыл , а также всех читателей/писателей).

После небольшого поиска я наткнулся на этом старшем вопрос: Read/convert an InputStream to a String

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

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

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

ответ

1

Вы читаете из гнезда, пока нет данных для чтения. Это не правильно. Вы должны продолжать читать, пока вы не столкнетесь 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 Section 4 больше Детали. Это не только облегчает правильное чтение запроса, но также позволяет поддерживать HTTP-авиалисты правильно (для отправки нескольких запросов в одном соединении).

+0

Хотя ваш данный код-пропущено не будет компилировать ('String' начинается в верхнем регистре), фиксированная версия работает отлично. Благодарим за это. –

1

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

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

См: How do I compare strings in Java?

Смежные вопросы