正在查看: Uptodown App Store v6.80 应用的 DefaultHttpDataSource.java JAVA 源代码文件
本页面展示 JAVA 反编译生成的源代码文件,支持语法高亮显示。 仅供安全研究与技术分析使用,严禁用于任何非法用途。请遵守相关法律法规。
正在查看: Uptodown App Store v6.80 应用的 DefaultHttpDataSource.java JAVA 源代码文件
本页面展示 JAVA 反编译生成的源代码文件,支持语法高亮显示。 仅供安全研究与技术分析使用,严禁用于任何非法用途。请遵守相关法律法规。
package com.mbridge.msdk.playercommon.exoplayer2.upstream;
import android.net.Uri;
import android.util.Log;
import com.mbridge.msdk.foundation.download.Command;
import com.mbridge.msdk.playercommon.exoplayer2.upstream.HttpDataSource;
import com.mbridge.msdk.playercommon.exoplayer2.util.Assertions;
import com.mbridge.msdk.playercommon.exoplayer2.util.Predicate;
import com.mbridge.msdk.playercommon.exoplayer2.util.Util;
import java.io.EOFException;
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.NoRouteToHostException;
import java.net.ProtocolException;
import java.net.URL;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicReference;
import java.util.regex.Pattern;
public class DefaultHttpDataSource implements HttpDataSource {
public static final int DEFAULT_CONNECT_TIMEOUT_MILLIS = 8000;
public static final int DEFAULT_READ_TIMEOUT_MILLIS = 8000;
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 bytesSkipped;
private long bytesToRead;
private long bytesToSkip;
private final int connectTimeoutMillis;
private HttpURLConnection connection;
private final Predicate<String> contentTypePredicate;
private DataSpec dataSpec;
private final HttpDataSource.RequestProperties defaultRequestProperties;
private InputStream inputStream;
private final TransferListener<? super DefaultHttpDataSource> listener;
private boolean opened;
private final int readTimeoutMillis;
private final HttpDataSource.RequestProperties requestProperties;
private final String userAgent;
private static final Pattern CONTENT_RANGE_HEADER = Pattern.compile("^bytes (\\d+)-(\\d+)/(\\d+)$");
private static final AtomicReference<byte[]> skipBufferReference = new AtomicReference<>();
public DefaultHttpDataSource(String str, Predicate<String> predicate) {
this(str, predicate, null);
}
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 static long getContentLength(java.net.HttpURLConnection r10) {
throw new UnsupportedOperationException("Method not decompiled: com.mbridge.msdk.playercommon.exoplayer2.upstream.DefaultHttpDataSource.getContentLength(java.net.HttpURLConnection):long");
}
private static URL handleRedirect(URL url, String str) throws IOException {
if (str == null) {
throw new ProtocolException("Null location redirect");
}
URL url2 = new URL(url, str);
String protocol = url2.getProtocol();
if ("https".equals(protocol) || "http".equals(protocol)) {
return url2;
}
throw new ProtocolException("Unsupported protocol redirect: " + protocol);
}
private HttpURLConnection makeConnection(DataSpec dataSpec) throws IOException {
HttpURLConnection makeConnection;
URL url = new URL(dataSpec.uri.toString());
byte[] bArr = dataSpec.postBody;
long j = dataSpec.position;
long j4 = dataSpec.length;
boolean isFlagSet = dataSpec.isFlagSet(1);
if (!this.allowCrossProtocolRedirects) {
return makeConnection(url, bArr, j, j4, isFlagSet, true);
}
int i = 0;
while (true) {
int i4 = i + 1;
if (i > 20) {
throw new NoRouteToHostException("Too many redirects: " + i4);
}
long j5 = j4;
boolean z = isFlagSet;
long j6 = j;
makeConnection = makeConnection(url, bArr, j6, j5, z, false);
j = j6;
j4 = j5;
isFlagSet = z;
int responseCode = makeConnection.getResponseCode();
if (responseCode == 300 || responseCode == 301 || responseCode == 302 || responseCode == 303 || (bArr == null && (responseCode == 307 || responseCode == 308))) {
String headerField = makeConnection.getHeaderField("Location");
makeConnection.disconnect();
url = handleRedirect(url, headerField);
bArr = null;
i = i4;
}
}
return makeConnection;
}
private static void maybeTerminateInputStream(HttpURLConnection httpURLConnection, long j) {
int i = Util.SDK_INT;
if (i == 19 || i == 20) {
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 = inputStream.getClass().getSuperclass().getDeclaredMethod("unexpectedEndOfInput", null);
declaredMethod.setAccessible(true);
declaredMethod.invoke(inputStream, null);
}
} catch (Exception unused) {
}
}
}
private int readInternal(byte[] bArr, int i, int i4) throws IOException {
if (i4 == 0) {
return 0;
}
long j = this.bytesToRead;
if (j != -1) {
long j4 = j - this.bytesRead;
if (j4 == 0) {
return -1;
}
i4 = (int) Math.min(i4, j4);
}
int read = this.inputStream.read(bArr, i, i4);
if (read == -1) {
if (this.bytesToRead == -1) {
return -1;
}
throw new EOFException();
}
this.bytesRead += read;
TransferListener<? super DefaultHttpDataSource> transferListener = this.listener;
if (transferListener != null) {
transferListener.onBytesTransferred(this, read);
}
return read;
}
private void skipInternal() throws IOException {
if (this.bytesSkipped == this.bytesToSkip) {
return;
}
byte[] andSet = skipBufferReference.getAndSet(null);
if (andSet == null) {
andSet = new byte[4096];
}
while (true) {
long j = this.bytesSkipped;
long j4 = this.bytesToSkip;
if (j == j4) {
skipBufferReference.set(andSet);
return;
}
int read = this.inputStream.read(andSet, 0, (int) Math.min(j4 - j, andSet.length));
if (Thread.currentThread().isInterrupted()) {
throw new InterruptedIOException();
}
if (read == -1) {
throw new EOFException();
}
this.bytesSkipped += read;
TransferListener<? super DefaultHttpDataSource> transferListener = this.listener;
if (transferListener != null) {
transferListener.onBytesTransferred(this, read);
}
}
}
protected final long bytesRead() {
return this.bytesRead;
}
protected final long bytesRemaining() {
long j = this.bytesToRead;
return j == -1 ? j : j - this.bytesRead;
}
protected final long bytesSkipped() {
return this.bytesSkipped;
}
@Override
public void clearAllRequestProperties() {
this.requestProperties.clear();
}
@Override
public void clearRequestProperty(String str) {
Assertions.checkNotNull(str);
this.requestProperties.remove(str);
}
@Override
public void close() throws HttpDataSource.HttpDataSourceException {
try {
if (this.inputStream != null) {
maybeTerminateInputStream(this.connection, bytesRemaining());
try {
this.inputStream.close();
} catch (IOException e) {
throw new HttpDataSource.HttpDataSourceException(e, this.dataSpec, 3);
}
}
} finally {
this.inputStream = null;
closeConnectionQuietly();
if (this.opened) {
this.opened = false;
TransferListener<? super DefaultHttpDataSource> transferListener = this.listener;
if (transferListener != null) {
transferListener.onTransferEnd(this);
}
}
}
}
protected final HttpURLConnection getConnection() {
return this.connection;
}
@Override
public Map<String, List<String>> getResponseHeaders() {
HttpURLConnection httpURLConnection = this.connection;
if (httpURLConnection == null) {
return null;
}
return httpURLConnection.getHeaderFields();
}
@Override
public Uri getUri() {
HttpURLConnection httpURLConnection = this.connection;
if (httpURLConnection == null) {
return null;
}
return Uri.parse(httpURLConnection.getURL().toString());
}
@Override
public long open(DataSpec dataSpec) throws HttpDataSource.HttpDataSourceException {
this.dataSpec = dataSpec;
long j = 0;
this.bytesRead = 0L;
this.bytesSkipped = 0L;
try {
HttpURLConnection makeConnection = makeConnection(dataSpec);
this.connection = makeConnection;
try {
int responseCode = makeConnection.getResponseCode();
if (responseCode < 200 || responseCode > 299) {
Map<String, List<String>> headerFields = this.connection.getHeaderFields();
closeConnectionQuietly();
HttpDataSource.InvalidResponseCodeException invalidResponseCodeException = new HttpDataSource.InvalidResponseCodeException(responseCode, headerFields, dataSpec);
if (responseCode != 416) {
throw invalidResponseCodeException;
}
invalidResponseCodeException.initCause(new DataSourceException(0));
throw invalidResponseCodeException;
}
String contentType = this.connection.getContentType();
Predicate<String> predicate = this.contentTypePredicate;
if (predicate != null && !predicate.evaluate(contentType)) {
closeConnectionQuietly();
throw new HttpDataSource.InvalidContentTypeException(contentType, dataSpec);
}
if (responseCode == 200) {
long j4 = dataSpec.position;
if (j4 != 0) {
j = j4;
}
}
this.bytesToSkip = j;
if (dataSpec.isFlagSet(1)) {
this.bytesToRead = dataSpec.length;
} else {
long j5 = dataSpec.length;
if (j5 != -1) {
this.bytesToRead = j5;
} else {
long contentLength = getContentLength(this.connection);
this.bytesToRead = contentLength != -1 ? contentLength - this.bytesToSkip : -1L;
}
}
try {
this.inputStream = this.connection.getInputStream();
this.opened = true;
TransferListener<? super DefaultHttpDataSource> transferListener = this.listener;
if (transferListener != null) {
transferListener.onTransferStart(this, dataSpec);
}
return this.bytesToRead;
} catch (IOException e) {
closeConnectionQuietly();
throw new HttpDataSource.HttpDataSourceException(e, dataSpec, 1);
}
} catch (IOException e4) {
closeConnectionQuietly();
throw new HttpDataSource.HttpDataSourceException("Unable to connect to " + dataSpec.uri.toString(), e4, dataSpec, 1);
}
} catch (IOException e5) {
throw new HttpDataSource.HttpDataSourceException("Unable to connect to " + dataSpec.uri.toString(), e5, dataSpec, 1);
}
}
@Override
public int read(byte[] bArr, int i, int i4) throws HttpDataSource.HttpDataSourceException {
try {
skipInternal();
return readInternal(bArr, i, i4);
} catch (IOException e) {
throw new HttpDataSource.HttpDataSourceException(e, this.dataSpec, 2);
}
}
@Override
public void setRequestProperty(String str, String str2) {
Assertions.checkNotNull(str);
Assertions.checkNotNull(str2);
this.requestProperties.set(str, str2);
}
public DefaultHttpDataSource(String str, Predicate<String> predicate, TransferListener<? super DefaultHttpDataSource> transferListener) {
this(str, predicate, transferListener, 8000, 8000);
}
public DefaultHttpDataSource(String str, Predicate<String> predicate, TransferListener<? super DefaultHttpDataSource> transferListener, int i, int i4) {
this(str, predicate, transferListener, i, i4, false, null);
}
public DefaultHttpDataSource(String str, Predicate<String> predicate, TransferListener<? super DefaultHttpDataSource> transferListener, int i, int i4, boolean z, HttpDataSource.RequestProperties requestProperties) {
this.userAgent = Assertions.checkNotEmpty(str);
this.contentTypePredicate = predicate;
this.listener = transferListener;
this.requestProperties = new HttpDataSource.RequestProperties();
this.connectTimeoutMillis = i;
this.readTimeoutMillis = i4;
this.allowCrossProtocolRedirects = z;
this.defaultRequestProperties = requestProperties;
}
private HttpURLConnection makeConnection(URL url, byte[] bArr, long j, long j4, boolean z, boolean z3) throws IOException {
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setConnectTimeout(this.connectTimeoutMillis);
httpURLConnection.setReadTimeout(this.readTimeoutMillis);
HttpDataSource.RequestProperties requestProperties = this.defaultRequestProperties;
if (requestProperties != null) {
for (Map.Entry<String, String> entry : requestProperties.getSnapshot().entrySet()) {
httpURLConnection.setRequestProperty(entry.getKey(), entry.getValue());
}
}
for (Map.Entry<String, String> entry2 : this.requestProperties.getSnapshot().entrySet()) {
httpURLConnection.setRequestProperty(entry2.getKey(), entry2.getValue());
}
if (j != 0 || j4 != -1) {
String str = "bytes=" + j + "-";
if (j4 != -1) {
str = str + ((j + j4) - 1);
}
httpURLConnection.setRequestProperty(Command.HTTP_HEADER_RANGE, str);
}
httpURLConnection.setRequestProperty(Command.HTTP_HEADER_USER_AGENT, this.userAgent);
if (!z) {
httpURLConnection.setRequestProperty("Accept-Encoding", "identity");
}
httpURLConnection.setInstanceFollowRedirects(z3);
httpURLConnection.setDoOutput(bArr != null);
if (bArr != null) {
httpURLConnection.setRequestMethod("POST");
if (bArr.length != 0) {
httpURLConnection.setFixedLengthStreamingMode(bArr.length);
httpURLConnection.connect();
OutputStream outputStream = httpURLConnection.getOutputStream();
outputStream.write(bArr);
outputStream.close();
return httpURLConnection;
}
}
httpURLConnection.connect();
return httpURLConnection;
}
}