Кусочное http-декодирование в java?

Я расшифровываю http-пакеты. И я столкнулся с проблемой, что проблема с чанком. Когда я получаю http-пакет, у него есть заголовок и тело. Когда кодирование передачи разбито на части, я не знаю, что делать?

Есть ли полезный API или класс для разделения данных в JAVA?

И если кто-то имеет опыт декодирования http, пожалуйста, покажите мне, как это сделать?


person CodingForever    schedule 15.09.2010    source источник


Ответы (4)


Используйте полноценный HTTP-клиент, например Apache HttpComponents Client, или просто Java SE, предоставленный java.net.URLConnection (мини-руководство здесь). Оба обрабатывают его полностью прозрачно и возвращают вам «нормальный» InputStream. HttpClient, в свою очередь, также поставляется с ChunkedInputStream которым вам просто нужно украсить свой InputStream.

Если вы действительно настаиваете на создании собственной библиотеки для этого, я бы предложил создать класс, подобный ChunkedInputStream extends InputStream, и соответственно написать логику. Вы можете найти более подробную информацию о том, как его анализировать, в этой статье Википедии.

person BalusC    schedule 15.09.2010
comment
На самом деле я делаю декодирование http в автономном режиме, и у меня есть только заголовок и тело http-пакета. И я расшифрую пакет. Но мне нужен API, который получает заголовок и тело и дает мне декодированные данные. Есть такой апи? - person CodingForever; 15.09.2010
comment
Статья в Википедии подробно описывает, как выглядит чанк. Вы можете просто разделить CRLF (\r\n). Это байты 10 и 13. Первая часть — это заголовок, который представляет длину фрагмента в шестнадцатеричном формате. Вторая часть — это сами данные чанка. Вы просто собираете и объединяете все эти куски. ChunkedInputStream делает именно это. - person BalusC; 15.09.2010
comment
Извините, сначала есть два класса ChunkedInputStream: http://jigsaw.w3.org/Doc/Programmer/api/org/w3c/www/http/ChunkedInputStream.html второй: http://hc.apache.org/httpclient-3.x/apidocs/org/apache/commons/httpclient/ChunkedInputStream.html Какой из них подходит для этого? И есть ли у вас информация о том, как использовать ChunkedInputStream? - person CodingForever; 16.09.2010
comment
Часть ChunkedInputStream в моем ответе кликабельна (как и все остальные голубоватые части). Это InputStream, вы можете просто украсить им другой InputStream. Например. InputStream input = new ChunkedInputStream(originalInput);. - person BalusC; 16.09.2010
comment
Во-первых, спасибо за ваши ответы, они действительно помогают мне. Но у меня есть еще один вопрос: конструктор ChunkedInputStream получает SessionInputBuffer (интерфейс). Как мне преобразовать строку (разделенное тело) в этот формат? - person CodingForever; 16.09.2010
comment
Хм, это изменилось в соответствии с HttpClient 4.x. Ну, либо выберите HttpClient 3.x, который принимает InputStream, либо доморощенный. Определить раздробленное тело довольно тривиально. Просто разделите на CRLF и сделайте логическую математику. - person BalusC; 16.09.2010

HttpComponents

Да, и если мы говорим о стороне клиента, HttpUrlConnection также делает это.

person Maurice Perry    schedule 15.09.2010
comment
Я буду декодировать http в автономном режиме (уже захваченные пакеты), и у меня есть только заголовок и тело. Поэтому мне нужен API, который получает только заголовок и тело и дает мне декодированные данные. Есть такое апи? - person CodingForever; 15.09.2010

Если вам нужен простой API, попробуйте библиотеку Jodd Http (http://jodd.org/doc/http.html). Он обрабатывает для вас фрагментированное кодирование передачи, и вы получаете все тело в виде строки обратно.

Из документов:

HttpRequest httpRequest = HttpRequest.get("http://jodd.org");
HttpResponse response = httpRequest.send();

System.out.println(response);
person Andrejs    schedule 30.05.2014

Вот быстрая и грязная альтернатива, которая не требует никакой зависимости, кроме Oracle JRE:

private static byte[] unchunk(byte[] content) throws IOException {
    ByteArrayInputStream bais = new ByteArrayInputStream(content);
    ChunkedInputStream cis = new ChunkedInputStream(bais, new HttpClient() {}, null);
    return readFully(cis);
}

Он использует тот же sun.net.www.http.ChunkedInputStream, что и java.net.HttpURLConnection за кулисами.

Эта реализация не предоставляет подробные исключения (номера строк) для неправильного формата содержимого.

Он работает с Java 8, но может выйти из строя в следующем выпуске. Вы были предупреждены.

Хотя может быть полезно для прототипирования.

Вы можете выбрать любую реализацию readFully из Convert InputStream to byte array in Java .

person Vadzim    schedule 11.09.2015