115 lines
4.0 KiB
Java
115 lines
4.0 KiB
Java
|
package io.grpc.internal;
|
||
|
|
||
|
import com.google.common.base.Charsets;
|
||
|
import com.google.common.io.BaseEncoding;
|
||
|
import io.grpc.InternalMetadata;
|
||
|
import io.grpc.Metadata;
|
||
|
import java.util.ArrayList;
|
||
|
import java.util.Arrays;
|
||
|
import java.util.logging.Logger;
|
||
|
|
||
|
/* loaded from: classes6.dex */
|
||
|
public final class TransportFrameUtil {
|
||
|
private static final Logger logger = Logger.getLogger(TransportFrameUtil.class.getName());
|
||
|
private static final byte[] binaryHeaderSuffixBytes = Metadata.BINARY_HEADER_SUFFIX.getBytes(Charsets.US_ASCII);
|
||
|
|
||
|
public static byte[][] toHttp2Headers(Metadata metadata) {
|
||
|
byte[][] serialize = InternalMetadata.serialize(metadata);
|
||
|
if (serialize == null) {
|
||
|
return new byte[0];
|
||
|
}
|
||
|
int i = 0;
|
||
|
for (int i2 = 0; i2 < serialize.length; i2 += 2) {
|
||
|
byte[] bArr = serialize[i2];
|
||
|
byte[] bArr2 = serialize[i2 + 1];
|
||
|
if (endsWith(bArr, binaryHeaderSuffixBytes)) {
|
||
|
serialize[i] = bArr;
|
||
|
serialize[i + 1] = InternalMetadata.BASE64_ENCODING_OMIT_PADDING.encode(bArr2).getBytes(Charsets.US_ASCII);
|
||
|
} else if (isSpecCompliantAscii(bArr2)) {
|
||
|
serialize[i] = bArr;
|
||
|
serialize[i + 1] = bArr2;
|
||
|
} else {
|
||
|
String str = new String(bArr, Charsets.US_ASCII);
|
||
|
Logger logger2 = logger;
|
||
|
StringBuilder sb = new StringBuilder("Metadata key=");
|
||
|
sb.append(str);
|
||
|
sb.append(", value=");
|
||
|
sb.append(Arrays.toString(bArr2));
|
||
|
sb.append(" contains invalid ASCII characters");
|
||
|
logger2.warning(sb.toString());
|
||
|
}
|
||
|
i += 2;
|
||
|
}
|
||
|
return i == serialize.length ? serialize : (byte[][]) Arrays.copyOfRange(serialize, 0, i);
|
||
|
}
|
||
|
|
||
|
public static byte[][] toRawSerializedHeaders(byte[][] bArr) {
|
||
|
for (int i = 0; i < bArr.length; i += 2) {
|
||
|
byte[] bArr2 = bArr[i];
|
||
|
int i2 = i + 1;
|
||
|
byte[] bArr3 = bArr[i2];
|
||
|
if (endsWith(bArr2, binaryHeaderSuffixBytes)) {
|
||
|
for (byte b : bArr3) {
|
||
|
if (b == 44) {
|
||
|
return serializeHeadersWithCommasInBin(bArr, i);
|
||
|
}
|
||
|
}
|
||
|
bArr[i2] = BaseEncoding.base64().decode(new String(bArr3, Charsets.US_ASCII));
|
||
|
}
|
||
|
}
|
||
|
return bArr;
|
||
|
}
|
||
|
|
||
|
private static byte[][] serializeHeadersWithCommasInBin(byte[][] bArr, int i) {
|
||
|
ArrayList arrayList = new ArrayList(bArr.length + 10);
|
||
|
for (int i2 = 0; i2 < i; i2++) {
|
||
|
arrayList.add(bArr[i2]);
|
||
|
}
|
||
|
while (i < bArr.length) {
|
||
|
byte[] bArr2 = bArr[i];
|
||
|
byte[] bArr3 = bArr[i + 1];
|
||
|
if (!endsWith(bArr2, binaryHeaderSuffixBytes)) {
|
||
|
arrayList.add(bArr2);
|
||
|
arrayList.add(bArr3);
|
||
|
} else {
|
||
|
int i3 = 0;
|
||
|
for (int i4 = 0; i4 <= bArr3.length; i4++) {
|
||
|
if (i4 == bArr3.length || bArr3[i4] == 44) {
|
||
|
byte[] decode = BaseEncoding.base64().decode(new String(bArr3, i3, i4 - i3, Charsets.US_ASCII));
|
||
|
arrayList.add(bArr2);
|
||
|
arrayList.add(decode);
|
||
|
i3 = i4 + 1;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
i += 2;
|
||
|
}
|
||
|
return (byte[][]) arrayList.toArray(new byte[0]);
|
||
|
}
|
||
|
|
||
|
private static boolean endsWith(byte[] bArr, byte[] bArr2) {
|
||
|
int length = bArr.length - bArr2.length;
|
||
|
if (length < 0) {
|
||
|
return false;
|
||
|
}
|
||
|
for (int i = length; i < bArr.length; i++) {
|
||
|
if (bArr[i] != bArr2[i - length]) {
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
private static boolean isSpecCompliantAscii(byte[] bArr) {
|
||
|
for (byte b : bArr) {
|
||
|
if (b < 32 || b > 126) {
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
private TransportFrameUtil() {
|
||
|
}
|
||
|
}
|