what-the-bank/sources/io/grpc/internal/GzipInflatingBuffer.java

525 lines
19 KiB
Java
Raw Permalink Normal View History

2024-07-27 18:17:47 +07:00
package io.grpc.internal;
import com.google.common.base.Preconditions;
import com.google.common.primitives.UnsignedBytes;
import io.flutter.embedding.android.KeyboardMap;
import java.io.Closeable;
import java.util.zip.CRC32;
import java.util.zip.DataFormatException;
import java.util.zip.Inflater;
import java.util.zip.ZipException;
/* JADX INFO: Access modifiers changed from: package-private */
/* loaded from: classes6.dex */
public class GzipInflatingBuffer implements Closeable {
private static final int GZIP_HEADER_MIN_SIZE = 10;
private static final int GZIP_MAGIC = 35615;
private static final int GZIP_TRAILER_SIZE = 8;
private static final int HEADER_COMMENT_FLAG = 16;
private static final int HEADER_CRC_FLAG = 2;
private static final int HEADER_EXTRA_FLAG = 4;
private static final int HEADER_NAME_FLAG = 8;
private static final int INFLATE_BUFFER_SIZE = 512;
private static final int UNSIGNED_SHORT_SIZE = 2;
private long expectedGzipTrailerIsize;
private int gzipHeaderFlag;
private int headerExtraToRead;
private Inflater inflater;
private int inflaterInputEnd;
private int inflaterInputStart;
private final CompositeReadableBuffer gzippedData = new CompositeReadableBuffer();
private final CRC32 crc = new CRC32();
private final GzipMetadataReader gzipMetadataReader = new GzipMetadataReader(this, null);
private final byte[] inflaterInput = new byte[512];
private State state = State.HEADER;
private boolean closed = false;
private int bytesConsumed = 0;
private int deflatedBytesConsumed = 0;
private boolean isStalled = true;
/* JADX INFO: Access modifiers changed from: package-private */
/* loaded from: classes6.dex */
public enum State {
HEADER,
HEADER_EXTRA_LEN,
HEADER_EXTRA,
HEADER_NAME,
HEADER_COMMENT,
HEADER_CRC,
INITIALIZE_INFLATER,
INFLATING,
INFLATER_NEEDS_INPUT,
TRAILER
}
static /* synthetic */ int access$112(GzipInflatingBuffer gzipInflatingBuffer, int i) {
int i2 = gzipInflatingBuffer.inflaterInputStart + i;
gzipInflatingBuffer.inflaterInputStart = i2;
return i2;
}
static /* synthetic */ int access$512(GzipInflatingBuffer gzipInflatingBuffer, int i) {
int i2 = gzipInflatingBuffer.bytesConsumed + i;
gzipInflatingBuffer.bytesConsumed = i2;
return i2;
}
/* JADX INFO: Access modifiers changed from: package-private */
/* loaded from: classes6.dex */
public class GzipMetadataReader {
final GzipInflatingBuffer this$0;
private GzipMetadataReader(GzipInflatingBuffer gzipInflatingBuffer) {
this.this$0 = gzipInflatingBuffer;
}
/* synthetic */ GzipMetadataReader(GzipInflatingBuffer gzipInflatingBuffer, AnonymousClass1 anonymousClass1) {
this(gzipInflatingBuffer);
}
/* JADX INFO: Access modifiers changed from: private */
public int readUnsignedByte() {
int readUnsignedByte;
if (this.this$0.inflaterInputEnd - this.this$0.inflaterInputStart > 0) {
readUnsignedByte = this.this$0.inflaterInput[this.this$0.inflaterInputStart] & UnsignedBytes.MAX_VALUE;
GzipInflatingBuffer.access$112(this.this$0, 1);
} else {
readUnsignedByte = this.this$0.gzippedData.readUnsignedByte();
}
this.this$0.crc.update(readUnsignedByte);
GzipInflatingBuffer.access$512(this.this$0, 1);
return readUnsignedByte;
}
/* JADX INFO: Access modifiers changed from: private */
public void skipBytes(int i) {
int i2;
int i3 = this.this$0.inflaterInputEnd - this.this$0.inflaterInputStart;
if (i3 > 0) {
int min = Math.min(i3, i);
this.this$0.crc.update(this.this$0.inflaterInput, this.this$0.inflaterInputStart, min);
GzipInflatingBuffer.access$112(this.this$0, min);
i2 = i - min;
} else {
i2 = i;
}
if (i2 > 0) {
byte[] bArr = new byte[512];
int i4 = 0;
while (i4 < i2) {
int min2 = Math.min(i2 - i4, 512);
this.this$0.gzippedData.readBytes(bArr, 0, min2);
this.this$0.crc.update(bArr, 0, min2);
i4 += min2;
}
}
GzipInflatingBuffer.access$512(this.this$0, i);
}
/* JADX INFO: Access modifiers changed from: private */
public int readableBytes() {
return (this.this$0.inflaterInputEnd - this.this$0.inflaterInputStart) + this.this$0.gzippedData.readableBytes();
}
/* JADX INFO: Access modifiers changed from: private */
public boolean readBytesUntilZero() {
while (readableBytes() > 0) {
if (readUnsignedByte() == 0) {
return true;
}
}
return false;
}
/* JADX INFO: Access modifiers changed from: private */
public int readUnsignedShort() {
return readUnsignedByte() | (readUnsignedByte() << 8);
}
/* JADX INFO: Access modifiers changed from: private */
public long readUnsignedInt() {
return readUnsignedShort() | (readUnsignedShort() << 16);
}
}
/* JADX INFO: Access modifiers changed from: package-private */
public boolean isStalled() {
Preconditions.checkState(!this.closed, "GzipInflatingBuffer is closed");
return this.isStalled;
}
/* JADX INFO: Access modifiers changed from: package-private */
public boolean hasPartialData() {
Preconditions.checkState(!this.closed, "GzipInflatingBuffer is closed");
return (this.gzipMetadataReader.readableBytes() == 0 && this.state == State.HEADER) ? false : true;
}
/* JADX INFO: Access modifiers changed from: package-private */
public void addGzippedBytes(ReadableBuffer readableBuffer) {
Preconditions.checkState(!this.closed, "GzipInflatingBuffer is closed");
this.gzippedData.addBuffer(readableBuffer);
this.isStalled = false;
}
@Override // java.io.Closeable, java.lang.AutoCloseable
public void close() {
if (this.closed) {
return;
}
this.closed = true;
this.gzippedData.close();
Inflater inflater = this.inflater;
if (inflater != null) {
inflater.end();
this.inflater = null;
}
}
/* JADX INFO: Access modifiers changed from: package-private */
/* JADX WARN: Code restructure failed: missing block: B:47:0x0074, code lost:
if (r3 == false) goto L30;
*/
/* JADX WARN: Code restructure failed: missing block: B:49:0x007a, code lost:
if (r6.state != io.grpc.internal.GzipInflatingBuffer.State.HEADER) goto L29;
*/
/* JADX WARN: Code restructure failed: missing block: B:51:0x0084, code lost:
if (r6.gzipMetadataReader.readableBytes() >= 10) goto L29;
*/
/* JADX WARN: Code restructure failed: missing block: B:52:0x0087, code lost:
r1 = false;
*/
/* JADX WARN: Code restructure failed: missing block: B:53:0x0088, code lost:
r6.isStalled = r1;
*/
/* JADX WARN: Code restructure failed: missing block: B:54:0x008a, code lost:
return r2;
*/
/* JADX WARN: Failed to find 'out' block for switch in B:7:0x001c. Please report as an issue. */
/*
Code decompiled incorrectly, please refer to instructions dump.
To view partially-correct add '--show-bad-code' argument
*/
public int inflateBytes(byte[] r7, int r8, int r9) throws java.util.zip.DataFormatException, java.util.zip.ZipException {
/*
r6 = this;
boolean r0 = r6.closed
r1 = 1
r0 = r0 ^ r1
java.lang.String r2 = "GzipInflatingBuffer is closed"
com.google.common.base.Preconditions.checkState(r0, r2)
r0 = 0
r2 = r0
Lb:
r3 = r1
Lc:
if (r3 == 0) goto L74
int r4 = r9 - r2
if (r4 <= 0) goto L74
int[] r3 = io.grpc.internal.GzipInflatingBuffer.AnonymousClass1.$SwitchMap$io$grpc$internal$GzipInflatingBuffer$State
io.grpc.internal.GzipInflatingBuffer$State r5 = r6.state
int r5 = r5.ordinal()
r3 = r3[r5]
switch(r3) {
case 1: goto L6f;
case 2: goto L6a;
case 3: goto L65;
case 4: goto L60;
case 5: goto L5b;
case 6: goto L56;
case 7: goto L51;
case 8: goto L3f;
case 9: goto L3a;
case 10: goto L35;
default: goto L1f;
}
L1f:
java.lang.AssertionError r7 = new java.lang.AssertionError
java.lang.StringBuilder r8 = new java.lang.StringBuilder
java.lang.String r9 = "Invalid state: "
r8.<init>(r9)
io.grpc.internal.GzipInflatingBuffer$State r9 = r6.state
r8.append(r9)
java.lang.String r8 = r8.toString()
r7.<init>(r8)
throw r7
L35:
boolean r3 = r6.processTrailer()
goto Lc
L3a:
boolean r3 = r6.fill()
goto Lc
L3f:
int r3 = r8 + r2
int r3 = r6.inflate(r7, r3, r4)
int r2 = r2 + r3
io.grpc.internal.GzipInflatingBuffer$State r3 = r6.state
io.grpc.internal.GzipInflatingBuffer$State r4 = io.grpc.internal.GzipInflatingBuffer.State.TRAILER
if (r3 != r4) goto Lb
boolean r3 = r6.processTrailer()
goto Lc
L51:
boolean r3 = r6.initializeInflater()
goto Lc
L56:
boolean r3 = r6.processHeaderCrc()
goto Lc
L5b:
boolean r3 = r6.processHeaderComment()
goto Lc
L60:
boolean r3 = r6.processHeaderName()
goto Lc
L65:
boolean r3 = r6.processHeaderExtra()
goto Lc
L6a:
boolean r3 = r6.processHeaderExtraLen()
goto Lc
L6f:
boolean r3 = r6.processHeader()
goto Lc
L74:
if (r3 == 0) goto L88
io.grpc.internal.GzipInflatingBuffer$State r7 = r6.state
io.grpc.internal.GzipInflatingBuffer$State r8 = io.grpc.internal.GzipInflatingBuffer.State.HEADER
if (r7 != r8) goto L87
io.grpc.internal.GzipInflatingBuffer$GzipMetadataReader r7 = r6.gzipMetadataReader
int r7 = io.grpc.internal.GzipInflatingBuffer.GzipMetadataReader.access$700(r7)
r8 = 10
if (r7 >= r8) goto L87
goto L88
L87:
r1 = r0
L88:
r6.isStalled = r1
return r2
*/
throw new UnsupportedOperationException("Method not decompiled: io.grpc.internal.GzipInflatingBuffer.inflateBytes(byte[], int, int):int");
}
/* renamed from: io.grpc.internal.GzipInflatingBuffer$1, reason: invalid class name */
/* loaded from: classes6.dex */
static /* synthetic */ class AnonymousClass1 {
static final int[] $SwitchMap$io$grpc$internal$GzipInflatingBuffer$State;
static {
int[] iArr = new int[State.values().length];
$SwitchMap$io$grpc$internal$GzipInflatingBuffer$State = iArr;
try {
iArr[State.HEADER.ordinal()] = 1;
} catch (NoSuchFieldError unused) {
}
try {
$SwitchMap$io$grpc$internal$GzipInflatingBuffer$State[State.HEADER_EXTRA_LEN.ordinal()] = 2;
} catch (NoSuchFieldError unused2) {
}
try {
$SwitchMap$io$grpc$internal$GzipInflatingBuffer$State[State.HEADER_EXTRA.ordinal()] = 3;
} catch (NoSuchFieldError unused3) {
}
try {
$SwitchMap$io$grpc$internal$GzipInflatingBuffer$State[State.HEADER_NAME.ordinal()] = 4;
} catch (NoSuchFieldError unused4) {
}
try {
$SwitchMap$io$grpc$internal$GzipInflatingBuffer$State[State.HEADER_COMMENT.ordinal()] = 5;
} catch (NoSuchFieldError unused5) {
}
try {
$SwitchMap$io$grpc$internal$GzipInflatingBuffer$State[State.HEADER_CRC.ordinal()] = 6;
} catch (NoSuchFieldError unused6) {
}
try {
$SwitchMap$io$grpc$internal$GzipInflatingBuffer$State[State.INITIALIZE_INFLATER.ordinal()] = 7;
} catch (NoSuchFieldError unused7) {
}
try {
$SwitchMap$io$grpc$internal$GzipInflatingBuffer$State[State.INFLATING.ordinal()] = 8;
} catch (NoSuchFieldError unused8) {
}
try {
$SwitchMap$io$grpc$internal$GzipInflatingBuffer$State[State.INFLATER_NEEDS_INPUT.ordinal()] = 9;
} catch (NoSuchFieldError unused9) {
}
try {
$SwitchMap$io$grpc$internal$GzipInflatingBuffer$State[State.TRAILER.ordinal()] = 10;
} catch (NoSuchFieldError unused10) {
}
}
}
private boolean processHeader() throws ZipException {
if (this.gzipMetadataReader.readableBytes() < 10) {
return false;
}
if (this.gzipMetadataReader.readUnsignedShort() == GZIP_MAGIC) {
if (this.gzipMetadataReader.readUnsignedByte() == 8) {
this.gzipHeaderFlag = this.gzipMetadataReader.readUnsignedByte();
this.gzipMetadataReader.skipBytes(6);
this.state = State.HEADER_EXTRA_LEN;
return true;
}
throw new ZipException("Unsupported compression method");
}
throw new ZipException("Not in GZIP format");
}
private boolean processHeaderExtraLen() {
if ((this.gzipHeaderFlag & 4) == 4) {
if (this.gzipMetadataReader.readableBytes() < 2) {
return false;
}
this.headerExtraToRead = this.gzipMetadataReader.readUnsignedShort();
this.state = State.HEADER_EXTRA;
return true;
}
this.state = State.HEADER_NAME;
return true;
}
private boolean processHeaderExtra() {
int readableBytes = this.gzipMetadataReader.readableBytes();
int i = this.headerExtraToRead;
if (readableBytes < i) {
return false;
}
this.gzipMetadataReader.skipBytes(i);
this.state = State.HEADER_NAME;
return true;
}
private boolean processHeaderName() {
if ((this.gzipHeaderFlag & 8) == 8) {
if (!this.gzipMetadataReader.readBytesUntilZero()) {
return false;
}
this.state = State.HEADER_COMMENT;
return true;
}
this.state = State.HEADER_COMMENT;
return true;
}
private boolean processHeaderComment() {
if ((this.gzipHeaderFlag & 16) == 16) {
if (!this.gzipMetadataReader.readBytesUntilZero()) {
return false;
}
this.state = State.HEADER_CRC;
return true;
}
this.state = State.HEADER_CRC;
return true;
}
private boolean processHeaderCrc() throws ZipException {
if ((this.gzipHeaderFlag & 2) == 2) {
if (this.gzipMetadataReader.readableBytes() < 2) {
return false;
}
if ((((int) this.crc.getValue()) & 65535) != this.gzipMetadataReader.readUnsignedShort()) {
throw new ZipException("Corrupt GZIP header");
}
this.state = State.INITIALIZE_INFLATER;
return true;
}
this.state = State.INITIALIZE_INFLATER;
return true;
}
private boolean initializeInflater() {
Inflater inflater = this.inflater;
if (inflater == null) {
this.inflater = new Inflater(true);
} else {
inflater.reset();
}
this.crc.reset();
int i = this.inflaterInputEnd;
int i2 = this.inflaterInputStart;
int i3 = i - i2;
if (i3 > 0) {
this.inflater.setInput(this.inflaterInput, i2, i3);
this.state = State.INFLATING;
} else {
this.state = State.INFLATER_NEEDS_INPUT;
}
return true;
}
private int inflate(byte[] bArr, int i, int i2) throws DataFormatException, ZipException {
Preconditions.checkState(this.inflater != null, "inflater is null");
try {
int totalIn = this.inflater.getTotalIn();
int inflate = this.inflater.inflate(bArr, i, i2);
int totalIn2 = this.inflater.getTotalIn() - totalIn;
this.bytesConsumed += totalIn2;
this.deflatedBytesConsumed += totalIn2;
this.inflaterInputStart += totalIn2;
this.crc.update(bArr, i, inflate);
if (this.inflater.finished()) {
this.expectedGzipTrailerIsize = this.inflater.getBytesWritten() & KeyboardMap.kValueMask;
this.state = State.TRAILER;
} else if (this.inflater.needsInput()) {
this.state = State.INFLATER_NEEDS_INPUT;
}
return inflate;
} catch (DataFormatException e) {
StringBuilder sb = new StringBuilder("Inflater data format exception: ");
sb.append(e.getMessage());
throw new DataFormatException(sb.toString());
}
}
private boolean fill() {
Preconditions.checkState(this.inflater != null, "inflater is null");
Preconditions.checkState(this.inflaterInputStart == this.inflaterInputEnd, "inflaterInput has unconsumed bytes");
int min = Math.min(this.gzippedData.readableBytes(), 512);
if (min == 0) {
return false;
}
this.inflaterInputStart = 0;
this.inflaterInputEnd = min;
this.gzippedData.readBytes(this.inflaterInput, 0, min);
this.inflater.setInput(this.inflaterInput, this.inflaterInputStart, min);
this.state = State.INFLATING;
return true;
}
private boolean processTrailer() throws ZipException {
if (this.inflater != null && this.gzipMetadataReader.readableBytes() <= 18) {
this.inflater.end();
this.inflater = null;
}
if (this.gzipMetadataReader.readableBytes() < 8) {
return false;
}
if (this.crc.getValue() != this.gzipMetadataReader.readUnsignedInt() || this.expectedGzipTrailerIsize != this.gzipMetadataReader.readUnsignedInt()) {
throw new ZipException("Corrupt GZIP trailer");
}
this.crc.reset();
this.state = State.HEADER;
return true;
}
/* JADX INFO: Access modifiers changed from: package-private */
public int getAndResetDeflatedBytesConsumed() {
int i = this.deflatedBytesConsumed;
this.deflatedBytesConsumed = 0;
return i;
}
/* JADX INFO: Access modifiers changed from: package-private */
public int getAndResetBytesConsumed() {
int i = this.bytesConsumed;
this.bytesConsumed = 0;
return i;
}
}