Чтение gzipped запроса в сервлете

Я что-то упускаю в довольно простой задаче: мне нужно проверить, не разархивирован ли входящий запрос входного потока, и разархивировать его содержимое. это без использования типа контента. я думал о чем-то вроде этого:

проверьте, отправлен ли запрос:

private boolean isGZIPed( HttpServletRequest request )
{
    boolean isGziped = false;
    try
    {
        PushbackInputStream pb = new PushbackInputStream( request.getInputStream(), 2 );
        byte[] signature = new byte[2];
        pb.read( signature );
        pb.unread( signature );
        int head = ( (int)signature[0] & 0xff ) | ( ( signature[1] << 8 ) & 0xff00 );
        isGziped = GZIPInputStream.GZIP_MAGIC == head;
    }
    catch( Exception ioe )
    {
        logger.error(ioe);
    }
    return isGziped;
}

распакуйте его, если это действительно gziped:

if(isGziped(request) 
{
    GZIPInputStream gzis = new GZIPInputStream( request.getInputStream() );
    InputStreamReader reader = new InputStreamReader( gzis );
    ...
}

Моя проблема заключается в том, что новый GZIPInputStream( request.getInputStream()) всегда генерирует исключение "не в формате gzip". что я скучаю?

1 ответ

Решение

Когда вы читаете из потока ввода push-back, вы удаляете данные из потока ввода запроса. "Непрочитанные" байты только выталкивают их в поток отталкивания, а не в основной поток.

Вы должны создать GZIPInputStream с потоком возврата назад, чтобы байты, которые вы прочитали и передали назад, могли быть перечитаны:

GZIPInputStream gzis = new GZIPInputStream( pb );

Это означает, что поток отталкивания должен быть объявлен в соответствующей области видимости.

Другие вопросы по тегам