正在查看: CallApp v2.226 应用的 DefaultHttpDataSource.java JAVA 源代码文件
本页面展示 JAVA 反编译生成的源代码文件,支持语法高亮显示。 仅供安全研究与技术分析使用,严禁用于任何非法用途。请遵守相关法律法规。
正在查看: CallApp v2.226 应用的 DefaultHttpDataSource.java JAVA 源代码文件
本页面展示 JAVA 反编译生成的源代码文件,支持语法高亮显示。 仅供安全研究与技术分析使用,严禁用于任何非法用途。请遵守相关法律法规。
package io.bidmachine.media3.datasource;
import a1.d0;
import android.net.Uri;
import androidx.annotation.Nullable;
import e2.o;
import io.bidmachine.media3.common.PlaybackException;
import io.bidmachine.media3.common.util.Assertions;
import io.bidmachine.media3.common.util.Log;
import io.bidmachine.media3.common.util.UnstableApi;
import io.bidmachine.media3.common.util.Util;
import io.bidmachine.media3.datasource.HttpDataSource;
import java.io.IOException;
import java.io.InputStream;
import java.io.InterruptedIOException;
import java.io.OutputStream;
import java.lang.reflect.Method;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.NoRouteToHostException;
import java.net.URL;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.zip.GZIPInputStream;
import mj.r;
import nj.b0;
import nj.e2;
import nj.s1;
public class DefaultHttpDataSource extends BaseDataSource implements HttpDataSource {
@UnstableApi
public static final int DEFAULT_CONNECT_TIMEOUT_MILLIS = 8000;
@UnstableApi
public static final int DEFAULT_READ_TIMEOUT_MILLIS = 8000;
private static final int HTTP_STATUS_PERMANENT_REDIRECT = 308;
private static final int HTTP_STATUS_TEMPORARY_REDIRECT = 307;
private static final long MAX_BYTES_TO_DRAIN = 2048;
private static final int MAX_REDIRECTS = 20;
private static final String TAG = "DefaultHttpDataSource";
private final boolean allowCrossProtocolRedirects;
private long bytesRead;
private long bytesToRead;
private final int connectTimeoutMillis;
@Nullable
private HttpURLConnection connection;
@Nullable
private final r contentTypePredicate;
private final boolean crossProtocolRedirectsForceOriginal;
@Nullable
private DataSpec dataSpec;
@Nullable
private final HttpDataSource.RequestProperties defaultRequestProperties;
@Nullable
private InputStream inputStream;
private final boolean keepPostFor302Redirects;
private boolean opened;
private final int readTimeoutMillis;
private final HttpDataSource.RequestProperties requestProperties;
private int responseCode;
@Nullable
private final String userAgent;
public static final class Factory implements HttpDataSource.Factory {
private boolean allowCrossProtocolRedirects;
@Nullable
private r contentTypePredicate;
private boolean crossProtocolRedirectsForceOriginal;
private boolean keepPostFor302Redirects;
@Nullable
private TransferListener transferListener;
@Nullable
private String userAgent;
private final HttpDataSource.RequestProperties defaultRequestProperties = new HttpDataSource.RequestProperties();
private int connectTimeoutMs = 8000;
private int readTimeoutMs = 8000;
@UnstableApi
public Factory setAllowCrossProtocolRedirects(boolean z) {
this.allowCrossProtocolRedirects = z;
return this;
}
@UnstableApi
public Factory setConnectTimeoutMs(int i) {
this.connectTimeoutMs = i;
return this;
}
@UnstableApi
public Factory setContentTypePredicate(@Nullable r rVar) {
this.contentTypePredicate = rVar;
return this;
}
@UnstableApi
public Factory setCrossProtocolRedirectsForceOriginal(boolean z) {
this.crossProtocolRedirectsForceOriginal = z;
return this;
}
@Override
@UnstableApi
public HttpDataSource.Factory setDefaultRequestProperties(Map map) {
return setDefaultRequestProperties((Map<String, String>) map);
}
@UnstableApi
public Factory setKeepPostFor302Redirects(boolean z) {
this.keepPostFor302Redirects = z;
return this;
}
@UnstableApi
public Factory setReadTimeoutMs(int i) {
this.readTimeoutMs = i;
return this;
}
@UnstableApi
public Factory setTransferListener(@Nullable TransferListener transferListener) {
this.transferListener = transferListener;
return this;
}
@UnstableApi
public Factory setUserAgent(@Nullable String str) {
this.userAgent = str;
return this;
}
@Override
@UnstableApi
public Factory setDefaultRequestProperties(Map<String, String> map) {
this.defaultRequestProperties.clearAndSet(map);
return this;
}
@Override
@UnstableApi
public DefaultHttpDataSource createDataSource() {
DefaultHttpDataSource defaultHttpDataSource = new DefaultHttpDataSource(this.userAgent, this.connectTimeoutMs, this.readTimeoutMs, this.allowCrossProtocolRedirects, this.crossProtocolRedirectsForceOriginal, this.defaultRequestProperties, this.contentTypePredicate, this.keepPostFor302Redirects);
TransferListener transferListener = this.transferListener;
if (transferListener != null) {
defaultHttpDataSource.addTransferListener(transferListener);
}
return defaultHttpDataSource;
}
}
public static class a extends b0 {
private final Map<String, List<String>> headers;
public a(Map<String, List<String>> map) {
this.headers = map;
}
public static boolean lambda$entrySet$1(Map.Entry entry) {
return entry.getKey() != null;
}
public static boolean lambda$keySet$0(String str) {
return str != null;
}
public boolean containsKey(@Nullable Object obj) {
return obj != null && super.containsKey(obj);
}
public boolean containsValue(@Nullable Object obj) {
return super.standardContainsValue(obj);
}
public Set<Map.Entry<String, List<String>>> entrySet() {
return e2.b(super.entrySet(), new o(2));
}
public boolean equals(@Nullable Object obj) {
return obj != null && super.standardEquals(obj);
}
public int hashCode() {
return super.standardHashCode();
}
public boolean isEmpty() {
return super.isEmpty() || (super.size() == 1 && super.containsKey((Object) null));
}
public Set<String> keySet() {
return e2.b(super.keySet(), new o(3));
}
public int size() {
return super.size() - (super.containsKey((Object) null) ? 1 : 0);
}
public Map<String, List<String>> delegate() {
return this.headers;
}
@Nullable
public List<String> get(@Nullable Object obj) {
if (obj == null) {
return null;
}
return (List) super.get(obj);
}
}
private void closeConnectionQuietly() {
HttpURLConnection httpURLConnection = this.connection;
if (httpURLConnection != null) {
try {
httpURLConnection.disconnect();
} catch (Exception e) {
Log.e(TAG, "Unexpected error while disconnecting", e);
}
this.connection = null;
}
}
private URL handleRedirect(URL url, @Nullable String str, DataSpec dataSpec) throws HttpDataSource.HttpDataSourceException {
if (str == null) {
throw new HttpDataSource.HttpDataSourceException("Null location redirect", dataSpec, PlaybackException.ERROR_CODE_IO_NETWORK_CONNECTION_FAILED, 1);
}
try {
URL url2 = new URL(url, str);
String protocol = url2.getProtocol();
if (!"https".equals(protocol) && !"http".equals(protocol)) {
throw new HttpDataSource.HttpDataSourceException(d0.C("Unsupported protocol redirect: ", protocol), dataSpec, PlaybackException.ERROR_CODE_IO_NETWORK_CONNECTION_FAILED, 1);
}
if (this.allowCrossProtocolRedirects || protocol.equals(url.getProtocol())) {
return url2;
}
if (this.crossProtocolRedirectsForceOriginal) {
try {
return new URL(url2.toString().replaceFirst(protocol, url.getProtocol()));
} catch (MalformedURLException e) {
throw new HttpDataSource.HttpDataSourceException(e, dataSpec, PlaybackException.ERROR_CODE_IO_NETWORK_CONNECTION_FAILED, 1);
}
}
throw new HttpDataSource.HttpDataSourceException("Disallowed cross-protocol redirect (" + url.getProtocol() + " to " + protocol + ")", dataSpec, PlaybackException.ERROR_CODE_IO_NETWORK_CONNECTION_FAILED, 1);
} catch (MalformedURLException e2) {
throw new HttpDataSource.HttpDataSourceException(e2, dataSpec, PlaybackException.ERROR_CODE_IO_NETWORK_CONNECTION_FAILED, 1);
}
}
private static boolean isCompressed(HttpURLConnection httpURLConnection) {
return "gzip".equalsIgnoreCase(httpURLConnection.getHeaderField("Content-Encoding"));
}
private HttpURLConnection makeConnection(DataSpec dataSpec) throws IOException {
HttpURLConnection makeConnection;
URL url = new URL(dataSpec.uri.toString());
int i = dataSpec.httpMethod;
byte[] bArr = dataSpec.httpBody;
long j = dataSpec.position;
long j2 = dataSpec.length;
int i2 = 1;
boolean isFlagSet = dataSpec.isFlagSet(1);
if (!this.allowCrossProtocolRedirects && !this.crossProtocolRedirectsForceOriginal && !this.keepPostFor302Redirects) {
return makeConnection(url, i, bArr, j, j2, isFlagSet, true, dataSpec.httpRequestHeaders);
}
int i3 = 0;
while (true) {
int i4 = i3 + 1;
if (i3 > 20) {
throw new HttpDataSource.HttpDataSourceException(new NoRouteToHostException(d0.j(i4, "Too many redirects: ")), dataSpec, PlaybackException.ERROR_CODE_IO_NETWORK_CONNECTION_FAILED, 1);
}
makeConnection = makeConnection(url, i, bArr, j, j2, isFlagSet, false, dataSpec.httpRequestHeaders);
int responseCode = makeConnection.getResponseCode();
String headerField = makeConnection.getHeaderField("Location");
if ((i == i2 || i == 3) && (responseCode == 300 || responseCode == 301 || responseCode == 302 || responseCode == 303 || responseCode == 307 || responseCode == 308)) {
makeConnection.disconnect();
url = handleRedirect(url, headerField, dataSpec);
} else {
if (i != 2 || (responseCode != 300 && responseCode != 301 && responseCode != 302 && responseCode != 303)) {
break;
}
makeConnection.disconnect();
if (!this.keepPostFor302Redirects || responseCode != 302) {
bArr = null;
i = 1;
}
url = handleRedirect(url, headerField, dataSpec);
}
i3 = i4;
i2 = 1;
}
return makeConnection;
}
private static void maybeTerminateInputStream(@Nullable HttpURLConnection httpURLConnection, long j) {
if (httpURLConnection == null || Util.SDK_INT > 20) {
return;
}
try {
InputStream inputStream = httpURLConnection.getInputStream();
if (j == -1) {
if (inputStream.read() == -1) {
return;
}
} else if (j <= MAX_BYTES_TO_DRAIN) {
return;
}
String name = inputStream.getClass().getName();
if ("com.android.okhttp.internal.http.HttpTransport$ChunkedInputStream".equals(name) || "com.android.okhttp.internal.http.HttpTransport$FixedLengthInputStream".equals(name)) {
Method declaredMethod = ((Class) Assertions.checkNotNull(inputStream.getClass().getSuperclass())).getDeclaredMethod("unexpectedEndOfInput", null);
declaredMethod.setAccessible(true);
declaredMethod.invoke(inputStream, null);
}
} catch (Exception unused) {
}
}
private int readInternal(byte[] bArr, int i, int i2) throws IOException {
if (i2 == 0) {
return 0;
}
long j = this.bytesToRead;
if (j != -1) {
long j2 = j - this.bytesRead;
if (j2 == 0) {
return -1;
}
i2 = (int) Math.min(i2, j2);
}
int read = ((InputStream) Util.castNonNull(this.inputStream)).read(bArr, i, i2);
if (read == -1) {
return -1;
}
this.bytesRead += read;
bytesTransferred(read);
return read;
}
private void skipFully(long j, DataSpec dataSpec) throws IOException {
if (j == 0) {
return;
}
byte[] bArr = new byte[4096];
while (j > 0) {
int read = ((InputStream) Util.castNonNull(this.inputStream)).read(bArr, 0, (int) Math.min(j, 4096));
if (Thread.currentThread().isInterrupted()) {
throw new HttpDataSource.HttpDataSourceException(new InterruptedIOException(), dataSpec, 2000, 1);
}
if (read == -1) {
throw new HttpDataSource.HttpDataSourceException(dataSpec, 2008, 1);
}
j -= read;
bytesTransferred(read);
}
}
@Override
@UnstableApi
public void clearAllRequestProperties() {
this.requestProperties.clear();
}
@Override
@UnstableApi
public void clearRequestProperty(String str) {
Assertions.checkNotNull(str);
this.requestProperties.remove(str);
}
@Override
@UnstableApi
public void close() throws HttpDataSource.HttpDataSourceException {
try {
InputStream inputStream = this.inputStream;
if (inputStream != null) {
long j = this.bytesToRead;
long j2 = -1;
if (j != -1) {
j2 = j - this.bytesRead;
}
maybeTerminateInputStream(this.connection, j2);
try {
inputStream.close();
} catch (IOException e) {
throw new HttpDataSource.HttpDataSourceException(e, (DataSpec) Util.castNonNull(this.dataSpec), 2000, 3);
}
}
} finally {
this.inputStream = null;
closeConnectionQuietly();
if (this.opened) {
this.opened = false;
transferEnded();
}
}
}
@Override
@UnstableApi
public int getResponseCode() {
int i;
if (this.connection == null || (i = this.responseCode) <= 0) {
return -1;
}
return i;
}
@Override
@UnstableApi
public Map<String, List<String>> getResponseHeaders() {
HttpURLConnection httpURLConnection = this.connection;
return httpURLConnection == null ? s1.g : new a(httpURLConnection.getHeaderFields());
}
@Override
@Nullable
@UnstableApi
public Uri getUri() {
HttpURLConnection httpURLConnection = this.connection;
if (httpURLConnection == null) {
return null;
}
return Uri.parse(httpURLConnection.getURL().toString());
}
@Override
@UnstableApi
public long open(DataSpec dataSpec) throws HttpDataSource.HttpDataSourceException {
byte[] bArr;
this.dataSpec = dataSpec;
long j = 0;
this.bytesRead = 0L;
this.bytesToRead = 0L;
transferInitializing(dataSpec);
try {
HttpURLConnection makeConnection = makeConnection(dataSpec);
this.connection = makeConnection;
this.responseCode = makeConnection.getResponseCode();
String responseMessage = makeConnection.getResponseMessage();
int i = this.responseCode;
if (i < 200 || i > 299) {
Map<String, List<String>> headerFields = makeConnection.getHeaderFields();
if (this.responseCode == 416) {
if (dataSpec.position == HttpUtil.getDocumentSize(makeConnection.getHeaderField("Content-Range"))) {
this.opened = true;
transferStarted(dataSpec);
long j2 = dataSpec.length;
if (j2 != -1) {
return j2;
}
return 0L;
}
}
InputStream errorStream = makeConnection.getErrorStream();
try {
bArr = errorStream != null ? oj.b.b(errorStream) : Util.EMPTY_BYTE_ARRAY;
} catch (IOException unused) {
bArr = Util.EMPTY_BYTE_ARRAY;
}
byte[] bArr2 = bArr;
closeConnectionQuietly();
throw new HttpDataSource.InvalidResponseCodeException(this.responseCode, responseMessage, this.responseCode == 416 ? new DataSourceException(2008) : null, headerFields, dataSpec, bArr2);
}
String contentType = makeConnection.getContentType();
r rVar = this.contentTypePredicate;
if (rVar != null && !rVar.apply(contentType)) {
closeConnectionQuietly();
throw new HttpDataSource.InvalidContentTypeException(contentType, dataSpec);
}
if (this.responseCode == 200) {
long j3 = dataSpec.position;
if (j3 != 0) {
j = j3;
}
}
boolean isCompressed = isCompressed(makeConnection);
if (isCompressed) {
this.bytesToRead = dataSpec.length;
} else {
long j4 = dataSpec.length;
if (j4 != -1) {
this.bytesToRead = j4;
} else {
long contentLength = HttpUtil.getContentLength(makeConnection.getHeaderField("Content-Length"), makeConnection.getHeaderField("Content-Range"));
this.bytesToRead = contentLength != -1 ? contentLength - j : -1L;
}
}
try {
this.inputStream = makeConnection.getInputStream();
if (isCompressed) {
this.inputStream = new GZIPInputStream(this.inputStream);
}
this.opened = true;
transferStarted(dataSpec);
try {
skipFully(j, dataSpec);
return this.bytesToRead;
} catch (IOException e) {
closeConnectionQuietly();
if (e instanceof HttpDataSource.HttpDataSourceException) {
throw ((HttpDataSource.HttpDataSourceException) e);
}
throw new HttpDataSource.HttpDataSourceException(e, dataSpec, 2000, 1);
}
} catch (IOException e2) {
closeConnectionQuietly();
throw new HttpDataSource.HttpDataSourceException(e2, dataSpec, 2000, 1);
}
} catch (IOException e3) {
closeConnectionQuietly();
throw HttpDataSource.HttpDataSourceException.createForIOException(e3, dataSpec, 1);
}
}
public HttpURLConnection openConnection(URL url) throws IOException {
return (HttpURLConnection) url.openConnection();
}
@Override
@UnstableApi
public int read(byte[] bArr, int i, int i2) throws HttpDataSource.HttpDataSourceException {
try {
return readInternal(bArr, i, i2);
} catch (IOException e) {
throw HttpDataSource.HttpDataSourceException.createForIOException(e, (DataSpec) Util.castNonNull(this.dataSpec), 2);
}
}
@Override
@UnstableApi
public void setRequestProperty(String str, String str2) {
Assertions.checkNotNull(str);
Assertions.checkNotNull(str2);
this.requestProperties.set(str, str2);
}
private DefaultHttpDataSource(@Nullable String str, int i, int i2, boolean z, boolean z2, @Nullable HttpDataSource.RequestProperties requestProperties, @Nullable r rVar, boolean z3) {
super(true);
this.userAgent = str;
this.connectTimeoutMillis = i;
this.readTimeoutMillis = i2;
this.allowCrossProtocolRedirects = z;
this.crossProtocolRedirectsForceOriginal = z2;
if (z && z2) {
throw new IllegalArgumentException("crossProtocolRedirectsForceOriginal should not be set if allowCrossProtocolRedirects is true");
}
this.defaultRequestProperties = requestProperties;
this.contentTypePredicate = rVar;
this.requestProperties = new HttpDataSource.RequestProperties();
this.keepPostFor302Redirects = z3;
}
private HttpURLConnection makeConnection(URL url, int i, @Nullable byte[] bArr, long j, long j2, boolean z, boolean z2, Map<String, String> map) throws IOException {
HttpURLConnection openConnection = openConnection(url);
openConnection.setConnectTimeout(this.connectTimeoutMillis);
openConnection.setReadTimeout(this.readTimeoutMillis);
HashMap hashMap = new HashMap();
HttpDataSource.RequestProperties requestProperties = this.defaultRequestProperties;
if (requestProperties != null) {
hashMap.putAll(requestProperties.getSnapshot());
}
hashMap.putAll(this.requestProperties.getSnapshot());
hashMap.putAll(map);
for (Map.Entry entry : hashMap.entrySet()) {
openConnection.setRequestProperty((String) entry.getKey(), (String) entry.getValue());
}
String buildRangeRequestHeader = HttpUtil.buildRangeRequestHeader(j, j2);
if (buildRangeRequestHeader != null) {
openConnection.setRequestProperty("Range", buildRangeRequestHeader);
}
String str = this.userAgent;
if (str != null) {
openConnection.setRequestProperty("User-Agent", str);
}
openConnection.setRequestProperty("Accept-Encoding", z ? "gzip" : "identity");
openConnection.setInstanceFollowRedirects(z2);
openConnection.setDoOutput(bArr != null);
openConnection.setRequestMethod(DataSpec.getStringForHttpMethod(i));
if (bArr != null) {
openConnection.setFixedLengthStreamingMode(bArr.length);
openConnection.connect();
OutputStream outputStream = openConnection.getOutputStream();
outputStream.write(bArr);
outputStream.close();
return openConnection;
}
openConnection.connect();
return openConnection;
}
}