HTTP gzip кодировка html - PullRequest
       2

HTTP gzip кодировка html

0 голосов
/ 22 марта 2012

Для моего проекта мне нужно написать свой собственный облегченный веб-сервер. В данный момент он делает то, что я хочу, но вроде ... медленно. по крайней мере, чтобы замедлить для меня. Поэтому я думал о реализации сжатия GZIP, чтобы ускорить процесс. Вот как.

public static String encodeToGZip(String data) {
        ByteArrayOutputStream bout = null;
        try {
            bout = new ByteArrayOutputStream();
            GZIPOutputStream output = new GZIPOutputStream(bout);
            output.write(data.getBytes());
            output.flush();
            output.close();
            bout.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }

        try {
            return new String(bout.toByteArray(), "UTF-8");
        } catch (UnsupportedEncodingException ex) {
            return null;
        }
    }

проблема в том, что веб-сервер не может декодировать отправленные мной данные. Несмотря на то, что в нем указано, что он принимает кодировку gzip, я должен отправлять некоторые поврежденные данные.

это результат. снифф проволочной акулы ==> GET /login.html HTTP / 1.1

Хост: localhost: 9090

Соединение: keep-alive

Cache-Control: без кеширования

Прагма: без кэша

Пользователь-агент: Mozilla / 5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit / 535.11 (KHTML, как Gecko) Chrome / 17.0.963.79 Safari / 535.11

Принять: текст / html, приложение / xhtml + xml, приложение / xml; q = 0,9, / ; q = 0,8

Accept-Encoding: gzip, deflate, sdch

Accept-Language: en-US, en; q = 0,8

Accept-Charset: ISO-8859-1, utf-8; q = 0,7, *; q = 0,3


HTTP / 1.1 200 OK

Подключение: закрыть

Сервер: My Lite Server v0

Кодировка содержимого: gzip

Тип содержимого: текст / html

............... T ... N ... 0 .... # ....... O ...? ... $ .. ......... BB ... г ... 6 ... [..... у ........... 6 .......... ............ G6E ............... S ...... с .. $ .......... ` я Gw ............ AOAhU ... XO ... d ...] .... IU ... ч ... + ...... [.... .Y ......... б ... | х ......... rm1 ......... 1 ..... L ... Ui ... ...... S ... п ............ F ...... T2. [$ X ....... M ..... M. # * ........... d .... 58HL: .... Wx ...... Z ........... м ... т .. .Z). 'XQdg ...... Х ......... ~ ...... (...... <....... р / ....... ........... "... 6 | 7 ........ 3 ... r.Sv ... / ... гт .... ".......... SRJ .......... M.vR ^ ... 4 $. .. .q ... х ................... / ... 8 ........... M ... у # ... J ...... 7 ........ d..le ....; .................. ~ ...... о .... F ......

1 Ответ

2 голосов
/ 22 марта 2012
return new String(bout.toByteArray(), "UTF-8");

Эта строка в вашем методе будет генерировать строки мусора.

Приведенный выше конструктор выполняет операцию перекодирования из заданного кодирования в UTF-16.Вы берете кучу произвольных байтов и пытаетесь декодировать их как UTF-8.Вы можете декодировать только кодированные данные UTF-8 как UTF-8.Java не имеет бинарно-безопасных строк (все строки UTF-16);вместо этого вы должны использовать байтовые массивы.

Просто запишите сжатые байты в ваш OutputStream.

Избегайте использования data.getBytes(), поскольку используется системная кодировка по умолчанию.Это создаст непереносимый код, поскольку системная кодировка по умолчанию зависит от системы и конфигурации.Всегда предпочитайте , явно указав кодировку .

...