2013-07-14 2 views
1

Мне не хватает чего-то в довольно простой задаче: мне нужно проверить, включен ли входной поток входящего запроса и развязать его содержимое. это без использования содержимого. я думал о чем-то вроде этого:чтение 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; 
} 

ungzip его, если оно действительно являющегося файлом:

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); 

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

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