When you read from the push-back input stream you remove data from the request input stream. "Unreading" bytes only pushes them to the push-back stream, not to the underlaying stream.
You should create the GZIPInputStream
with the push back stream so that the bytes you read and pushed back can be re-read:
GZIPInputStream gzis = new GZIPInputStream( pb );
This means the push-back stream has to be declared in the appropriate scope.