正在查看: 逼多多 v3.6.2 应用的 Metadata.java JAVA 源代码文件
本页面展示 JAVA 反编译生成的源代码文件,支持语法高亮显示。 仅供安全研究与技术分析使用,严禁用于任何非法用途。请遵守相关法律法规。
正在查看: 逼多多 v3.6.2 应用的 Metadata.java JAVA 源代码文件
本页面展示 JAVA 反编译生成的源代码文件,支持语法高亮显示。 仅供安全研究与技术分析使用,严禁用于任何非法用途。请遵守相关法律法规。
package io.grpc;
import com.google.common.io.BaseEncoding;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.BitSet;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Locale;
import java.util.NoSuchElementException;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import q.c;
import q.l;
public final class Metadata {
static final boolean $assertionsDisabled = false;
public static final String BINARY_HEADER_SUFFIX = "-bin";
private Object[] namesAndValues;
private int size;
private static final Logger logger = Logger.getLogger(Metadata.class.getName());
public static final BinaryMarshaller<byte[]> BINARY_BYTE_MARSHALLER = new BinaryMarshaller<byte[]>() {
@Override
public byte[] parseBytes(byte[] bArr) {
return bArr;
}
@Override
public byte[] toBytes(byte[] bArr) {
return bArr;
}
};
public static final AsciiMarshaller<String> ASCII_STRING_MARSHALLER = new AsciiMarshaller<String>() {
@Override
public String parseAsciiString(String str) {
return str;
}
@Override
public String toAsciiString(String str) {
return str;
}
};
static final BaseEncoding BASE64_ENCODING_OMIT_PADDING = BaseEncoding.a().k();
private static class AsciiKey<T> extends Key<T> {
private final AsciiMarshaller<T> marshaller;
@Override
T parseBytes(byte[] bArr) {
return this.marshaller.parseAsciiString(new String(bArr, c.a));
}
@Override
byte[] toBytes(T t) {
return ((String) l.o(this.marshaller.toAsciiString(t), "null marshaller.toAsciiString()")).getBytes(c.a);
}
private AsciiKey(String str, boolean z, AsciiMarshaller<T> asciiMarshaller) {
super(str, z, asciiMarshaller);
l.k(!str.endsWith(Metadata.BINARY_HEADER_SUFFIX), "ASCII header is named %s. Only binary headers may end with %s", str, Metadata.BINARY_HEADER_SUFFIX);
this.marshaller = (AsciiMarshaller) l.o(asciiMarshaller, "marshaller");
}
}
public interface AsciiMarshaller<T> {
T parseAsciiString(String str);
String toAsciiString(T t);
}
private static class BinaryKey<T> extends Key<T> {
private final BinaryMarshaller<T> marshaller;
@Override
T parseBytes(byte[] bArr) {
return this.marshaller.parseBytes(bArr);
}
@Override
byte[] toBytes(T t) {
return (byte[]) l.o(this.marshaller.toBytes(t), "null marshaller.toBytes()");
}
private BinaryKey(String str, BinaryMarshaller<T> binaryMarshaller) {
super(str, false, binaryMarshaller);
l.k(str.endsWith(Metadata.BINARY_HEADER_SUFFIX), "Binary header is named %s. It must end with %s", str, Metadata.BINARY_HEADER_SUFFIX);
l.e(str.length() > 4, "empty key name");
this.marshaller = (BinaryMarshaller) l.o(binaryMarshaller, "marshaller is null");
}
}
public interface BinaryMarshaller<T> {
T parseBytes(byte[] bArr);
byte[] toBytes(T t);
}
@ExperimentalApi("https://github.com/grpc/grpc-java/issues/6575")
public interface BinaryStreamMarshaller<T> {
T parseStream(InputStream inputStream);
InputStream toStream(T t);
}
private final class IterableAt<T> implements Iterable<T> {
private final Key<T> key;
private int startIdx;
@Override
public Iterator<T> iterator() {
return new Iterator<T>() {
private boolean hasNext = true;
private int idx;
{
this.idx = IterableAt.this.startIdx;
}
@Override
public boolean hasNext() {
if (this.hasNext) {
return true;
}
while (this.idx < Metadata.this.size) {
IterableAt iterableAt = IterableAt.this;
if (Metadata.this.bytesEqual(iterableAt.key.asciiName(), Metadata.this.name(this.idx))) {
this.hasNext = true;
return true;
}
this.idx++;
}
return false;
}
@Override
public T next() {
if (!hasNext()) {
throw new NoSuchElementException();
}
this.hasNext = false;
IterableAt iterableAt = IterableAt.this;
Metadata metadata = Metadata.this;
int i = this.idx;
this.idx = i + 1;
return (T) metadata.valueAsT(i, iterableAt.key);
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
};
}
private IterableAt(Key<T> key, int i) {
this.key = key;
this.startIdx = i;
}
}
public static abstract class Key<T> {
private static final BitSet VALID_T_CHARS = generateValidTChars();
private final Object marshaller;
private final String name;
private final byte[] nameBytes;
private final String originalName;
private static BitSet generateValidTChars() {
BitSet bitSet = new BitSet(127);
bitSet.set(45);
bitSet.set(95);
bitSet.set(46);
for (char c = '0'; c <= '9'; c = (char) (c + 1)) {
bitSet.set(c);
}
for (char c3 = 'a'; c3 <= 'z'; c3 = (char) (c3 + 1)) {
bitSet.set(c3);
}
return bitSet;
}
public static <T> Key<T> of(String str, BinaryMarshaller<T> binaryMarshaller) {
return new BinaryKey(str, binaryMarshaller);
}
private static String validateName(String str, boolean z) {
l.o(str, "name");
l.e(!str.isEmpty(), "token must have at least 1 tchar");
if (str.equals("connection")) {
Metadata.logger.log(Level.WARNING, "Metadata key is 'Connection', which should not be used. That is used by HTTP/1 for connection-specific headers which are not to be forwarded. There is probably an HTTP/1 conversion bug. Simply removing the Connection header is not enough; you should remove all headers it references as well. See RFC 7230 section 6.1", (Throwable) new RuntimeException("exception to show backtrace"));
}
for (int i = 0; i < str.length(); i++) {
char charAt = str.charAt(i);
if (!z || charAt != ':' || i != 0) {
l.g(VALID_T_CHARS.get(charAt), "Invalid character '%s' in key name '%s'", charAt, str);
}
}
return str;
}
byte[] asciiName() {
return this.nameBytes;
}
public final boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
return this.name.equals(((Key) obj).name);
}
final <M> M getMarshaller(Class<M> cls) {
if (cls.isInstance(this.marshaller)) {
return cls.cast(this.marshaller);
}
return null;
}
public final int hashCode() {
return this.name.hashCode();
}
public final String name() {
return this.name;
}
public final String originalName() {
return this.originalName;
}
abstract T parseBytes(byte[] bArr);
boolean serializesToStreams() {
return false;
}
abstract byte[] toBytes(T t);
public String toString() {
return "Key{name='" + this.name + "'}";
}
private Key(String str, boolean z, Object obj) {
String str2 = (String) l.o(str, "name");
this.originalName = str2;
String validateName = validateName(str2.toLowerCase(Locale.ROOT), z);
this.name = validateName;
this.nameBytes = validateName.getBytes(c.a);
this.marshaller = obj;
}
@ExperimentalApi("https://github.com/grpc/grpc-java/issues/6575")
public static <T> Key<T> of(String str, BinaryStreamMarshaller<T> binaryStreamMarshaller) {
return new LazyStreamBinaryKey(str, binaryStreamMarshaller);
}
public static <T> Key<T> of(String str, AsciiMarshaller<T> asciiMarshaller) {
return of(str, false, (AsciiMarshaller) asciiMarshaller);
}
static <T> Key<T> of(String str, boolean z, AsciiMarshaller<T> asciiMarshaller) {
return new AsciiKey(str, z, asciiMarshaller);
}
static <T> Key<T> of(String str, boolean z, TrustedAsciiMarshaller<T> trustedAsciiMarshaller) {
return new TrustedAsciiKey(str, z, trustedAsciiMarshaller);
}
}
private static class LazyStreamBinaryKey<T> extends Key<T> {
private final BinaryStreamMarshaller<T> marshaller;
@Override
T parseBytes(byte[] bArr) {
return this.marshaller.parseStream(new ByteArrayInputStream(bArr));
}
@Override
boolean serializesToStreams() {
return true;
}
@Override
byte[] toBytes(T t) {
return Metadata.streamToBytes((InputStream) l.o(this.marshaller.toStream(t), "null marshaller.toStream()"));
}
private LazyStreamBinaryKey(String str, BinaryStreamMarshaller<T> binaryStreamMarshaller) {
super(str, false, binaryStreamMarshaller);
l.k(str.endsWith(Metadata.BINARY_HEADER_SUFFIX), "Binary header is named %s. It must end with %s", str, Metadata.BINARY_HEADER_SUFFIX);
l.e(str.length() > 4, "empty key name");
this.marshaller = (BinaryStreamMarshaller) l.o(binaryStreamMarshaller, "marshaller is null");
}
}
static final class LazyValue<T> {
private final BinaryStreamMarshaller<T> marshaller;
private volatile byte[] serialized;
private final T value;
LazyValue(BinaryStreamMarshaller<T> binaryStreamMarshaller, T t) {
this.marshaller = binaryStreamMarshaller;
this.value = t;
}
static <T> LazyValue<T> create(Key<T> key, T t) {
return new LazyValue<>((BinaryStreamMarshaller) l.n(getBinaryStreamMarshaller(key)), t);
}
private static <T> BinaryStreamMarshaller<T> getBinaryStreamMarshaller(Key<T> key) {
return (BinaryStreamMarshaller) key.getMarshaller(BinaryStreamMarshaller.class);
}
byte[] toBytes() {
if (this.serialized == null) {
synchronized (this) {
try {
if (this.serialized == null) {
this.serialized = Metadata.streamToBytes(toStream());
}
} finally {
}
}
}
return this.serialized;
}
<T2> T2 toObject(Key<T2> key) {
BinaryStreamMarshaller binaryStreamMarshaller;
return (!key.serializesToStreams() || (binaryStreamMarshaller = getBinaryStreamMarshaller(key)) == null) ? key.parseBytes(toBytes()) : (T2) binaryStreamMarshaller.parseStream(toStream());
}
InputStream toStream() {
return (InputStream) l.o(this.marshaller.toStream(this.value), "null marshaller.toStream()");
}
}
private static final class TrustedAsciiKey<T> extends Key<T> {
private final TrustedAsciiMarshaller<T> marshaller;
@Override
T parseBytes(byte[] bArr) {
return this.marshaller.parseAsciiString(bArr);
}
@Override
byte[] toBytes(T t) {
return (byte[]) l.o(this.marshaller.toAsciiString(t), "null marshaller.toAsciiString()");
}
private TrustedAsciiKey(String str, boolean z, TrustedAsciiMarshaller<T> trustedAsciiMarshaller) {
super(str, z, trustedAsciiMarshaller);
l.k(!str.endsWith(Metadata.BINARY_HEADER_SUFFIX), "ASCII header is named %s. Only binary headers may end with %s", str, Metadata.BINARY_HEADER_SUFFIX);
this.marshaller = (TrustedAsciiMarshaller) l.o(trustedAsciiMarshaller, "marshaller");
}
}
interface TrustedAsciiMarshaller<T> {
T parseAsciiString(byte[] bArr);
byte[] toAsciiString(T t);
}
Metadata(byte[]... bArr) {
this(bArr.length / 2, bArr);
}
public boolean bytesEqual(byte[] bArr, byte[] bArr2) {
return Arrays.equals(bArr, bArr2);
}
private int cap() {
Object[] objArr = this.namesAndValues;
if (objArr != null) {
return objArr.length;
}
return 0;
}
private void expand(int i) {
Object[] objArr = new Object[i];
if (!isEmpty()) {
System.arraycopy(this.namesAndValues, 0, objArr, 0, len());
}
this.namesAndValues = objArr;
}
private boolean isEmpty() {
return this.size == 0;
}
private int len() {
return this.size * 2;
}
private void maybeExpand() {
if (len() == 0 || len() == cap()) {
expand(Math.max(len() * 2, 8));
}
}
public byte[] name(int i) {
return (byte[]) this.namesAndValues[i * 2];
}
public static byte[] streamToBytes(InputStream inputStream) {
try {
return r.a.d(inputStream);
} catch (IOException e) {
throw new RuntimeException("failure reading serialized stream", e);
}
}
private Object value(int i) {
return this.namesAndValues[(i * 2) + 1];
}
private byte[] valueAsBytes(int i) {
Object value = value(i);
return value instanceof byte[] ? (byte[]) value : ((LazyValue) value).toBytes();
}
private Object valueAsBytesOrStream(int i) {
Object value = value(i);
return value instanceof byte[] ? value : ((LazyValue) value).toStream();
}
public <T> T valueAsT(int i, Key<T> key) {
Object value = value(i);
return value instanceof byte[] ? key.parseBytes((byte[]) value) : (T) ((LazyValue) value).toObject(key);
}
public boolean containsKey(Key<?> key) {
for (int i = 0; i < this.size; i++) {
if (bytesEqual(key.asciiName(), name(i))) {
return true;
}
}
return false;
}
@ExperimentalApi("https://github.com/grpc/grpc-java/issues/4691")
public <T> void discardAll(Key<T> key) {
if (isEmpty()) {
return;
}
int i = 0;
for (int i2 = 0; i2 < this.size; i2++) {
if (!bytesEqual(key.asciiName(), name(i2))) {
name(i, name(i2));
value(i, value(i2));
i++;
}
}
Arrays.fill(this.namesAndValues, i * 2, len(), (Object) null);
this.size = i;
}
public <T> T get(Key<T> key) {
for (int i = this.size - 1; i >= 0; i--) {
if (bytesEqual(key.asciiName(), name(i))) {
return (T) valueAsT(i, key);
}
}
return null;
}
public <T> Iterable<T> getAll(Key<T> key) {
int i = 0;
while (true) {
if (i >= this.size) {
return null;
}
if (bytesEqual(key.asciiName(), name(i))) {
return new IterableAt(key, i);
}
i++;
}
}
int headerCount() {
return this.size;
}
public Set<String> keys() {
if (isEmpty()) {
return Collections.emptySet();
}
HashSet hashSet = new HashSet(this.size);
for (int i = 0; i < this.size; i++) {
hashSet.add(new String(name(i), 0));
}
return Collections.unmodifiableSet(hashSet);
}
public void merge(Metadata metadata) {
if (metadata.isEmpty()) {
return;
}
int cap = cap() - len();
if (isEmpty() || cap < metadata.len()) {
expand(len() + metadata.len());
}
System.arraycopy(metadata.namesAndValues, 0, this.namesAndValues, len(), metadata.len());
this.size += metadata.size;
}
public <T> void put(Key<T> key, T t) {
l.o(key, "key");
l.o(t, "value");
maybeExpand();
name(this.size, key.asciiName());
if (key.serializesToStreams()) {
value(this.size, LazyValue.create(key, t));
} else {
value(this.size, key.toBytes(t));
}
this.size++;
}
public <T> boolean remove(Key<T> key, T t) {
l.o(key, "key");
l.o(t, "value");
for (int i = 0; i < this.size; i++) {
if (bytesEqual(key.asciiName(), name(i)) && t.equals(valueAsT(i, key))) {
int i2 = i * 2;
int i3 = (i + 1) * 2;
int len = len() - i3;
Object[] objArr = this.namesAndValues;
System.arraycopy(objArr, i3, objArr, i2, len);
int i4 = this.size - 1;
this.size = i4;
name(i4, null);
value(this.size, (byte[]) null);
return true;
}
}
return false;
}
public <T> Iterable<T> removeAll(Key<T> key) {
if (isEmpty()) {
return null;
}
int i = 0;
ArrayList arrayList = null;
for (int i2 = 0; i2 < this.size; i2++) {
if (bytesEqual(key.asciiName(), name(i2))) {
if (arrayList == null) {
arrayList = new ArrayList();
}
arrayList.add(valueAsT(i2, key));
} else {
name(i, name(i2));
value(i, value(i2));
i++;
}
}
Arrays.fill(this.namesAndValues, i * 2, len(), (Object) null);
this.size = i;
return arrayList;
}
byte[][] serialize() {
byte[][] bArr = new byte[len()][];
Object[] objArr = this.namesAndValues;
if (objArr instanceof byte[][]) {
System.arraycopy(objArr, 0, bArr, 0, len());
} else {
for (int i = 0; i < this.size; i++) {
int i2 = i * 2;
bArr[i2] = name(i);
bArr[i2 + 1] = valueAsBytes(i);
}
}
return bArr;
}
Object[] serializePartial() {
Object[] objArr = new Object[len()];
for (int i = 0; i < this.size; i++) {
int i2 = i * 2;
objArr[i2] = name(i);
objArr[i2 + 1] = valueAsBytesOrStream(i);
}
return objArr;
}
public String toString() {
StringBuilder sb = new StringBuilder("Metadata(");
for (int i = 0; i < this.size; i++) {
if (i != 0) {
sb.append(',');
}
byte[] name = name(i);
Charset charset = c.a;
String str = new String(name, charset);
sb.append(str);
sb.append('=');
if (str.endsWith(BINARY_HEADER_SUFFIX)) {
sb.append(BASE64_ENCODING_OMIT_PADDING.e(valueAsBytes(i)));
} else {
sb.append(new String(valueAsBytes(i), charset));
}
}
sb.append(')');
return sb.toString();
}
Metadata(int i, byte[]... bArr) {
this(i, (Object[]) bArr);
}
private void name(int i, byte[] bArr) {
this.namesAndValues[i * 2] = bArr;
}
private void value(int i, byte[] bArr) {
this.namesAndValues[(i * 2) + 1] = bArr;
}
Metadata(int i, Object[] objArr) {
this.size = i;
this.namesAndValues = objArr;
}
private void value(int i, Object obj) {
if (this.namesAndValues instanceof byte[][]) {
expand(cap());
}
this.namesAndValues[(i * 2) + 1] = obj;
}
public Metadata() {
}
public void merge(Metadata metadata, Set<Key<?>> set) {
l.o(metadata, "other");
HashMap hashMap = new HashMap(set.size());
for (Key<?> key : set) {
hashMap.put(ByteBuffer.wrap(key.asciiName()), key);
}
for (int i = 0; i < metadata.size; i++) {
if (hashMap.containsKey(ByteBuffer.wrap(metadata.name(i)))) {
maybeExpand();
name(this.size, metadata.name(i));
value(this.size, metadata.value(i));
this.size++;
}
}
}
}