/*
* Copyright (c) 2014-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
package com.facebook.stetho.inspector.network;
import com.facebook.stetho.inspector.console.CLog;
import com.facebook.stetho.inspector.protocol.module.Console;
import javax.annotation.Nullable;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.zip.InflaterOutputStream;
// @VisibleForTest
public class DecompressionHelper {
static final String GZIP_ENCODING = "gzip";
static final String DEFLATE_ENCODING = "deflate";
public static InputStream teeInputWithDecompression(
NetworkPeerManager peerManager,
String requestId,
InputStream availableInputStream,
OutputStream decompressedOutput,
@Nullable String contentEncoding,
ResponseHandler responseHandler) throws IOException {
OutputStream output = decompressedOutput;
CountingOutputStream decompressedCounter = null;
if (contentEncoding != null) {
boolean gzipEncoding = GZIP_ENCODING.equals(contentEncoding);
boolean deflateEncoding = DEFLATE_ENCODING.equals(contentEncoding);
if (gzipEncoding || deflateEncoding) {
decompressedCounter = new CountingOutputStream(decompressedOutput);
if (gzipEncoding) {
output = GunzippingOutputStream.create(decompressedCounter);
} else if (deflateEncoding) {
output = new InflaterOutputStream(decompressedCounter);
}
} else {
CLog.writeToConsole(
peerManager,
Console.MessageLevel.WARNING,
Console.MessageSource.NETWORK,
"Unsupported Content-Encoding in response for request #" + requestId +
": " + contentEncoding);
}
}
return new ResponseHandlingInputStream(
availableInputStream,
requestId,
output,
decompressedCounter,
peerManager,
responseHandler);
}
}